【问题标题】:Finding the efficiency of a search? algorithm. C++寻找搜索的效率?算法。 C++
【发布时间】:2013-10-04 20:33:40
【问题描述】:

有人告诉我要找出这段代码的效率,我们花了大约 1 个小时(我和我的搭档)试图找出这段代码的真正作用。

我们认为这是一种搜索算法,但我们真的无法找到一种方法让它在不进入无限循环的情况下工作:

int busq(int *v, int x, int b, int a){
    int m1, m2;
    int result;
    m1 = (b+a) / 3;
    m2 = 2*m1;

    if (v[m1] == x)
         result = m1;
    else
        if (v[m2] == x)
            result = m2;
        else
            if (x<v[m1])
                result = busq(v, x, b, m1-1);
            else
                if (x>v[m2])
                    result = busq(v, x, m2+1, a);
                else
                    result = busq(v, x, m1+1, m2-1);
    return result;
}

这就是我们得到的全部信息,参数 a、b 或 x 没有值,*v (向量)的大小或向量的内容也没有。

应该可以这样解决。

如果我们想知道这段代码的作用,但如果您能告诉我们效率,我们也将不胜感激。 (我们使用 O() 表示法 E.J.:O(1), O(n^2)...)

【问题讨论】:

    标签: c++ algorithm performance


    【解决方案1】:

    基本上是ternary searchv 必须是一个排序数组,x 是搜索的值,b 是范围的开始,a 是结束(不包括)。

    该函数尝试在m1m2 处将范围分成三个大致相等的分区(这两个分区都计算错误,并且仅在您搜索第一个元素时才有效)并检查 x 是否位于边界上。如果不是,则使用 x 必须所在的分区进行递归。

    代码可以用

    m1=b+(a-b)/3;
    m2=b+(a-b)*2/3;
    

    那么,效率应该是O(log n)

    【讨论】:

    • 为什么你认为它适用于 b=0?我们尝试如下:v[100] 每个位置为:0,1...99。那么a=99,b=0。它在搜索 11 时进行了无限循环。
    • 如果总是 b=0 即你正在搜索数组中的第一个元素,它就可以工作。否则...用m1=b+(a-b)/3m2=b+(a-b)*2/3 修复代码。
    • 你是如何得出 O(log n) 的结论的?
    • 查看链接的维基百科文章
    • 空间复杂度在技术上也是 O(log n),但由于大多数编译器在这里应用尾调用优化,实际上它是 O(1)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    相关资源
    最近更新 更多