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