线性探测再散列和平方探测再散列(二次探测再散列)算法

用于解决哈希冲突的两种算法
线性探测再散列
平方探测再散列(二次探测再散列)

在实际项目中,php的数组是用hashtable来实现的,如果冲突了,是用链表进行实现的。
在java中,hashmap,如果冲突了,冲突key小于8个是用链表实现的,如果大于8个,就用红黑树进行实现的。

参考这个blog,写的很好。
http://blog.csdn.net/qq_27093465/article/details/52348366

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。 首先,我们需要确定哈希表的大小,为了方便,我们可以选择一个大于等于 42 的质数,比如 47。然后,我们需要确定哈希函数,可以选择将姓名的拼音转化为一个整数,然后对哈希表的大小取模得到其在哈希表中的位置。具体的哈希函数可以自行设计。 接下来,我们需要解决冲突的问题。我们采用线性探测散列法,即当发生冲突时,我们顺序查找哈希表中的下一个位置,直到找到一个空的位置为止。如果到达了哈希表的末尾,则从头开始继续查找。 为了保证平均查找长度的上限为 2,我们需要控制哈希表的填装因子,即哈希表中元素的数量与哈希表大小的比值。一般来说,填装因子应该小于等于 0.5,这样可以保证哈希表的性能。 下面是一个简单的 C 语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 47 // 哈希表大小 #define MAX_NAME_LEN 20 // 最大姓名长度 #define MAX_PROBE_LEN 2 // 最大查找长度 typedef struct { char name[MAX_NAME_LEN]; } Person; typedef struct { Person* data[SIZE]; } HashTable; int hash(char* name) { // 哈希函数 int sum = 0; for (int i = 0; i < strlen(name); i++) { sum += name[i]; } return sum % SIZE; } int probe(int pos, int i) { // 探测函数 return (pos + i) % SIZE; } void insert(HashTable* ht, Person* p) { int pos = hash(p->name); int i = 0; while (ht->data[pos] != NULL) { i++; if (i > MAX_PROBE_LEN) { printf("Error: Hash table is full!\n"); exit(1); } pos = probe(pos, i); } ht->data[pos] = p; } Person* find(HashTable* ht, char* name) { int pos = hash(name); int i = 0; while (ht->data[pos] != NULL && strcmp(ht->data[pos]->name, name) != 0) { i++; if (i > MAX_PROBE_LEN) { printf("Error: Person not found!\n"); exit(1); } pos = probe(pos, i); } return ht->data[pos]; } int main() { // 初始化哈希表 HashTable ht; for (int i = 0; i < SIZE; i++) { ht.data[i] = NULL; } // 插入数据 Person p1 = {"zhangsan"}; insert(&ht, &p1); Person p2 = {"lisi"}; insert(&ht, &p2); Person p3 = {"wangwu"}; insert(&ht, &p3); // 查找数据 Person* result = find(&ht, "lisi"); printf("%s\n", result->name); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值