用于存储由唯一的 8 位十六进制标识的对象的数据结构,用于快速插入和查找
Data structure to store objects identified by unique 8digit hexadecimals for fast insertion and lookup
我有一堆具有唯一 8 位十六进制标识符 ex[fd4786ac] 的对象,我需要快速构建和查找它们。删除不是优先事项。这些十六进制值当前存储为字符串。
考虑了 trie(或 trie 的某些变体)、跳跃列表和散列的某些变体 table。在 AVL 树上使用跳过列表会更好,因为这些字符串很可能是连续的但不能保证并且树会经常重新平衡。如果其他数据结构更适合我的需要,我对它们持开放态度。
您的 8 位十六进制标识符表示一个 4 字节(32 位)整数,因此您可以将其用作具有 2^32 个条目的(相当大的)数组的索引。
如果数组包含指针,这将花费 64GB。
很可能太多了,无法将其保存在 RAM 中。
因此,如果元素数量低于 2^32 个数量级,请使用 Hash-Map 或排序列表(访问 O(logn) )。
一个不错的选择是将您的密钥转换为 32 位整数,然后使用散列 table。
如果您只想为此用例编写自己的代码,那么:
- 不要一直散列键或存储散列值,而是使用双射散列函数并使用散列而不是键。
- 由于您的密钥非常小,您可能应该使用开放式寻址——它会节省 space 并且速度会更快一些。维基百科会给你很多探测方案的选择。我目前喜欢罗宾汉哈希:https://www.sebastiansylvan.com/post/robin-hood-hashing-should-be-your-default-hash-table-implementation/
我有一堆具有唯一 8 位十六进制标识符 ex[fd4786ac] 的对象,我需要快速构建和查找它们。删除不是优先事项。这些十六进制值当前存储为字符串。
考虑了 trie(或 trie 的某些变体)、跳跃列表和散列的某些变体 table。在 AVL 树上使用跳过列表会更好,因为这些字符串很可能是连续的但不能保证并且树会经常重新平衡。如果其他数据结构更适合我的需要,我对它们持开放态度。
您的 8 位十六进制标识符表示一个 4 字节(32 位)整数,因此您可以将其用作具有 2^32 个条目的(相当大的)数组的索引。 如果数组包含指针,这将花费 64GB。
很可能太多了,无法将其保存在 RAM 中。
因此,如果元素数量低于 2^32 个数量级,请使用 Hash-Map 或排序列表(访问 O(logn) )。
一个不错的选择是将您的密钥转换为 32 位整数,然后使用散列 table。
如果您只想为此用例编写自己的代码,那么:
- 不要一直散列键或存储散列值,而是使用双射散列函数并使用散列而不是键。
- 由于您的密钥非常小,您可能应该使用开放式寻址——它会节省 space 并且速度会更快一些。维基百科会给你很多探测方案的选择。我目前喜欢罗宾汉哈希:https://www.sebastiansylvan.com/post/robin-hood-hashing-should-be-your-default-hash-table-implementation/