Algorithm 如何将步长计数方法应用于我的二进制搜索实现 int二进制搜索(int-arr[],int-left,int-right,int-x) { while(左x) { 右=中-1; } 其他的 { 左=中+1; } } 返回-1; }

Algorithm 如何将步长计数方法应用于我的二进制搜索实现 int二进制搜索(int-arr[],int-left,int-right,int-x) { while(左x) { 右=中-1; } 其他的 { 左=中+1; } } 返回-1; },algorithm,Algorithm,当我自己经历这个过程时,我得到了5n+4=O(n),但不知怎的,它应该是O(logN),我不明白为什么会是这样 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] &

当我自己经历这个过程时,我得到了5n+4=O(n),但不知怎的,它应该是O(logN),我不明白为什么会是这样

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;
}
int平均值(int a[],大小)
{
int sum=0;//1步
对于(int i=0;i
我知道上面的代码减少到2N+3,但这是一个非常基本的示例,不需要花太多的心思来理解。请有人带我浏览一下二进制搜索版本,因为我遇到的所有源代码对我来说都没有多大意义

这里是我使用过的许多其他资源中的一个链接,但是如果可能的话,我更倾向于解释如何将每个语句分成步骤


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

假设我有一个10个元素的数组。二进制搜索将数组分成两部分,在本例中为5(称为L,因为它们是左5个元素)和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,这个解决方案是log(n)

在二进制搜索中,你总是将问题大小减少
1/2
。让我们举个例子:在排序数组中,搜索元素为19,数组大小为8个元素[1,4,7,8,11,16,19,22],然后二进制搜索将执行以下步骤序列:

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

    a。如果完成,则返回索引

    b。若搜索元素较大,则继续查找数组的右半部分

    c。若搜索元素小于,则查看数组的左半部分

  • 继续执行步骤1和2,直到只剩下一个元素或找到该元素

  • 在我们的示例中,问题如下所示:

    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
    }
    
    复杂性顺序:
    O(log2(n))
    log28
    =3,这意味着我们需要3个步骤来找到所需的元素。即使元素不存在(即在最坏的情况下),该算法的时间复杂度仍为log2n


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

    你是如何在
    5n+4
    intbinarysearch(intarr[],intleft,intright,intx){while(left x)//1步*1{right=mid-1;//1步*(n)}否则//1步*1{left=mid+1;//1步*(n)}返回-1;//1步骤*1}
    我不知道如何格式化它,但我根据我的示例计算了步骤。正如第二个简化示例中的注释所述。
    Iteration 1: [1,4,7,8,11,16,19,22]
    Iteration 2: [16,19,22]
    Iteration 3: [19]