两个有序数组(有序段sorted run)简单归并算法的比较次数的分析
来源:互联网 发布:php的curlpath 编辑:程序博客网 时间:2024/05/29 04:29
假定有这样两个有序数组:
L1:{a1,a2,....an}
L2:{b1,b2,....bn}
简单归并,就是逐个比对,没有跳跃优化(skip)的。
最好的情况下,归并后的结果为{a1,a2,....an,b1,b2,...bn}或者{b1,b2,...bn,a1,a2...an}
比较的次数显然为n次。(n/2+n/2) ,出现前者或者后者的概率均为1/2
最坏的情况下,归并后的结果为{a1,b1,a2,b2....an,bn}或者{b1,a1,b2,a2,...bn,an}
不妨考察前者,L1或L2中任意一个(除bn以外)要想确定自己的位置,必须进行一次比较,因此总的比较次数为2n-1.
在考察平均情况:
假定归并后的结果为
{{b1,...br}{a1...an-1} || anbr+1...bn-1bn}
-----------------------------
这一块表示任意的b1..br共计r个来自L2的b序列,a1..an-1共计n-1个来自L1的a序列的数字组合成的一个串。
该串共计有C(r+n-1, r)种可能性。 这r+n-1个数每个数要想确定自己的位置都需要进行一次比较,因此比较次数是n+r次,而an和bn-r比,确定自己更小,还需要1次,因此总计的比较次数是n+r
归并后的结果总共有多少种可能呢?
相当于是C(2n,n),即在2n个L1序列中的元素和L2序列中的元素任意选n个。
其中bn排在最后的可能有C(2n,n)/2
{{b1,...br}{a1...an-1} || anbr+1...bn-1bn}这种情况(以bn做结尾)
因此在这种情况下的平均比较次数为
n-1
Σ (n+r)C(r+n-1,r)/(C(2n,n)/2) = 2n - 2n/(n+1)
r=0
平均的比较次数为(2n-2)/2 + (2n-2)/2 = 2n - 2 (最后一个可能是bn,也可能是an)
在平均情况下,比较次数只比最坏情况下少一次,这是不是很反直觉呢?可见归并中采用简单归并方法往往很低效。归并的方法在到排表求交中也会用到,以后再说。
- 两个有序数组(有序段sorted run)简单归并算法的比较次数的分析
- 两个有序数组归并的平均比较次数的定量分析
- 实现两个有序数组的归并
- 归并两个有序数组
- 算法练习4.Median of Two Sorted Arrays两个有序数组的中位数(递归、分治)
- 两个有序数组相关的算法
- 两个有序数组的合并算法
- 算法:两个有序数组的合并
- 两个有序数组的中位数 【算法】
- 将有序数组 归并排序 最多与最少比较次数
- 有序列表的归并算法
- 有序单链表的归并算法
- 合并两个有序数组(归并排序)
- 如何对数组的两个子有序段进行合并
- 对数组的两个子有序段进行合并
- Java合并数组的两个子有序段
- 两个有序数组的中位数 Median of Two Sorted Arrays
- 两个有序数组的中位数
- JNI unicode jstring to char*
- 文本文件保存为二进制文件
- 别人支持大容量SD的办法——收集
- 安装gdb6.8 insight6.8 gdb insight
- javah 命令使用
- 两个有序数组(有序段sorted run)简单归并算法的比较次数的分析
- 2440支持大容量SD卡的解决办法
- 批量改名
- cFileCtrl 类
- java jni 列子
- Oracle10g下简单存储过程编写
- 谈用户体验
- The ABAP Runtime Trace (SE30) - Quick and Easy
- 如何获取资源分?