为什么一般hashtable的桶数会取一个素数

http://blog.sina.com.cn/s/blog_8e9c63c70101g3ep.html



我个人认为更普遍意义的理解,如果不取素数的话是会有一定危险的,危险出现在当假设所选非素数m=x*y,如果需要hashkey正好跟这个约数x存在关系就惨了,最坏情况假设都为x的倍数,那么可以想象hash的结果为:1~y,而不是1~m。但是如果选桶的大小为素数是不会有这个问题。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是实现HashTable * create(int size)的代码: ```c++ #include <iostream> #include <cmath> #include <vector> using namespace std; struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; class HashTable { private: vector<ListNode*> table; int size; public: HashTable(int n) { size = nextPrime(n); table.resize(size, new ListNode(0)); } int hash(int key) { return key % size; } void insert(int key) { int index = hash(key); ListNode* node = new ListNode(key); node->next = table[index]->next; table[index]->next = node; } bool search(int key) { int index = hash(key); ListNode* node = table[index]->next; while (node) { if (node->val == key) { return true; } node = node->next; } return false; } void remove(int key) { int index = hash(key); ListNode* prev = table[index]; ListNode* curr = table[index]->next; while (curr) { if (curr->val == key) { prev->next = curr->next; delete curr; break; } prev = curr; curr = curr->next; } } ~HashTable() { for (int i = 0; i < size; i++) { ListNode* node = table[i]; while (node) { ListNode* temp = node; node = node->next; delete temp; } } } }; int nextPrime(int n) { while (true) { bool flag = true; for (int i = 2; i <= sqrt(n); i++) { if (n % i == 0) { flag = false; break; } } if (flag) { return n; } n++; } } HashTable* create(int size) { return new HashTable(size); } ``` 解释: 1. HashTable类定义了散列表的相关操作,包括插入、查找和删除元素等等。 2. hash函用于计算键在散列表的下标。 3. insert函将元素插入到对应的槽的链表。 4. search函散列表查找指定的键。 5. remove函散列表删除指定的键。 6. nextPrime函用于计算不小于n的下一个素数。 7. create函创建一个不少于size素数个空散列表,并返回散列表指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值