Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 二进制搜索-最差/平均情况_Search_Big O_Time Complexity_Complexity Theory_Binary Search - Fatal编程技术网

Search 二进制搜索-最差/平均情况

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是元素的起

我发现很难理解为什么/如何使用二进制搜索在数组/列表中搜索键的最坏和平均情况是O(log(n))

日志(1000000)仅为6。日志(1000000000)只有9-我知道,但我不明白解释。如果没有进行测试,我们如何知道平均/最坏情况实际上是log(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符号“忽略”了哪个

平均案例

我知道你也问过一般情况。考虑:

  • 数组中只有一个元素可以在第一次尝试时找到
  • 第二次尝试只能找到两个元素。(因为在第一次尝试后,我们选择了右半部分或左半部分。)
  • 第三次尝试只能找到四个元素
  • 你可以看到模式:1,2,4,8,不适用。要表示朝另一个方向移动的相同图案,请执行以下操作:

  • 一半的元素采取了最多数量的决策来查找
  • 四分之一的元素少做一个查找的决定
  • 等等

  • 由于一半的元素占用的时间最多,所以其他元素占用的时间少多少并不重要。我们可以假设所有元素占用的时间都是最大的,即使其中一半实际上占用了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;
    }