近期刷Leetcode发现凡是找字符串中反复字符或者数组中找反复数据的时候就不知道从何下手了。

  所以决定学习一下哈希表解题。哈希表的原理主要是解决分类问题,hash表是介于链表和二叉树之间的一种中间结构。

链表使用十分方便,可是数据查找十分麻烦;二叉树中的数据严格有序,可是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同一时候不占用太多的内容空间。使用也十分方便。

  定义hash数据结构,我採用的解决冲突的方法是分离链接法。

  

//单链表结构
typedef struct listnode* position;
typedef struct listnode* list;
struct listnode{
ElementType data;
position next;
};
//hash表结构
typedef struct hashtbl* hashtable;
struct hashtbl {
int tablesize;
list *thelists;
};

哈希散列函数index = key%tablesize

index HashFunc(const ElementType key,int tablesize)
{
//unsigned int hashval = 0;
//while(*key != '\0')
//hashval = (hashval << 5) + *key++;
//return hashval % tablesize;
return key % tablesize;
}

创建hash表,并初始化

hashtable InitializeHashTable(int tablesize)
{
hashtable H;
H = (hashtable)malloc(sizeof(hashtable));
if(NULL == H) return NULL; H->tablesize = tablesize; H->thelists = (list*)malloc(sizeof(list) * H->tablesize);
int i = 0;
for(i=0;i<H->tablesize;i++)//链表是有表头的单链表
{
H->thelists[i] = (list)malloc(sizeof(struct listnode));
H->thelists[i]->next = NULL;
}
return H;
}

删除hash表

void DeleteHashTable(hashtable H)
{
position P,tem;
int i = 0;
for(i=0;i<H->tablesize;i++)
{
P = H->thelists[i]->next;
while(P != NULL)
{
tem = P;
free(tem);
P=P->next;
}
}
free(H->thelists);
free(H);
}

往hash表中插入新元素

position Find(ElementType key,hashtable H)
{
position P;
list L;
L = H->thelists[ HashFunc( key, H->tablesize) ];
P = L->next;
while(P != NULL && P->data != key)
P = P->next; return P;
} void Insert(ElementType key,hashtable H)
{
position pos,newnode;
list L;
pos = Find(key,H);
if(pos == NULL)
{
newnode = (position)malloc(sizeof(position));
L = H->thelists[ HashFunc( key, H->tablesize) ];
newnode->data = key;
newnode->next = L->next;
L->next = newnode;
}
}

打印hash表中全部的元素

void PrintHashTable(hashtable H)
{
position P;
int i = 0;
for(i=0;i<H->tablesize;i++)
{
P = H->thelists[i]->next;
printf("H->thelists[%d] = ",i);
while(P != NULL)
{
printf(" %d",P->data);
P=P->next;
}
printf("\n");
}
}

測试main函数

int main()
{
int num[10] = {3,45,5,64,7,9,8,3,75,75};
hashtable H;
H = InitializeHashTable(10);
int i = 0;
for(i=0;i<10;i++)
{
Insert(num[i],H);
}
PrintHashTable(H);
DeleteHashTable(H);
}

头文件

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h> typedef int ElementType;
typedef unsigned int index;

測试结果。能够看到图片中散列后在hash表中一样位置的都保存下来了,形成一个链表如数据75 5 45;可是同样的数据仅仅保存一份,比方3和3,75和75



哈希表(散列)HashTable实现的更多相关文章

  1. JavaScript 哈希表(散列表)应用

    查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...

  2. JavaScript 哈希表(散列表)实现和应用

    查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...

  3. js 实现数据结构 -- 散列(HashTable)

    原文: 在Javascript 中学习数据结构与算法. 概念: HashTable 类, 也叫 HashMap 类,是 Dictionary 类的一种散列表实现方式. 散列算法的作用是尽可能快地在数据 ...

  4. [转]net中哈希表的使用 Hashtable

    本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 ...

  5. Java 哈希表(google 公司的上机题)

    1 哈希表(散列)-Google 上机题 1) 看一个实际需求,google 公司的一个上机题: 2) 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该 ...

  6. 哈希表 HashTable(又名散列表)

    简介 其实通过标题上哈希表的英文名HashTable,我们就可以看出这是一个组合的数据结构Hash+Table. Hash是什么?它是一个函数,作用可以通过一个公式来表示: index = HashF ...

  7. C# 哈希表HashTable的简单使用

    本人C#程序菜鸟级别的存在,写博客一方面是为了知识的共享,另一方面也是为了督促自己:大神,可以忽略这篇文文的.废话到此...... 哈希表是可以直接进行访问的数据结构,在形式上是类似字典的.不同的是, ...

  8. java资料——哈希表(散列表)(转)

    哈希表       散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. ...

  9. [PHP] PHP数组的实现哈希表(HashTable)结构

    PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组.1.数据结构:保存哈希表容器,保存数据的容器2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中, ...

  10. 查找->动态查找表->哈希表

    文字描述 哈希表定义 在前面讨论的各种查找算法中,都是建立在“比较”的基础上.记录的关键字和记录在结构中的相对位置不存在确定的关系,查找的效率依赖于查找过程中所进行的比较次数.而理想的情况是希望不经过 ...

随机推荐

  1. HTML5网页音乐播放器

    1功能介绍 HTML5中推出了音视频标签,可以让我们不借助其他插件就可以直接播放音视频.下面我们就利用H5的audio标签及其相关属性和方法来制作一个简单的音乐播放器.主要包括以下几个功能: 1.播放 ...

  2. Android开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  3. Java多线程学习之wait、notify/notifyAll 详解

    1.wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写. 2.wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关 ...

  4. javascript第六章--BOM

    ① window对象 ② location对象 ③ navigator对象 ④ screen对象 ⑤ history对象

  5. LKD: Chapter 7 Interrupts and Interrupt Handlers

    Recently I realized my English is still far from good. So in order to improve my English, I must not ...

  6. 智能合约开发环境搭建及Hello World合约

    如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...

  7. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

  8. .Net Core 2.0 EntityFrameworkCore CodeFirst入门教程

    最近难得有时间闲下来,研究了一下.net core 2.0,总的来说,目前除了一些第三方的库不支持外,基本上可以满足我们的项目需求了! 我们就以一个网站开发为例,搭建一个简单的三层架构,先熟悉一下.n ...

  9. Numpy入门 - 数组聚合运算

    本节主要讲解numpy的几个常用的聚合运算,包括求和sum.求平均mean和求方差var. 一.求和sum import numpy as np arr = np.array([[1, 2, 3], ...

  10. Ipython自动导入Numpy,pandas等模块

    一.引言 最近在学习numpy,书上要求安装一个Ipythpn,可以自动导入Numpy,pandas等数据分析的模块,可是当我安装后,并不能自动导入numpy模块,还需要自己import.我就去查了一 ...