曼德布洛特集合在大O表示法方面的时间复杂度
Time complexity of mandelbrot set in term of big O notation
>我试图找到曼德布洛特集合的简单实现的时间复杂度。 使用以下代码
int main(){
int rows, columns, iterations;
rows = 22;
columns = 72;
iterations = 28;
char matrix[max_rows][max_columns];
for(int r = 0; r < rows; ++r){
for(int c = 0; c < columns; ++c){
complex<float> z;
int itr = 0;
while(abs(z) < 2 && ++itr < iterations)
z = pow(z, 2) + decltype(z)((float)c * 2 / columns - 1.5,
(float)r * 2 / rows - 1);
matrix[r][c]=(itr== iterations ? '*' : '.');
}
}
现在查看上面的代码,我根据大 O 表示法对时间复杂度进行了一些估计,并想知道它是否正确
因此,我们正在创建一个通过嵌套循环遍历它的 2d 数组,并且在每个元素上我们执行一个操作并设置该元素的值,如果我们以 n 作为输入大小,我们可以说输入越大,复杂性就越大,因此 rowsxcolumns 的时间复杂度将是 O(rxc),然后我们再次遍历它以进行打印输出, 那么时间复杂度是多少?是O(rxc)+O(rxc)吗?当我们对行和列进行乘法和减法时,函数本身对时间复杂度有一定影响吗?如果是,那又如何呢?
几乎,给定r
行、c
列和i
迭代,则运行时间为O(r*c*i)
。这应该是微不足道的,看看abs(z)<2
是否不存在。但是有了这个额外的条件,不清楚内部while
循环总共会运行多少次。是的,它会少于r*c*i
倍,所以O(r*c*i)
仍然是上限。但也许我们可以做得更好。假设对于任何r,c
,您在同一域上以不同的分辨率计算曼德布洛特集,那么 while 循环将运行k*r*c*i
次,以实现一些常量k
介于曼德布罗特面积和 1 --> 代码的运行时间Θ(r*c*i)
,O(r*c*i)
无法改进。
如果您以固定分辨率计算[-c,c]x[-r,r]
域上的集合,那么对于任何|z|>2
,abs(z)<2
在第一次迭代后都会中断。然后O(r*c*i)
就不会受到严格限制,如果要准确估计,应考虑此条件(作为所有循环条件)。
请不要使用malloc
,std::vector
更安全。
在 big-O 表示法中,O(rxc)+O(rxc) 折叠为 O(rxc)。
由于最大迭代计数也是一个输入变量,因此它也会影响复杂性。特别是,内部循环最多运行 n 次迭代,因此,复杂度为 O(rxcxn)。
所有其他运算都是常数,特别是complex<float>
的乘法和加法。这些操作本身始终是 O(1),这不会增加整体复杂性。
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- GCC和Clang在与__builtin_constant_p相关的static_assert方面有所不同
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 如何计算Big-O表示法中的平均渐近运行时间
- 我应该如何表示我拥有的连续元素序列?
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 表示类模板C++空类型
- 具有所表示类的相同构造函数签名的代理类模板
- 嵌套在循环中的两个循环的 big-O 表示法
- 具有引用成员的结构是否具有唯一的对象表示形式
- 使用 int 表示浮点除法 C++
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制