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