●算法复杂度

penwen 2004-01-09 10:28:06
有n个数组成的序列排序,在最坏情况下比较次数为f,证明f=O(nlgn)
...全文
74 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
GSK168 2004-01-09
  • 打赏
  • 举报
回复
MARK!
dengsf 2004-01-09
  • 打赏
  • 举报
回复
建立一棵决策树,其中非叶子节点表示“两个数比较”,连线表示上层节点的比较结果。
叶子节点表示,根据从根节点到该叶节点的比较轨迹,判断出来的 排序结果。
比如当比较3个数,分别是 a1,a2,a3。那么可以构建如下决策树:(a1:a2 > 表示 a1>a2; 最终结果从大到小排列)
a1:a2
/> \<=
a2:a3 a1:a3
/> \<= /> \<=
a1a2a3 a1:a3 a2a1a3 a2:a3
/> \<= /> \<=
a1a3a2 a3a1a2 a2a3a1 a3a2a1

叶子节点是n个数的一个排列,显然,会出现所有的排列。
所以,即使是最好的决策,决策树的叶子数必然 >= n!
注意决策树是完全二叉树,
所以,即使是最矮的决策树,其高度 h 也满足:
2^h >= n! > (n/e)^n
h >= nlogn - nloge
因此,排序的最优效率是 O(nlogn).
最坏情况下的效率 >= 最优情况下的效率 = O(nlogn)
gnefuil 2004-01-09
  • 打赏
  • 举报
回复
用快速排序,合并排序,复杂度都可以到O(nlogn)
qiu_xiaolin 2004-01-09
  • 打赏
  • 举报
回复
在最坏情况下,冒泡法跟快速分类法都是0(N*N)
快速分类法的平均特性才是0(nlogn)
短歌如风 2004-01-09
  • 打赏
  • 举报
回复
摘自严版《数据结构》:

由于含n个记录的序列可能出现的初始状态有n!个,则描述n个记录排序过程的判定树必须有n!个叶子结点。因为,少一个叶子,则说明尚有两种状态没有分辨出来。我们已经知道,若二叉树的高度为h,则叶子结点的个数不超过2^(h-1),反之,若有u个叶子结点,则二叉树的高度至少为upper_int(log(2,u)) + 1。这就是说,描述n个记录排序的判定树上必定存在一条长度为upper_int(log(2,n!))的路径。由此得到下述结论;任何一个藉助“比较”进行排序的算法,在最坏情况下所需进行的比较次数至少为upper_int(log(2,n!))。然而,这只是一个理论上的下界,一般的排序算法在n>4所需进行的比较次数均大于此值,直到1956年.H.B.Demuth首先找到了对五个数进行排序只需要七次比较的方法之后,Lester Ford和Selmer Johnson将其推广,提出了归并插入排序,在n<11时所用的比较次数和upper_int(log(2,n!))相同。根据斯待林公式,有O(lg(n!))=o(nlqn),上述结论从数量级上告诉我们,藉助于“比较”进行排序的算法在最坏情况下能达到的最好的时间复杂度为0(nlgn)。
dengsf 2004-01-09
  • 打赏
  • 举报
回复
我想楼主那个 O 应该是小写的 o 才对 :)
gnefuil 2004-01-09
  • 打赏
  • 举报
回复
to dengsf
这样只能证明算法复杂度的下界是O(nlogn)
就如你最后一行写的
“最坏情况下的效率 >= 最优情况下的效率 = O(nlogn)”
最坏情况是多少呢?是不是也能够到nlogn?

寻开心 2004-01-09
  • 打赏
  • 举报
回复

使用冒泡排序 时间是O(N*N) > O(nlgn)啊

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧