【发布时间】:2010-11-07 06:17:32
【问题描述】:
我正在寻找一种算法或数据结构,它是如此未知但非常有用,以至于您认为这是计算机科学或编程社区的可怕疏忽。如果只有我们都可以学到这一点,那么将来的许多程序都会有很多好处。
我能想到的最好的方法是插值搜索,只有极少数程序员知道,而每个人都知道二分搜索。我认为快速搜索有序列表是一种非常有用且基本的算法,这一点毫无疑问。
两者在实现上几乎相同 - 所以这不是问题。
它对均匀分布的数据执行 O(log(log(n))),而二进制搜索 O(log(n))。这意味着搜索 40 亿个数字只需要 5 次探测,而不是 32 次,这要好得多!
在不完全统一的数据上,它在大多数情况下仍然表现得非常好。只有当数据真正倾斜时,它才会像二进制搜索一样糟糕或更糟。当数据高度倾斜时,这是 O(n) 最坏的情况,但这在大多数现实世界的情况下非常罕见。
即便如此,也可以构造一种偶数/奇数算法来在两者之间交替,得到二分搜索的最坏情况和插值搜索的平均情况,以减轻极端情况。
大多数程序员/库如此忽视这一点确实没有充分的理由。
其他人能打败它吗?
【问题讨论】:
-
听起来像个巨魔;不是一个真正的问题 IMO
-
建议:社区模式就像所有其他“Foo 的隐藏功能”、“有史以来最好的酒吧”,......问题。
-
“5 次探测 vs 32 次探测 40 亿个条目”听起来像是一个巨大的改进,但它与“我有一个算法只需要 1e-7 秒,而下一个最好的算法需要高达1e-5 秒,让我的速度快 100 倍”。两个绝对数字之间几乎没有区别。只有当 'n' 接近真正巨大的数字时,这种改进水平才会变得有意义。
-
投票重新开放。这个问题应该很快就会出现,但可能不会得到那么多曝光。
-
重新打开(但我仍然有两种想法 - 你得到了怀疑的好处)。祝您的回答好运。
标签: algorithm data-structures computer-science theory