未排序列表与线性和二进制搜索

时间:2018-12-12 17:21:32

标签: python algorithm time-complexity

大家好,所以我一直在为即将到来的考试做研究,我遇到了这个问题:

  

如果您有一百万个不重复项的未排序列表,并且知道只搜索一次值,那么以下哪种算法最快?

     
      
  1. 在未排序列表上使用线性搜索
  2.   
  3. 使用插入排序对列表进行排序,然后对排序后的列表进行二进制搜索
  4.   

第二选择不是最快吗?对列表进行排序,然后查找值,而不是仅使用线性搜索?

4 个答案:

答案 0 :(得分:3)

线性搜索仅需 O(n),而对列表进行排序首先需要 O(n log n)。由于您将只在列表中搜索一个值,因此使用二进制搜索在排序后的列表中进行后续搜索仅需 O(log n)的事实无助于克服< em> O(n log n)涉及排序的时间复杂性,因此线性搜索将对任务更有效。

答案 1 :(得分:2)

对列表进行排序最多具有O(log(N)*N)的复杂性。

线性搜索的复杂度为O(N)

因此,如果您必须进行多次搜索,则经过一些搜索后您就会开始节省时间。

如果对象是可散列的(例如:整数),则排序+对分搜索的一种不错的替代方法(仅搜索多次时)是将它们放在set中。然后,由于散列,复杂度降低到O(1),但创建起来仍然O(N),并且散列增加了通行费。

如果您只需要搜索一次,则线性搜索是最佳选择。

答案 2 :(得分:1)

当然是替代项1,因为这仅需要您浏览一次列表。如果要对列表进行排序,则必须至少遍历列表 一次,然后再进行搜索。

答案 3 :(得分:1)

要解决这些类型的问题,仅需查看您将在哪里花费更多的时间。对于一百万个元素:

  1. 具有'n'个反转的插入排序将花费O(n),然后将花费额外的O(log(n))时间。
  2. 而线性搜索只需要O(n)时间。

由于只有一个查询方法1是一个更好的选择,但对于多个查询(列表中的搜索元素),将存在一个点,bin-srch*x<lin-srch*x其中x是查询数量。