algorithm - 查找算法执行的比较的渐近量
问题描述
我得到了以下算法:
Supersort(A, i, j):
if(j = i): return
if(j = i + 1):
if(A[i] > A[j]):
swap(A[i], A[j])
else:
k = floor of ( (j-i+1)/3 )
Supersort(A, i, j-k) // sort first two thirds
Supersort(A, i+k, j) // sort last two thirds
Supersort(A, i, j-k) // sort first two thirds again
而且我真的不确定如何分析该算法在最坏情况下会进行多少次比较。我不想给我答案,我什至不知道如何开始解决这个问题。谢谢你的帮助
解决方案
通常当你有一个递归函数时,你要做的第一件事就是获得一个递归关系。在您的情况下,当输入大小为 n 时,让 T(n) 成为超排序的成本。那等于什么?前两个 if stmts 只是常量, else 花费 T(2n/3)+T(n/3)+T(2n/3) 然后
T(n)=2T(2n/3)+T(n/3)+C
然后你解决那个重复。
更正:在这三种情况下,您使用 2/3。我认为其中之一是1/3。在这种情况下,递归更简单,可以使用主定理解决
T(n)=3T(2n/3)+C
推荐阅读
- prolog - Prolog 限制最小化错误。labeling/2 参数 1 错误
- windows - 如何自动化作为系统监视器的后台服务的功能测试?比如linux守护进程或者windows服务
- excel - AppActivate 不发送密钥或真正激活
- java - REST 调用抛出 java.io.EOFException
- php - PHP & sqlsrv:将格式化的查询行回显到表中
- ruby - 理解 Ruby 中的 Module.nesting 和 Module Nesting 的类型
- python - Python 剪刀石头布游戏不提供任何类型的输出
- c# - C# 远程 Windows 服务启动模式更改
- python - requests.request('POST' 和 request.post 之间的区别
- angular - 在Angular中如何将内容类型标头作为未定义传递?