我有一项任务要求我编写三元搜索算法并在之后计算其时间复杂度。我能够为它编写算法,但我无法想出如何计算其复杂性的任何想法。我想我不理解big-theta符号的概念。
这是我的代码:它的工作方式类似于二进制搜索,但只将列表分成几部分并继续进行搜索。
*some list which contains n increasingly-ordered integers;*
int num;
int min = 1;
int max = n;
int middle1 = (2*min+max)/3;
int middle2 = (min+2*max)/3;
cin >> num; //num is the number that is wanted to be found
while (middle1 != middle2)
{
middle1 = (2*min+max)/3;
middle2 = (min+2*max)/3;
if(num <= list[middle1])
max = middle1;
else if(num >list[middle1] && num <= list[middle2])
{
min= middle1;
max = middle2;
}
else
min = middle2;
}
if(num == list[max])
cout << "your number is found in the "<< max <<"th location\n";
else
cout << "number cannot be found";
如果您可以解释如何根据big-theta符号确定其复杂性,那对我来说非常有帮助。
答案 0 :(得分:6)
在每个步骤中,您将通过常数因子(在本例中为3)减小可搜索范围的大小。如果您在 n 步骤后找到了元素,则可搜索范围的大小为 N = 3 n 。相反,在找到元素之前所需的步骤数是集合大小的对数。也就是说,运行时为O(log N )。进一步的想法表明,您也可以始终构建需要所有这些步骤的情况,因此最坏情况的运行时实际上是Θ(log N )。
答案 1 :(得分:3)
是Θ(log3(N))。 要查看如何计算复杂性,请查看http://en.wikipedia.org/wiki/Big_O_notation
要了解有关三元搜索的更多信息,请查看维基百科页面:http://en.wikipedia.org/wiki/Ternary_search