我真的很喜欢研究算法和优化代码(我尽量不要过早地做)因为当花费5分钟运行的东西现在在2分钟内运行时感觉非常酷。我对搜索算法特别感兴趣,因为当你必须在表格中搜索匹配的子字符串或条目时,它会非常频繁。
我正在考虑比较排序的下限,并且正在考虑如果比较排序可以通过猜测答案将会是什么来跳过某些比较,那么对于巨大的数据集如何,那么整行的比较可能会消失高度减少1.(例如排序a,b,c,d,e,f如果算法可以猜测bcd在一起然后你真的只是排序a,bcd,e,f)猜测必须是一个聪明,有效的猜测,使它值得,加上它需要有一个相当不错的击球率。
与搜索相同,如果智能搜索可以首先猜测项目可能位于何处,并且仅搜索前5个猜测区域。如果所有5个猜测都是错误的,那么它可能会返回错误的答案并且永远不会找到该项目,但是如果它具有足够好的正确比率,那么它可能与之相关。它可能比创建二进制搜索树然后进行log(n)搜索更快。
无论如何,我确信理解这个主题的人现在已经意识到这主要是没有实质内容的猜测/幻想所以我正在寻求帮助,以便在学习算法的过程中采取措施。 t具有100%正确的回报,特别是在搜索/排序区域,但更快并且应用这些算法。
我用谷歌搜索,点击维基百科上的随机链接试图找到这个,但没有令人满意的结果。我应该阅读什么/我应该去哪里开始学习这个?
我想我应该提到我对大多数“标准”算法和数据结构感到满意,例如快速排序,合并排序,气泡,基数,计数等,以及哈希,自平衡树等。
答案 0 :(得分:6)
我认为要取得很大成就,你必须为你的“几乎排序”定义一些标准。例如,如果在正确位置的N个点内有一个元素就足够了,你可以做一些像Quicksort这样的事情,但是当一个分区到达N个元素时停止。请注意,执行此操作已经很常见,并使用插入排序完成作业。但是,除非N非常大,否则你可能不会从中获得太多收益。
就搜索而言,您可能正在寻找通常称为插值搜索的内容。您可以使用插值来猜测您正在寻找的项目的可能位置,而不是总是猜测范围的中间位置(例如,如果您正在寻找以'b'开头的字符串,那么您可以从1开始/ 13 th 通过集合而非中途通过。
如果集合中的项目分布极不均匀,后者可能效果不是很好,但假设即使合理均匀分布,它也会产生非常好的结果(大约O(log log) N)而不是你用二进制搜索获得的O(log N)。然而,它确实依赖于均匀分布,并且具有可以计算至少与“距离”类似的东西的键类型,而不是只“小于”或“大于”比较)。在实践中,它通常可以很好地工作(并且在前期通常不太明显的情况下)。
答案 1 :(得分:3)
近似排序不会比正确排序快得多。
好的,所以我们还没有真正定义“近似”,但任何合理的定义都意味着结果数据的反转总数相当少(反转是一对错误的方法)相对于彼此)。
但是,几乎排序的数据可以非常快速地正确排序。例如,插入排序是O(n + d),其中n是元素的数量,d是反转的数量。
因此,如果您可以“快速”对数据进行“快速”排序,那么您可以“快速+一点”对其进行正确排序。几乎排序和正确排序之间的区别只是“有点”。
答案 2 :(得分:0)
有一次,我使用每次运行最大数量的“插入”的插入排序,以便大致维持一段时间的排序(保证特定计算时间上限比精确度更重要)。但我同意史蒂夫杰索普的观点:一般来说,没有理由贬低。还有像TimSort这样的算法,旨在识别和利用“简单案例”。