Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找包含while循环的运行时函数_C++_Algorithm_Runtime_Big O - Fatal编程技术网

C++ 查找包含while循环的运行时函数

C++ 查找包含while循环的运行时函数,c++,algorithm,runtime,big-o,C++,Algorithm,Runtime,Big O,我试图为两种不同的算法找到运行时函数和相应的big-O符号,这两种算法都能找到堆栈上每个元素的跨度。传入的X是从中计算跨度的列表,传入的S是跨度的列表。我想我知道如何找到运行时函数中的大部分内容,一旦我知道这是什么,我就很好地理解了如何使用big-O表示法。我需要了解的是如何找出所涉及的while循环。我认为它们通常涉及对数,尽管我不明白为什么在这里,因为我经历了最坏的情况,每个元素都比前一个元素大,所以跨度总是越来越大,我看不到与日志的联系。以下是我到目前为止的情况: void span1(M

我试图为两种不同的算法找到运行时函数和相应的big-O符号,这两种算法都能找到堆栈上每个元素的跨度。传入的X是从中计算跨度的列表,传入的S是跨度的列表。我想我知道如何找到运行时函数中的大部分内容,一旦我知道这是什么,我就很好地理解了如何使用big-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
    }
}
void span1(My_stack X,My_stack&S){//算法1
int j=0;//+1
对于(int i=0;i而((j假设所有堆栈操作都是O(1):

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

  • span2
    :我们需要以不同的方式思考这个问题,因为
    A
    的作用域是函数范围。
    A
    开始时是空的,因此只能在推到它上面的东西时多次弹出,即内部
    ,而
    循环只能在整个过程中调用
    A.push
    函数的执行时间。但是,
    A.push
    只在每个外部循环中调用一次,即
    n
    次-因此while循环只能执行
    n
    次。因此总体复杂性为O(n)


您的问题是什么?while循环会发生什么?我使用问号作为占位符,但它们的位置是什么?