如何将Step-Count方法应用于我的二进制搜索实现

时间:2018-02-10 21:29:34

标签: algorithm

int binarySearch(int arr[], int left, int right, int x)
{

  while( left <= right)
  {
    int mid = (left+right)/2;
    if(arr[mid] == x)
    {
      return mid;
    }
    else if(arr[mid] > x) 
    {
      right = mid-1; 
    }
    else  
    {
      left = mid+1; 
    }
  }
  return -1;
}

当我自己经历这个时,我得到了5n + 4 = O(n)但不知何故它被认为是O(logN),我不明白为什么会这样。

int mean(int a[], size_t n)
{
   int sum = 0;                 // 1 step
   for (int i = 0; i < n; i++)  // 1 step *(n+1)
     sum += a[i];               // 1 step
   return sum;                  // 1 step
}

据我所知,上面的代码减少到了2N + 3,但这是一个非常基本的例子,并没有太多考虑去理解。有人请带我浏览二进制搜索版本,因为我遇到的所有资源对我来说都没有多大意义。

这是我使用的许多其他资源之一的链接,但是如果可能的话,我更喜欢将每个语句分成步骤的解释。

how to calculate binary search complexity

2 个答案:

答案 0 :(得分:0)

注意:二进制搜索只能对已排序的数据进行。

假设我有一个 10 元素的数组。二进制搜索会将数组拆分为两半,在这种情况下 5 (称之为L,因为它们留下5个元素)和 5 (称之为正确,因为它们是正确的5元件)。

假设您要查找的元素大于中间元素,在本例中为x > array[5],那么您只需忽略第一个 5 元素并转到最后五个元素。

现在你有一个包含五个元素的数组(从索引5到10)。现在再次将数组拆分为两半,如果x > array[mid]则忽略左整个数组,如果它更小则忽略整个右数组。

在数学符号中你得到一个这样的系列: {n,n / 2,n /(2 ^ 2),n /(2 ^ m)}

现在,如果你试图解决这个问题:因为最高项是 n / 2 ^ m 所以我们有 n / 2 ^ m = 1 这有一个解决方案as log(n)

答案 1 :(得分:0)

在二进制搜索中,您始终可以通过1/2减少问题大小。让我们举一个例子:搜索元素是19,数组大小是 排序数组中的8个元素 [1,4,7,8,11,16,19,22]接下来将是二进制搜索将执行的步骤序列:

  1. 获取中间元素索引,即将问题大小除以1/2
  2. 检查索引处的元素是否大于,小于或等于搜索元素。

    一个。如果完成相同,则返回索引

    湾如果搜索元素更大,那么继续查看数组的右半部分

    ℃。如果搜索元素少于,则查看数组的左半部分

  3. 您继续执行第1步和第2步,直到留下一个元素或找到该元素。

  4. 在我们的示例中,问题将如下所示:

    Iteration 1: [1,4,7,8,11,16,19,22]
    Iteration 2: [16,19,22]
    Iteration 3: [19]
    

    复杂程度:O(log<sub>2</sub>(n))log<sub>2</sub>8 = 3,这意味着我们需要3个步骤来找到我们想要的元素。即使元素不存在(即在最坏的情况下),该算法的时间复杂度仍然是log 2 n。

    在二进制搜索中注意log的基础很重要,因为我们将问题大小减少1/2,如果在任何其他算法中我们将问题大小减少1/3而不是log 3 但渐渐地我们把它称为对数算法而不管它的基数。