algorithm - 为速度牺牲准确性的搜索/排序算法

标签 algorithm optimization search

我非常喜欢研究算法和优化代码(我尽量不要过早地这样做)因为当一个需要 5 分钟运行的东西现在可以在 2 分钟内运行时,感觉真的很酷。我对搜索算法特别感兴趣,因为当您必须在表中搜索匹配的子字符串或条目时,它非常频繁。

我在考虑比较排序的下限,并且在考虑如果比较排序可以通过猜测答案是什么来跳过一些比较,那么对于巨大的数据集,整行比较就可以消失,并且高度减 1。(例如,如果算法可以猜测 bcd 在一起,则对 a、b、c、d、e、f 进行排序,那么您实际上只是在对 a、bcd、e、f 进行排序)猜测必须是一个聪明、有效的猜测才能让它物有所值,而且它需要有一个相当好的击球率。

与搜索相同,如果智能搜索可以先猜测该项目可能位于何处,并且只取前 5 个猜测的区域进行搜索。如果所有 5 次猜测都是错误的,那么它可能会返回一个错误的答案并且永远找不到该项目,但如果它的速度大大加快且正确率足够高,那么它可能会随之而来。它可能比创建二叉搜索树然后进行 log(n) 搜索更快。

无论如何,我相信任何了解该主题的人现在都会意识到,这主要是没有实质内容的猜测/幻想,所以我正在寻求帮助,朝着学习算法的方向采取步骤,而不是“没有 100% 正确的返回,特别是在搜索/排序领域,但速度更快,并且应用了这些算法。

我用谷歌搜索,点击维基百科上的随机链接试图找到它,但没有令人满意的结果。我应该读什么/我应该去哪里开始学习这方面的内容?

我想我应该提一下,我对大多数“标准”算法和数据结构都很熟悉,例如快速排序、归并排序、冒泡、基数、计数等,以及散列、自平衡树等。

最佳答案

我认为要完成很多工作,您必须为“几乎排序”定义一些标准。例如,如果在正确位置的 N 个点内有一个元素就足够了,您可以执行类似 Quicksort 的操作,但是当分区减少到 N 个元素时停止。请注意,这样做已经很常见了,并使用插入排序来完成这项工作。但是,除非 N 非常大,否则您可能不会从中获益太多。

就搜索而言,您可能正在寻找通常称为插值搜索的内容。您不必总是在范围的中间猜测,而是使用插值来猜测您正在寻找的项目的可能位置(例如,如果您正在寻找以 'b' 开头的字符串,您开始大约 1/13th 通过集合而不是一半。

如果集合中的项目分布极不均匀,后者可能不会特别好,但假设均匀分布合理,它往往会给出非常好的结果(大约 O(log log N) 而不是二分搜索得到的 O(log N))。然而,它确实依赖于均匀分布,并且有一个 key 类型,您可以为其计算至少与“距离”相当相似的东西,而不是只是“小于”或“大于”比较)。但在实践中,它通常工作得很好(而且它不会的情况通常在前期非常明显)。

关于algorithm - 为速度牺牲准确性的搜索/排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6337005/

相关文章:

javascript - 优化此 Javascript 代码

ruby - 搜索 XML 并将节点的子集作为 XML 获取

java - 内存中的对象搜索优化

python - 在Python中实现8位加法器

algorithm - if(N^2%N==0) 的大 O 表示法的时间

c - 树节点的一千次随机选择

c++ - * 1233 >> 12 在这个计算十进制数字的代码中背后的数学是什么

excel - 在 MS Excel 中创建 "search"函数

c++ - 这个插值搜索实现有什么问题?

algorithm - Viterbi 训练或 Baum-Welch 算法来估计转换和发射概率?