【问题标题】:Time Complexity of Ternary Search Algorithm三元搜索算法的时间复杂度
【发布时间】:2012-03-25 16:25:03
【问题描述】:

我有一个任务要我编写一个三元搜索算法,然后计算它的时间复杂度。我能够为它编写一个算法,但我想不出任何想法来计算它的复杂性。我想我不明白 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";

如果你能解释如何用大θ表示法来确定它的复杂性,那对我很有帮助。

【问题讨论】:

    标签: search time complexity-theory


    【解决方案1】:

    在每一步中,您都会将可搜索范围的大小减小一个常数因子(在本例中为 3)。如果您在 n 步后找到您的元素,则可搜索范围的大小为 N = 3n。相反,在找到元素之前所需的步数是集合大小的对数。也就是说,运行时间是 O(log N)。进一步思考表明,您也可以始终构建需要所有这些步骤的情况,因此最坏情况的运行时间实际上是 Θ(log N)。

    【讨论】:

    • 不应该比二分查找效率低吗,因为随着 n 元搜索中的 n 达到列表的大小,它就变成了线性搜索?
    • 我们在这里只讨论渐近线。更改n 的值只是将时间乘以某个常数。
    • 我认为在课程中我必须更加注意这些,我的脑海中有很多悬而未决的问题。不过谢谢你,你的解释帮助我回答了这个问题。
    • @MertToka:这是一个类比:考虑用位值表示法写下整数所需的位数。位数是数字值的对数。实际位数取决于数基数,但对于不同基数,位数仅相差一个常数倍数。
    【解决方案2】:

    它是 Θ(log3(N))。 要检查如何计算复杂度,只需检查 http://en.wikipedia.org/wiki/Big_O_notation

    要了解有关三元搜索的更多信息,请同时查看维基百科页面:http://en.wikipedia.org/wiki/Ternary_search

    【讨论】:

    • 可以(并且应该)写成 O(log(N))。
    • 您是如何得出这个答案的?你是说输入 O 语句的 Big-Theta(我无法在键盘上输入)吗?
    • @MertToka:您可以在帖子中输入&amp;Theta;;接受 HTML 实体引用。
    • 你帮了我一点,但我已经事先检查了这些链接,我在这里问一个问题。不过谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 2020-11-15
    • 1970-01-01
    • 2011-07-16
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多