我试图为两个不同的算法找到运行时函数和相应的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)
答案 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)。