Search 二进制搜索-最差/平均情况
我发现很难理解为什么/如何使用二进制搜索在数组/列表中搜索键的最坏和平均情况是O(log(n)) 日志(1000000)仅为6。日志(1000000000)只有9-我知道,但我不明白解释。如果没有进行测试,我们如何知道平均/最坏情况实际上是log(n)Search 二进制搜索-最差/平均情况,search,big-o,time-complexity,complexity-theory,binary-search,Search,Big O,Time Complexity,Complexity Theory,Binary Search,我发现很难理解为什么/如何使用二进制搜索在数组/列表中搜索键的最坏和平均情况是O(log(n)) 日志(1000000)仅为6。日志(1000000000)只有9-我知道,但我不明白解释。如果没有进行测试,我们如何知道平均/最坏情况实际上是log(n) 我希望你们能理解我想说的。如果没有,请让我知道,我会尝试以不同的方式解释 最坏情况 每次二进制搜索代码做出决定时,它都会将剩余元素的一半从考虑范围中删除。因此,你将每个决策的元素数除以2 在你只剩下一个元素之前,你能除以2多少次?如果n是元素的起
我希望你们能理解我想说的。如果没有,请让我知道,我会尝试以不同的方式解释 最坏情况 每次二进制搜索代码做出决定时,它都会将剩余元素的一半从考虑范围中删除。因此,你将每个决策的元素数除以2 在你只剩下一个元素之前,你能除以2多少次?如果n是元素的起始数量,x是除以2的次数,我们可以这样写: n/(2*2*2*…*2)=1[将“2”重复x次] 或者,相当于 n/2^x=1 或者,相当于 n=2^x 所以n的log base 2给出了x,这是所做决策的数量 最后,您可能会问,如果我使用log base 2,为什么也可以像您所做的那样将其编写为log base 10?基数并不重要,因为区别在于大O符号“忽略”了哪个 平均案例 我知道你也问过一般情况。考虑:
由于一半的元素占用的时间最多,所以其他元素占用的时间少多少并不重要。我们可以假设所有元素占用的时间都是最大的,即使其中一半实际上占用了0时间,我们的假设也不会超过实际平均值的两倍。我们可以忽略“double”,因为它是一个常数。因此,就大O表示法而言,平均情况与最坏情况相同。对于二进制搜索,数组应按升序或降序排列
因此,二进制搜索是一种二分法分治搜索算法。因此,执行搜索操作需要对数时间,因为元素在每次迭代中减少一半。对于我们可以进行二元搜索的排序列表,二元搜索所做的每个“决定”都会将您的键与中间元素进行比较,如果较大,则会占用列表的右半部分,如果更少,它将占据列表的左半部分(如果匹配,它将返回该位置的元素),对于产生O(logn)的每个决策,有效地将列表减少一半 然而,二进制搜索仅适用于排序列表。对于未排序的列表,您可以直接从第一个元素开始搜索,产生O(n)的复杂度 O(logn)
尽管这完全取决于要执行的搜索数量、输入等,但最好的方法是什么。对于二进制搜索,先决条件是将排序数组作为输入 •列表排序时:
•当然,我们不必检查字典中的每个单词来查找单词。
•基本策略是反复将搜索范围减半,直到找到值。
•例如,在下面的9个列表中查找5个。v=1 1 3 5 8 10 18 33 42
•我们首先从中间开始:8
•由于5在二进制搜索的情况下,时间复杂度为O(以对数为基数2 n),而不是以对数(以10为基数)n。和log(base2)1000000=19.931569。
int binary_search (vector<int> v, int val) {
int from = 0;
int to = v.size()-1;
int mid;
while (from <= to) {
mid = (from+to)/2;
if (val == v[mid])
return mid;
else if (val > v[mid])
from = mid+1;
else
to = mid-1;
}
return -1;
}