我试图找出算法的时间复杂度是什么,我有二进制搜索算法,一般是O(log n),我知道。但我在两个常数之间搜索,即x = 1和x = 2 ^ 31 - 1(整数的大小)。我认为在最坏的情况下,我的时间复杂度是log2(2 ^ 31)= 31,所以在最坏的情况下二进制搜索需要31步。但是,二进制搜索中的每一步我都调用一个函数,它具有O(n)运行时(只有一个输入大小的循环)。我的算法是否只是O(31n)= O(n)?
的顺序我算法的输入:一个键,两个大小为n的数组a和b。
在代码中它看起来像这样:
binarySearch(key, a, b)
min = 0, max = 2^31 - 1
mid = (min + max) / 2
while (min<=max) {
x = function(mid, a, b); //this function has O(n)
if (x==key) {
return mid;
} else if (x < key) {
min = mid + 1
} else {
max = mid - 1
}
mid = (min + max) / 2
}
return KEY_NOT_FOUND
我只是想确定,如果你有时间复杂性(减少的),请解释你的答案。
答案 0 :(得分:2)
<强>更新强>
是的,你是对的。
在最坏的情况下,function()
将被调用31次,每次调用都需要时间O(n)
,因此算法的运行时间由31 * O(n) = O(n)
提供。
原始问题的解决方案x = function(mid)
您的问题有点可疑,算法的时间复杂度应为O(1)
。
当我们谈论算法的时间复杂性时,一个重点是:
我们总是考虑算法在输入大小方面需要的时间。
在以下代码段中:
x = function(mid); //this function has O(n)
虽然function()
可能是线性时间函数,但在您的情况下,function()
仅从集mid
中获取输入({0, 1, ..., 230}
),因此在最坏的情况下function()
及时计算max{T(0), T(1), ..., T(230)} = T
,这是一个常数!
所以在最坏的情况下,你的while循环会调用function()
31次,所以在最坏的情况下你的算法会及时运行31 * T
,这是一个常量。
请注意,算法的输入为key
,算法的最差运行时间为31 * T
,实际上独立的输入大小key
!所以时间复杂度为O(1)
。
在你的情况下,我不认为谈论大O符号的时间复杂性是合适的。我建议你谈谈最坏情况下所需的计算步骤数。