哈希表(散列)HashTable实现
近期刷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实现的更多相关文章
- JavaScript 哈希表(散列表)应用
查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...
- JavaScript 哈希表(散列表)实现和应用
查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...
- js 实现数据结构 -- 散列(HashTable)
原文: 在Javascript 中学习数据结构与算法. 概念: HashTable 类, 也叫 HashMap 类,是 Dictionary 类的一种散列表实现方式. 散列算法的作用是尽可能快地在数据 ...
- [转]net中哈希表的使用 Hashtable
本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 ...
- Java 哈希表(google 公司的上机题)
1 哈希表(散列)-Google 上机题 1) 看一个实际需求,google 公司的一个上机题: 2) 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该 ...
- 哈希表 HashTable(又名散列表)
简介 其实通过标题上哈希表的英文名HashTable,我们就可以看出这是一个组合的数据结构Hash+Table. Hash是什么?它是一个函数,作用可以通过一个公式来表示: index = HashF ...
- C# 哈希表HashTable的简单使用
本人C#程序菜鸟级别的存在,写博客一方面是为了知识的共享,另一方面也是为了督促自己:大神,可以忽略这篇文文的.废话到此...... 哈希表是可以直接进行访问的数据结构,在形式上是类似字典的.不同的是, ...
- java资料——哈希表(散列表)(转)
哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. ...
- [PHP] PHP数组的实现哈希表(HashTable)结构
PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组.1.数据结构:保存哈希表容器,保存数据的容器2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中, ...
- 查找->动态查找表->哈希表
文字描述 哈希表定义 在前面讨论的各种查找算法中,都是建立在“比较”的基础上.记录的关键字和记录在结构中的相对位置不存在确定的关系,查找的效率依赖于查找过程中所进行的比较次数.而理想的情况是希望不经过 ...
随机推荐
- 英语学习笔记---01---新概念第一册---Lesson 1 Excuse me!
Lesson 1 Excuse me! [词汇] excuse [iks5kju:z] v. 原谅 劳驾.借光 me ...
- 蓝桥杯-算法训练--ALGO-4 结点选择
本人是一个刚刚接触C++不久的傻学生~记录一些自己的学习过程.大神路过可以批评指正~ 刚学动态规划,水平还很渣,一下子不知道从何下手,借鉴了一下这位大哥的文章 http://www.cnblogs.c ...
- XMLHttpRequest2 异步 ajax
XMLHttpRequest1只是对已经存在的xhr对象细节进行规范定义, XMLHttpRequest2升级了该对象. FormData 类型可以用在xhr传输的时候,把表单序列化或者将数据以表 ...
- String类型
String字符串的length属性返回的是该字符串里面16位字符的数量,如果字符串包含double-byte的字符,那么返回的数量可能不对 字符串一旦创建就修改不了 var lang = “Ja ...
- Velocity(6)——velocity遍历josn格式的字符串
使用velocity脚本语言遍历josn格式的字符串 1.由于数据库会存储一些json格式的字符,为方便以后使用筛选 如果这些数据我们查出来直接遍历使用velocity是根本行不通的,例如这样的话:j ...
- Unity学习资料
前段时间刚简单接触下Spring.net,刚会简单注入,最近接手一项目确是用的Unity,网上找了一些很好的教程资料 算是入门了,高手已经写的很好了,我就转个链接吧: Unity V3 初步使用 —— ...
- 【S】SQL SERVER检查临时表占用空间情况
--检查已标记为需要删除的临时表select * from T_BAS_TEMPORARYTABLENAME; --所有系统创建的临时表及视图SELECT * FROM sys.tables WHER ...
- db2中left()函数和right()函数对应oracle中的substr()函数
DB2 LEFT.RIGHT函数 语法:LEFT(ARG,LENGTH).RIGHT(ARG,LENGTH) LEFT.RIGHT函数返回ARG最左边.右边的LENGTH个字符串,ARG可以是CHA ...
- linux服务器上Apache配置多域名
一, 打开httpd.conf 二 找到如下三个位置配置如下 DocumentRoot "/data" #以下这个配置是紧挨着的,有两个 <Directory "/ ...
- socket.io 入门篇(二)
本文原文地址:https://www.limitcode.com/detail/5922f1ccb1d4fe074099d9cd.html 前言 上篇我们介绍了 socket.io 基本使用方法,本篇 ...