java - while循环内排序的时间复杂度
问题描述
我正在尝试使用以下伪代码了解算法的时间复杂度:
让 nums 有数字的 ArrayList
sort(nums)
while(nums.size() > 1) {
// remove two elements
nums.remove(0);
nums.remove(0);
nums.add(some_number);
sort(nums);
}
sort(nums)
是(N)Log(N)
。
nums.remove(0)
是O(N)
nums.add()
是O(1)
现在这个算法的时间复杂度是多少。
解决方案
最后的复杂性是O(n² log n)
因为您执行n
了多次操作O(n log n)
。
请记住,估计复杂度 ( O(...)
) 与确定操作总数不同(通常时间函数T(...)
由总操作数给出),它们是两个不同的概念。一个很好的介绍可能是算法分析
因此,O(...)
符号是一个上限,但却T(...)
是真正的步骤。
您可以尝试精确计算T
函数,或者您可以通过改进 降低上限O
,但它们始终是不同的函数,O
适用于所有可能条目的最坏情况。
在您的代码中,我们不知道T
sort 函数,只有它们的上限是O(n log n)
,然后:
T(n) ≤ O(n log n) + T(3) + O((n - 1) log (n - 1)) + T(3) + O((n - 2) log (n - 2) + ...
T(n) ≤ O(n log n) + n T(3) + n O(n log n)
^^^^^^^^^
在这里,我们无法准确定义对, , ...T
的排序操作,这就是为所有这些操作建立更高级别的原因。然后:n-1
n-2
O(n log n)
T(n) ≤ O(n log n) + n T(3) + n O(n log n)
T(n) ≤ O(n log n) + O(n) + O(n² log n)
T(n) ≤ O(n² log n)
在第二个表达式中,我们有固定数量的上界,在这种情况下,上界将是上界的最高值。
(删除、删除和添加 is T(3)
,goto
比较被忽略)
推荐阅读
- ios - Xcode:项目的 Swift 版本与可可豆荚的 Swift 版本
- node.js - ssh2-sftp-client 一遍又一遍地获取相同的文件
- python - ASDL 代表什么?
- javascript - 防止右键单击元素打开上下文菜单
- reactjs - 如何在材质ui的主题覆盖中覆盖所选颜色以进行反应
- angular - 创建 Angular 4+ 组件的性能开销是否克服了单元素模板的可重用性优势?
- javascript - ReactJs 子组件未通过 Props 更新
- git - git-svn 不能重写 git 历史吗?
- android - 如果您让 Google 管理密钥,您可以从 Google Play Console 下载/访问您的 Android 应用签名密钥吗?
- javascript - 试图制作一个按钮以仅显示具有值集或变量的项目