【问题标题】:What's the quickest way to lookup numbers?查找号码的最快方法是什么?
【发布时间】:2013-10-03 00:15:49
【问题描述】:

我正在存储数字(在 1 到小于 100,000 的范围内),然后以数字作为参数进行调用,并且必须将其用作查找中的键。过去,当获取短 char* 字符串作为查找键时,我使用了 trie 实现。我想知道我是否也应该使用一个来表示是否有一些更快的方法来调查/考虑/调查?

【问题讨论】:

    标签: performance algorithm data-structures integer big-o


    【解决方案1】:

    这真的取决于你想要做什么。

    如果您有很多内存,您可以构建一个包含 100,000 个元素的数组,并在查看表格时使用该数字作为索引。这可能是最快的方法(查找都是 O(1),常数因子极低),尽管它不是最节省内存的方法。如果内存不足,标准哈希表将是一个很好的折衷方案;您将获得所有操作的预期 O(1) 运行时间。

    如果您需要能够执行“哪个数字最接近 x?”形式的查询,那么您可能需要使用包含整数的平衡二叉搜索树。这使您可以在 O(log n) 时间内进行后继和前任搜索和查找。如果您有兴趣尝试更复杂的数据结构,可以使用van Emde Boas tree,它可以在 O(log log U) 时间内进行插入、删除、查找、前任和后继搜索,其中 U 是最大可能值。

    希望这会有所帮助!

    【讨论】:

    • 哦,直接排列数组不是一个坏主意!我其实知道 100000 是一个合理的上限
    • 您必须考虑到,如果多个对象有一个公共密钥,那么冲突解决的成本可能会非常大。
    • 值得注意的是,如果您的元素在 100,000 个元素中相当稀疏,则缓存效率不是很高。将数字用作哈希并对其进行修改会增加查找操作的数量,但如果它适合较低级别的缓存中的所有内容,您仍然可能会获得很大的加速。当然,如果你只是存储一个指向其他结构的指针,一个 100k 指针数组只有 800kb。
    • 与大小为 100,000 的数组相比,位图会更好,如果数据相当密集,位图可能比哈希图更节省空间。
    【解决方案2】:

    我建议为此使用哈希表。每个值都将放置在一个唯一的存储桶中,您可以使用您的密钥引用该存储桶。如果您的数据可以以这种方式组织,这将是最快的查找。

    【讨论】:

    • 问题是哈希的成本是不小的,即使我使用像 FNV 这样的超快速哈希,而通常使用短字符串或知道我的键的属性(它们是小数字)我可以利用少量跳转的小尝试来避免缓存未命中
    • 哈希表版本之一是直接寻址表,其中“哈希”成本确实微不足道。它可能工作正常,除非多个对象具有相同键的可能性很高。
    • 值的关键是唯一的,直接寻址表与上述答案相同,是的,我同意这是最快的方式
    猜你喜欢
    • 2018-04-24
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多