我一直在Coursera上学习DSA课程,本周已经介绍了搜索算法。虽然二分搜索(O(logn))的复杂性要好于线性搜索(O(n))。但是鉴于为什么需要nlogn才能首先对数组进行排序,所以为什么我会在未排序的数组中使用它。
如果二进制搜索仅在已经对数组进行排序的地方使用,那么为什么经常比较这两种算法,因为显然它们具有不同的用例。
鉴于是否需要O(n log n)来首先对数组进行排序,我将在未排序的数组中使用它。
通常是对相同的数据结构执行multiple查询。确实,例如查看数据库。有意义的是,与添加记录相比,更经常地使用给定的主键来获取记录。这是有道理的,因为如果查询的数量少于插入的数量,那么我们将插入从未被检索到的数据,因此这些插入是“无用的”。
此外,对元素列表进行排序,或构造元素的二叉树确实需要O(n log n)。但是更新二叉搜索树,例如AVL tree [wiki]取O(log n)。因此,如果您通过添加一个元素,删除一个元素,更新一个元素等来稍微更改元素的集合,则需要O(log n)来更改数据结构,并保持O (登录n)查找。
对未排序的数据使用线性搜索,确实会胜过对少量查询的排序和二进制搜索。从查询数量变大的那一刻起,线性搜索算法的性能将优于二进制搜索算法。
Willem Van Onsem的答案很好地描述了将在同一数组上进行许多查询的情况,因此值得花O(n log n)的时间首先对数组进行排序。我的回答并没有直接解决“未排序的数组”,但是有一个普遍的误解,认为数组是[[are未排序或已经]]排序的,我认为有必要解决这种误解,以防它有助于读者。明确地说,我不认为您有这种特殊的误解;但我确实认为有些人会误解您的问题及其答案。
“ sorted”]]有点误导。由于“ sorted”是过去式动词,因此听起来好像已经使用了排序算法来对数据进行排序。但是计算机科学家使用“ sorted”一词的方式,仅表示数组is
是有序的,而并不意味着它以前不是有序的。因此,当我们说二进制搜索只能在“ sorted array”上使用时,这并不意味着要花费O(n log n)的时间来使数组“ sorted”。自然,很多数据都是按顺序排列的,而无需进行任何排序工作。一些例子:n
质数或所有小于或等于n
的质数的数组。解决这两个问题的几乎所有算法都会以升序生成素数。