作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是否有一种算法/方法可以让我在不重建数据/重新散列的情况下增加桶的数量。
实践中的问题:假设您有一群用户,这些用户由字符串“用户名”标识。然后将这些“用户名”散列到存储桶列表中。
This is done by something like:
String username = "user";
int index = username.hash();
int bucketIndex = index % bucketlist.size();
所以在这个方案中,如果我想增加“桶”的数量,那么还需要移动桶中的数据。以便它与用不同数字取模得到的新桶索引相匹配。
这实际上只是一个映射。在哪里可以找到属于给定用户的存储桶。
可能的愚蠢解决方案:同时具有旧桶大小和新桶大小。然后尝试查看两个桶。然后慢慢移动所有用户,使其通过使用新的 bucketlist.size() 匹配。这不需要完全停止,同时散列和移动。
需要什么:真正不好的是所有用户的移动。在许多桶中寻找正确的桶也不是理想的选择。
重点是能够仅通过使用算法来查明要使用列表中的哪个桶。
并且不可能将存储桶列表的大小作为用户名的一部分。
如果大致相同,则不需要像此处那样进行散列处理。
不知道有没有什么合理的答案...
最佳答案
有什么方法可以将哈希集的大小预先设置为适合您的数据的大小 - 从而消除或几乎消除重新哈希的需要?此外,即使您有一些重叠,只要冲突没有变得太深,使用每个节点的链表散列或类似的方法也不会造成太大的伤害。
关于algorithm - 哈希方法允许增加桶的数量而不会弄乱以前的数据映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5864880/
我是一名优秀的程序员,十分优秀!