大家好,所以我一直在为即将到来的考试做研究,我遇到了这个问题:
如果您有一百万个不重复项的未排序列表,并且知道只搜索一次值,那么以下哪种算法最快?
- 在未排序列表上使用线性搜索
- 使用插入排序对列表进行排序,然后对排序后的列表进行二进制搜索
第二选择不是最快吗?对列表进行排序,然后查找值,而不是仅使用线性搜索?
答案 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
是一个更好的选择,但对于多个查询(列表中的搜索元素),将存在一个点,bin-srch*x<lin-srch*x
其中x
是查询数量。