algorithm - 多个条件的for循环的时间复杂度是多少
问题描述
我试图开发一种解决方案,以将 O(n^2) 或 O(n*m) 算法的时间复杂度降低到 O(n) 或 O(n+m) 算法。例如:
let arr = [[1, 2], [1, 2, 3], [1, 2, 3, 4, 5, 6, 7, 8]];
let x = 0;
let len = getArrayMaxLength (arr) //Get the maximum length of a 2d array which in this example is 8.
for (let i = 0; i < len && x < arr.length; ++i) {
print (arr [x][(i % arr [x].length);
if ((i + 1) % arr [x].length == 0) {
++x;
if (x != arr.length) i = -1;
}
}
我在确定这个算法的 Big-O 时遇到了问题,因为我从来没有处理过这么多条件的循环。我已经阅读了这个和这个,但仍然不太正确。据我了解,时间复杂度将是 O(n+m)。其中 n 是 [arr.length],m 是 [len],它是上述函数 getArrayMaxLength 的输出。
所以总结一下。算法的时间复杂度是多少?谢谢你。
解决方案
请注意,每次 for 循环到达内部数组的末尾时,计数器(变量i
)都会重置并且您增加x
,传递到下一个内部数组。这意味着您将遍历二维数组的每一个元素,程序输出证实了这一点。
尽管n+m
复杂性看起来不错,但实际上是一个糟糕的近似值。在实践中,复杂性总是更大,因为数组长度不同。假设所有子数组的长度相同,所以n = m
. 当您访问 n 个内部数组中的每一个的 n 个元素时,总复杂度将是二次的 ( n*n
) 而不是线性的。当您使用大型阵列时,这种差异变得非常明显。
总之,时间复杂度为O(n*m)
。
推荐阅读
- c# - 在 Knockoutjs 中动态添加行
- python - re.sub() 如何改变不可变的 Python 字符串?
- laravel - Laravel 在条件下在路由中加载中间件
- android - Google 的 SupportMapFragment 类型转换异常与 v4 Fragment
- angular - 无法使用量角器单击按钮。按钮文本在子范围内
- python - 使用 dtreeviz 可视化决策树
- git - git不会在子文件夹中添加内容
- python-3.x - PySimpleGUI 中 return_keyboard_events 的意外行为
- javascript - 如何在环回查询中搜索整个字符串中的字符串
- properties - mapbox中多面体中每个多边形的不同颜色