数据结构——外部排序
来源:互联网 发布:mac电脑itunes安装ipa 编辑:程序博客网 时间:2024/05/16 00:31
之前有写过内部排序,这次看到严蔚敏老师的书上还介绍了外部排序,就一起记录一下,以便以后可以看看:
1.外部排序
外部排序是指数据量很大,一下子不能将所有的数据放入内存里面进行排序,只能一部分一部分从硬盘中读取数据,送入内部排序,将内部排序的结果取出,换下一批数据进行排序。
对于外部排序的提高的核心问题是:减少外部存储读写的次数。在一般情况下,对m个初始归并段进行K-路平衡归并,归并的趟数:s=以k为底,m的对数结果的向上取整值。
2.多路平衡归并的实现
由于K的增加能够减少m便能减少存储读写的次数,但是k的增加,内部归并时间也会增大,这样不是我们所希望的。所以我们在内部排序的时候如果能选择一种算法将不随K的选择而增加内部排序的时间的话,那就是比较好的,这就是”败者树“,看一下败者树的定义:在对一个序列进行初始堆的建立,然后每次让子孩子的大的去上一次,这样的过程就是构建一个败者树。
败者树的核心代码:
void Adjust(int s){int t=(s+k)/2;int temp;while(t>0){if(External[s] > External[LoserTree[t]]){temp = s;s = LoserTree[t];LoserTree[t]=temp;}t=t/2;}LoserTree[0]=s;}void CreateLoserTree(){External[k]=MINKEY;int i;for(i=0;i<k;i++)LoserTree[i]=k;for(i=k-1;i>=0;i--)Adjust(i);}void K_Merge(){int i,p;for(i=0;i<k;i++){p = A[i].pos;External[i]=A[i].arr[p];//cout<<External[i]<<",";A[i].pos++;}CreateLoserTree();int NO = 0;while(NO<count){p=LoserTree[0];cout<<External[p]<<",";NO++;if(A[p].pos>=A[p].num)External[p]=MAXKEY;else {External[p]=A[p].arr[A[p].pos];A[p].pos++;}Adjust(p);}cout<<endl;}
3.置换—选择排序
在整个排序的过程中,选择最小的关键字和输入、输出交叉或平行进行。
过程:
假设初始待排序文件为FI,初始归并段文件为输出文件FO,内存工作区为WA,FO与WA的初始状态为空,并假设内存工作去WA的容量可容纳w个记录,则置换-选择排序的操作的过程为:
当然由于置换选择排序出来的结果可能使得每个段不一样,这样用K路平衡归并树似乎不是很好,所以选择可以选择用哈夫曼树,这样构造的树称为最佳归并树。
0 0
- 数据结构——外部排序
- 数据结构——外部排序
- 数据结构实践项目——外部排序
- 数据结构-外部排序
- 【排序算法】外部排序一 —— 外部排序介绍
- 数据结构 外部排序 多路归并排序
- 外部排序基石——合并排序
- C++代码,数据结构-外部排序-败者树
- 四、重温数据结构之外部排序
- 数据结构——排序
- 数据结构——排序
- 《数据结构》——排序
- 数据结构——排序
- 数据结构—排序算法
- 数据结构—希尔排序
- 数据结构—排序总结
- 数据结构 — 归并排序
- 数据结构 — 堆排序
- java中的事务
- 2015多校第5场总结
- Notification and Toast comments
- C6678的SPI Flash启动失败
- 专题网站
- 数据结构——外部排序
- 通过分析 JDK 源代码研究 Hash 存储机制
- Deep learning系列(十四)Layer和solver中参数详解
- Weblogic Jms简单应用
- OS X EI Captain安装Cocoapods问题
- SQL Server 查询条件是中文查不出来
- 如何自动备份及运行某个Sql语句
- angularjs依赖服务注入写法的注意点
- Eclipse反编译工具Jad及插件JadClipse配置