hash表简单实现

查找算法大总结: http://www.cnblogs.com/maybe2030/p/4715035.html#_label6

常用的hash函数: http://blog.csdn.net/mycomputerxiaomei/article/details/7641221

什么是哈希表(Hash)?

  我们使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素"分类",然后将这个元素存储在相应"类"所对应的地方。但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了"冲突",换句话说,就是把不同的元素分在了相同的"类"之中。后面我们将看到一种解决"冲突"的简便做法。

  总的来说,"直接定址"与"解决冲突"是哈希表的两大特点。

  什么是哈希函数?

  哈希函数的规则是:通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则以后查找的时间复杂度越小,空间复杂度越高。

  算法思想:哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。

  算法流程:

  1)用给定的哈希函数构造哈希表;

  2)根据选择的冲突处理方法解决地址冲突;

    常见的解决冲突的方法:拉链法和线性探测法。详细的介绍可以参见:浅谈算法和数据结构: 十一 哈希表

  3)在哈希表的基础上执行哈希查找。

  哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);如果没有时间限制,那么我们可以使用无序数组并进行顺序查找,这样只需要很少的内存。哈希表使用了适度的时间和空间来在这两个极端之间找到了平衡。只需要调整哈希函数算法即可在时间和空间上做出取舍。

实现:

定义hash:

 1 typedef struct node
 2 {
 3     int value;
 4     struct node *next;
 5 }NODE;
 6
 7 typedef struct hash
 8 {
 9     int size;
10     NODE **list;
11 }HASH;

初始化hash:

 1 HASH *HashInit(int size)
 2 {
 3     if (size <= 0)
 4         return NULL;
 5     HASH *hash = (HASH*)malloc(sizeof(HASH));
 6     if (NULL == hash)
 7         return NULL;
 8     hash->size = size;
 9     hash->list = (NODE**)malloc(sizeof(NODE*) * hash->size);
10     if (NULL == hash->list)
11     {
12         free(hash);
13         hash = NULL;
14         return NULL;
15     }
16     int i;
17     for (i = 0; i < size; i++)
18     {
19         hash->list[i] = (NODE*)malloc(sizeof(NODE));
20         hash->list[i]->next = NULL;
21     }
22     return hash;
23 }

hash查找:

NODE *HashFind(HASH *hash, int key)
{
    NODE *list = hash->list[HashFun(key, hash->size)];
    NODE *node = list->next;
    for (;NULL != node && node->value != key; node = node->next);
    return node;
}

hash插入:

void HashInstert(HASH* hash, int key)
{
    if (NULL != HashFind(hash, key))
        return;
    NODE *node = (NODE*)malloc(sizeof(NODE));
    if (NULL == node)
        return;
    NODE *list = hash->list[HashFun(key, hash->size)];
    node->value = key;
    node->next = list->next;
    list->next = node;
}
时间: 2024-10-25 14:01:11

hash表简单实现的相关文章

数据结构与算法-hash表

前言 哈希表是一种存放键-值对的数据结构,其中值用来存放我们真正需要的数据,键的主要目的就是为了找到值.哈希表理想情况下,只需要一次hash计算即可找到值数据,但通常情况下我们不需要耗费巨大的额外空间来追求这丝毫的查找速度(要追求低hash冲突率,必然要扩大hash表),我们更希望的是让空间和时间达到某种平衡,这可以通过调节hash函数来解决(装填因子). 装填因子=表中的记录数/哈希表的长度,如果装填因子越小,表明表中还有很多的空单元,则发生冲突的可能性越小:而装填因子越大,则发生冲突的可能性

算法学习之查找(顺序、二分法、排序二叉树以及 Hash 表)

[摘要]查找--用关键字标识一个数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素.在计算机中进行查找的方法是根据表中的记录的组织结构确定的.查找功能数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. 1. 顺序查找 设想有一个1M的数据,我们如何在里面找到我们想要的那个数据.此时数据本身没有特征,所以我们需要的那个数据可能出现在数组

一步一步写算法(之hash表)

[ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链表使用十分方便,可是数据查找十分麻烦:二叉树中的数据严格有序,可是这是以多一个指针作为代价的结果.hash表既满足了数据的查找方便,同一时候不占用太多的内容空间,使用也十分方便. 打个比方来说,全部的数据就好像许很多多的书本.假设这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显得非

海量路由表可以使用HASH表存储吗-HASH查找和TRIE树查找

千万别!很多人这样说,也包括我.Linux内核早就把HASH路由表去掉了,现在就只剩下TRIE了,不过我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix hash 和tire其实是可以统一在一起的.具有相同hash值的多个项具有一个共同的特征,这个特征怎么提取呢?无疑这就是hash函数的工作.而trie树 (或者radix树,管它呢)的一棵子树也有共同的特征,这个特征怎么提取呢?无疑这就是该子树根节点的父节点指示的某些bits在这棵子树的每一个节点 都具有相同的

十一、从头到尾彻底解析Hash 表算法

在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  出处:http://blog.csdn.net/v_JULY_v.  说明:本文分为三部分内容,    第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash表算法.----------------------------------

Hash表算法

出处:http://blog.csdn.net/v_JULY_v 第一部分:Top K 算法详解问题描述百度面试题:    搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.    假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个.一个查询串的重复度越高,说明查询它的用户越多,也就是越热门.),请你统计最热门的10个查询串,要求使用的内存不能超过1G. 必备知识:    什么是哈希表?    哈希

HASH表原理(装)

HASH表原理大家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找.而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的.    具体如何做呢?大家是否有注意到前面说的话:"数组可以通过下标直接定位到相应的空间",对就是这句,哈希表的做法其实很简单,就是把Key通过一个固定 的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下

从头到尾彻底解析Hash 表算法

在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  出处:http://blog.csdn.net/v_JULY_v.  说明:本文分为三部分内容,    第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash表算法.----------------------------------

hash表学习笔记

一.hash表的基本概念和优缺点比较 hash表又称哈希表 ,是一种数据结构,与链表.二叉树有很大区别. 1.hash表优缺点 优点:能够在常数级的时间复杂度上进行查找,并且插入数据和删除数据简单.(Hash未满的时候速度很快) 缺点:不支持排序,一般比用线性表存储需要更多时间,并且记录的关键字不能重复 2.与链表比较 链表:查询上表中的数据从头开始遍历,直到查到或者查找失败. hash:根据存储数据特定关键字,然后根据关键字直接查询想要得到数据. hash存储位置通常称作Hash地址. Has