为什么要在未排序数组中使用线性搜索而不是线性搜索?

问题描述 投票:2回答:2

我一直在Coursera上学习DSA课程,本周已经介绍了搜索算法。虽然二分搜索(O(logn))的复杂性要好于线性搜索(O(n))。但是鉴于为什么需要nlogn才能首先对数组进行排序,所以为什么我会在未排序的数组中使用它。

如果二进制搜索仅在已经对数组进行排序的地方使用,那么为什么经常比较这两种算法,因为显然它们具有不同的用例。

algorithm sorting binary-search linear-search
2个回答
1
投票

鉴于是否需要O(n log n)来首先对数组进行排序,我将在未排序的数组中使用它。

通常是对相同的数据结构执行multiple查询。确实,例如查看数据库。有意义的是,与添加记录相比,更经常地使用给定的主键来获取记录。这是有道理的,因为如果查询的数量少于插入的数量,那么我们将插入从未被检索到的数据,因此这些插入是“无用的”。

此外,对元素列表进行排序,或构造元素的二叉树确实需要O(n log n)。但是更新二叉搜索树,例如AVL tree [wiki]O(log n)。因此,如果您通过添加一个元素,删除一个元素,更新一个元素等来稍微更改元素的集合,则需要O(log n)来更改数据结构,并保持O (登录n)查找。

对未排序的数据使用线性搜索,确实会胜过对少量查询的排序和二进制搜索。从查询数量变大的那一刻起,线性搜索算法的性能将优于二进制搜索算法。


0
投票

Willem Van Onsem的答案很好地描述了将在同一数组上进行许多查询的情况,因此值得花O(n log n)的时间首先对数组进行排序。我的回答并没有直接解决“未排序的数组”,但是有一个普遍的误解,认为数组是[[are未排序或已经]]排序的,我认为有必要解决这种误解,以防它有助于读者。明确地说,我不认为您有这种特殊的误解;但我确实认为有些人会误解您的问题及其答案。


单词

“ sorted”]]有点误导。由于“ sorted”是过去式动词,因此听起来好像已经使用了排序算法来对数据进行排序。但是计算机科学家使用“ sorted”一词的方式,仅表示数组is

是有序的,而并不意味着它以前不是有序的。因此,当我们说二进制搜索只能在“ sorted array”上使用时,这并不意味着要花费O(n log n)的时间来使数组“ sorted”。自然,很多数据都是按顺序排列的,而无需进行任何排序工作。一些例子:

    假设我有一个未排序的数字数组,并且我想构建一个prefix sum array,其中包含从原始数组的开头开始的累积和。如果原始数组中没有负数,则累加和自然会以升序排列。
  • 假设我有一个包含一些特殊元素的序列,并且我想执行查询,在给定索引的情况下,查询会找到该索引之后的第一个特殊元素。在出现特殊元素时按顺序列出索引将有帮助;查找这些索引的自然方法是按升序查找它们。
  • 假设我想要第一个n质数或所有小于或等于n的质数的数组。解决这两个问题的几乎所有算法都会以升序生成素数。
  • 因此,在许多情况下,我们可以应用二进制搜索而不必花费O(n log n)的时间对需要搜索的序列进行排序。
© www.soinside.com 2019 - 2024. All rights reserved.