查找涉及 while 循环的运行时函数
finding runtime function involving a while loop
我正在尝试为两种不同的算法找到运行时函数和相应的 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 到n
i
。因此总时间与从1到n
的整数之和成正比,即O(n2( -
span2
:我们需要以不同的方式思考这个问题,因为A
的范围是功能范围的。A
开始时为空,因此只能在将某些东西推到其上时多次弹出,即内部while
循环只能在函数的整个执行时间内执行调用A.push
的次数。但是,A.push
每个外循环只调用一次,即n
次 - 因此 while 循环只能执行n
次。因此,整体复杂度为O(n(。
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 函数在Windows或Linux上运行时表现不同
- 在运行时解析函数,而不是在编译C++解析函数
- 如何在 constexpr 函数中实现回退运行时
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 运行时的动态函数解析
- 字符串函数在目标C++上运行时C++返回空
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 让某个类的 '=' 运算符在声明时运行构造函数
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 如何使用模板生成常规参数列表并将其传递给运行时函数?
- 查找涉及 while 循环的运行时函数
- PGI 不支持 OpenMP 4.5 运行时函数
- C++:传递给 C 运行时函数的参数无效
- 基于用户输入的运行时函数规范
- 运行时函数在编译时函数上分支
- 您可以告诉C 中的运行时函数是否为纯虚拟
- v8中的运行时函数
- 为什么每次运行时函数的地址都会改变?