我被困两次复杂。使用有序数组进行二进制搜索是O(logN)。因此,要搜索未排序的数组,我们必须先对其进行排序,以便变为O(NlogN)。那么我们就可以执行二进制搜索,它给出的复杂度为O(N),但我已经读过它可能是O(NlogN)。哪个是对的?
答案 0 :(得分:24)
二进制搜索用于“已排序”列表。复杂性为O(logn)。
二进制搜索不适用于“未排序”列表。对于这些列表,只需从第一个元素开始直接搜索;这给出了O(n)的复杂性。如果您使用MergeSort或任何其他O(nlogn)算法对数组进行排序,那么复杂性将为O(nlogn)。
O(logn)< O(n)< O(nlogn)
答案 1 :(得分:2)
你问题的答案就在你自己的问题中。
您首先对列表进行排序。如果使用快速排序或合并排序对列表进行排序,则复杂性将变为o(n*log n)
。第一部分结束了。
执行二进制搜索的第二部分是在“已排序列表”上完成的。二进制搜索的复杂性为o(log n)
。因此,该计划的复杂性最终仍为o(n*log n)
。
但是,如果您希望计算数组的中位数,则不必对列表进行排序。线性或顺序搜索的简单应用可以帮助您。
答案 2 :(得分:0)
线性搜索的时间复杂度为O(n)
,二进制搜索的时间复杂度为O(log n)
(log base-2)。如果我们有一个未排序的数组并且想要使用二进制搜索,我们必须先对数组进行排序。在这里,我们必须花费一些时间O(n logn)
对数组进行排序,然后花时间搜索元素。