查找涉及while循环的运行时函数

时间:2017-07-20 01:55:25

标签: c++ algorithm runtime big-o

我试图为两个不同的算法找到运行时函数和相应的big-O表示法,这两个算法都为堆栈中的每个元素找到了跨度。传入的X是要计算范围的列表,传入的S是范围的列表。我想我知道如何找到运行时函数的大部分内容,一旦我知道它是什么,我就很清楚如何获得大O符号。我需要了解的是如何找出涉及的while循环。我认为它们通常涉及对数,虽然我不明白为什么在这里因为我已经经历过最糟糕的情况,因为每个元素都比前一个要大,所以跨度总是越来越大我看到了没有连接到日志。以下是我到目前为止的情况:

void span1(My_stack<int> X, My_stack<int> &S) { //Algorithm 1
    int j = 0;                                                        //+1
    for(int i = 0; i < X.size(); ++i) { //Find span for each index    //n
        j = 1;                                                           //+1
        while((j <= i) && (X.at(i-j) <= X.at(i))) { //Check if span is larger  //???
            ++j;                                                          //1
        }
        S.at(i) = j;                                                  //+1
    }
}

void span2(My_stack<int> X, My_stack<int> &S) { //Algorithm 2
    My_stack<int> A; //empty stack                                    //+1
    for(int i = 0; i < (X.size()); ++i) { //Find span for each index  //n
        while(!A.empty() && (X.at(A.top()) <= X.at(i))) {               //???
            A.pop();                                                      //1
        }
        if(A.empty())                                                  //+1
            S.at(i) = i+1;
        else
            S.at(i) = i - A.top();
        A.push(i);                                                    //+1
    }
}

span1:f(n)= 1 + n(1 + ??? + 1)

span2:f(n)= 1 + n(??? + 1 + 1)

1 个答案:

答案 0 :(得分:0)

假设所有堆栈操作都是O(1):

  • span1:外循环执行n次。对于从0到i的{​​{1}}的每个值,内循环最多i次。因此,总时间与从1到n的整数之和成比例,即 O(n 2

  • n:我们需要以不同的方式考虑这一点,因为span2的范围是功能范围的。 A从空开始,因此只能弹出多次,因为内部A循环只能执行while被调用的次数,< em>整个函数的执行时间。但是A.push仅在每个外循环中调用一次,即A.push次 - 因此while循环只能执行n次。因此,整体复杂性为 O(n)