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

finding runtime function involving a while loop

本文关键字:运行时 函数 循环 while 查找      更新时间:2023-10-16

我正在尝试为两种不同的算法找到运行时函数和相应的 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
}
}

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

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

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

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

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