【问题标题】:What is the most underrated or little known but useful algorithm? [closed]什么是最被低估或鲜为人知但有用的算法? [关闭]
【发布时间】: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


【解决方案1】:

我提名平滑排序。就地,时间复杂度 O(n log n) 最坏情况 / O(n) 最好情况。

【讨论】:

  • 不错的提名!我也从未听说过这个——它确实解决了堆排序的一个主要问题。我认为归并排序通常比堆排序更可取,因为它在排序时更好地利用了局部性。我做了一些检查,发现它在实践中是否更好,结果喜忧参半——你看到这篇论文讨论它的性能特征了吗?我找不到其他人。 iwi.eldoc.ub.rug.nl/FILES/root/1991/InfProcLettBron/…
【解决方案2】:

trie/ternary tree ... 快速前缀匹配!我肯定比堆或显式链表结构更多地使用它们(不过,带有“next”的隐式链表通常很有用)。

【讨论】:

  • 整个尝试领域都被忽视了。早期的、幼稚的、尝试是记忆饥渴的,而且不是特别快,但最近几年有一些出色的工作;查看朱迪树、爆裂树、融合树等。它们现在是任何一种二叉树的激烈竞争,在某些情况下甚至是哈希表。
【解决方案3】:

smoothsort 的另一个提名。从理论上讲,它非常漂亮,并且渐近地尽可能好。

如果您好奇,我在我的个人网站上写了一个 explanation 来说明排序的工作原理和来源。

另外,我完全同意插值搜索真的很棒。我很高兴有人听说过这个。 :-)

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多