为什么需要两趟算法
两阶段多路归并排序算法
基于排序的两趟扫描算法
基于散列的两趟扫描算法
如果需要保存的待处理数据块数远远大于内存可用块数的时候?应该怎么办?
例如:内存 只有8块,如何排序70块的数据集?如何针对70块的数据集进行去重复操作,进行分组操作?
基本思想
第一趟: 划分子集(数据集),并使自己具有某种特性,如有序或相同散列值等
第二趟:
处理全局性内容的操作,形成结果关系.如多子集间的归并排序,相同散列值子集的操作等
基于散列的两趟扫描算法
大数据集上的操作 可否 等于 (子集上操作)的并集?
例如:元组在某一自己上无重复即相当于在全集上无重复
基于排序的两趟扫描算法
多个已按横向处理的子集上,纵向归并结果等同于在全集上的 处理结果,多个已排序的子集,纵向归并处理的无重复即等同于全集上的无重复
两阶段多路归并排序TPMMS
![在这里插入图片描述](https://img-blog.csdnimg.cn/5c5c9981aa5f4752b343abeff6848431.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAb09DcnlPbw==,size_20,color_FFFFFF,t_70,g_se,x_16
基本排序策略:
- Bproblem 块可划分N个子集合,使每个子集合的块数小于等于内存可用块数,即: B p r o b l e m / N < B m e m o r y B_{problem}/N<B_{memory} Bproblem/N<Bmemory.每个子集合都可以装入内存并采用内排序算法排好序并重新写回磁盘.
- 问题转化为:N个已排序子集和的数据怎么
更大规模数据集的排序问题 多趟/多阶段
A是正确的
正确选项是B,10000/100 是100 个子集,这100 个子集归并不下来,先做一个两路归并,再做一个99路归并
(1) 100/8 = 12块 读一遍,写一遍,子集合需要200块
(2) 七路归并, 排序需要(4+6*8)*2 = 104 次读写
(3) 七路归并,对于所有块进行排序 ,需要 200次读写
答案是B
答案是B