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,但这是一个非常基本的例子,并没有太多考虑去理解。有人请带我浏览二进制搜索版本,因为我遇到的所有资源对我来说都没有多大意义。
这是我使用的许多其他资源之一的链接,但是如果可能的话,我更喜欢将每个语句分成步骤的解释。
答案 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/2
。检查索引处的元素是否大于,小于或等于搜索元素。
一个。如果完成相同,则返回索引
湾如果搜索元素更大,那么继续查看数组的右半部分
℃。如果搜索元素少于,则查看数组的左半部分
您继续执行第1步和第2步,直到留下一个元素或找到该元素。
在我们的示例中,问题将如下所示:
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 但渐渐地我们把它称为对数算法而不管它的基数。