牺牲速度精度的搜索/排序算法

问题描述

| 我真的很想研究算法并优化代码(我尽量不要过早地这样做),因为当花了5分钟才能运行的东西现在运行2分钟时,感觉真的很酷。我对搜索算法特别感兴趣,因为当您必须在表中搜索匹配的子字符串或条目时,它是如此频繁。 我在考虑比较排序的下限,并在思考如果比较排序可以通过猜测答案是什么,然后可以跳过整行比较并降低高度来跳过比较,那么如何处理巨大的数据集乘以1。(例如,如果算法可以猜测bcd在一起,则对a,b,c,d,e,f进行排序,那么您实际上只是对a,bcd,e,f进行排序)猜测必须是明智的,有效的猜测使其值得,并且还需要具有相当不错的击球率。 与搜索相同,如果智能搜索可以首先猜测该项目可能在哪里,并且仅采用前5个猜测的区域进行搜索。如果所有5个猜测都是错误的,则它可能会返回错误的答案,并且永远找不到该项目,但是如果它的速度足够快且正确率足够高,则可能与之匹配。它可能比创建二进制搜索树然后进行log(n)搜索更快。 无论如何,我敢肯定,了解此主题的任何人到现在都将意识到,这主要是投机/幻想,没有实质内容,因此,我希望寻求帮助,朝着学习不了解算法的方向迈进。不会有100%正确的回报率,尤其是在搜索/排序领域,但是速度更快,而且这些算法的应用也更快。 我用谷歌搜索,单击了维基百科上的随机链接以尝试找到它,但没有令人满意的结果。我应该读什么书/应该去哪里开始学习呢? 我想我应该提一下,我对大多数“标准”算法和数据结构都很满意,例如快速排序,合并排序,冒泡,基数,计数等以及哈希,自平衡树等。     

解决方法

        我认为要完成很多工作,您必须为“几乎已排序”定义一些标准。例如,如果在正确位置的N个点内包含一个元素就足够了,则可以执行Quicksort之类的操作,但是当分区减少到N个元素时停止。请注意,执行此操作已经很普遍,并使用插入排序来完成工作。但是,除非N很大,否则您可能不会从中获得太多收益。 就搜索而言,您可能正在寻找通常称为插值搜索的内容。不必总是猜测范围的中间位置,而是使用插值法来猜测您要查找的项目的可能位置(例如,如果您正在查找以\'b \'开头的字符串,您从集合的大约三分之一开始,而不是一半。 如果集合中的项目分布极不均匀,则后者的效果可能不会特别好,但是即使假设分布合理,它也会给出非常好的结果(大约为O(log log N)而不是O(log N)您将获得二进制搜索)。但是,它确实取决于均匀分布,并且具有一种密钥类型,您可以为该密钥类型计算至少合理地类似于“距离”的内容,而不仅仅是计算“小于”或“大于”的比较)。在实践中,它通常工作得很好(并且在通常情况下通常不会很明显地预先出现)。     ,        近似排序不会比适当排序快得惊人。 好的,因此我们还没有真正定义“近似”,但是任何合理的定义都将暗示结果数据的反转总数非常小(一个反转是一对错误的元素对彼此之间)。 但是,几乎分类的数据可以非常快速地正确分类。例如,插入排序为O(n + d),其中n是元素数,而d是反转数。 因此,如果您可以“快速”对数据进行几乎排序,则可以“快速+一点”对数据进行正确排序。几乎排序和正确排序之间的区别只是“一点”。     ,在一种情况下,我使用了每次运行最多具有“插入”次的插入排序,以便大致维持随时间的排序(在其中保证特定的计算时间上限比准确性更为重要)。但我同意史蒂夫·杰索普(Steve Jessop)的观点:一般来说,没有理由便宜。还有像TimSort这样的算法,旨在识别和利用“简单案例”。