哈希表示例

哈希表的意义在于高效查找。对于查找来说,如果数据量特别大,二分查找和哈希表算法十分有用了。二分查找前面已经讲过,现来讲讲哈希表算法。
就像输入数据数组下标返回数组元素一样,这样的查找方式是最高效的了,哈希表就是这样一种数据结构。
假设现在有10个元素的数组,通过每一个元素可以确定它存在在哈希表中的哪一个位置(哈希表可以理解为一个特殊数组,它的数据成员也有下标),当下次要查找该元素时候,就可以通过该位置拿到该数值元素,这便是哈希表的核心思想。
如何通过一个数据元素确定其在哈希表中的位置,一般我们可以通过该元素取模于元素个数,这样一来我们只要分配一个跟元素个数一样大的哈希表就可以来存放这些数组元素了。但是,这样会数据重叠的情况发生。例如下面例子,
数组a的数据成员为:

int a[3] = {2, 3, 6};

对于2来说,它放在hash[2 % 3],即hash[2]处,但是对于3和6来讲,它们放在哈希表的hash[3 % 3] 和hash[6 % 3],即hash[0]处,那么就会出现后存到hash[0]的’6’覆盖掉先存到hash[0]的3了。因此哈希表的数据成员不能这样单纯的存放,解决办法是采用链表。
哈希表的数据成员是链表头,即是链表变量(注意,不是链表指针),每次数据都是追加到对应的哈希表位置的链表头指向的链表中。这样,一来不会产生数据覆盖,二来对于查找操作效率也大大提高。
示例代码如下:
为了方便测试,先定义并实现两个函数,分别是用于产生随机数存放到数组、遍历数数所在数组:

void rand_array(void)
{
    for (i = 0; i < MAX; i++)
        a[i] = rand() % 100;
}

void show_array(const char *str)
{
    printf("%s", str);
    for (i = 0; i < MAX; i++)
        printf("%d ", a[i]);
    pr
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值