9.4-外部排序+k路歸併
轉自http://hawstein.com/posts/9.4.html
k路歸併可以參考leetcode題:http://blog.csdn.net/todorovchen/article/details/26366553
當面試官說到2GB檔案的時候,他其實就是在暗示你, 他並不希望一次性把所有的資料都載入記憶體。這樣子的話,我們要怎麼做呢? 我們每次就將部分資料載入記憶體就好了。
演算法:
首先我們要了解,可以用的記憶體有多大?假設我們有X MB的記憶體可用。
- 我們將檔案分為K份,其中X*K=2GB。每次取其中一份載入到記憶體中, 用O(nlog n)的演算法排序,然後再儲存到外部檔案。
- 載入下一份並排序
- 當我們將K份小檔案都排好序,合併它們。
上面的演算法就是外排序,步驟3又稱為N路歸併。
使用外排序是由於資料太大了,無法一次全部載入到記憶體中,所以需要藉助磁碟進行儲存, 每次只從磁碟中載入一部分資料進入記憶體,進行排序。
相關推薦
9.4-外部排序+k路歸併
轉自http://hawstein.com/posts/9.4.html k路歸併可以參考leetcode題:http://blog.csdn.net/todorovchen/article/details/26366553 當面試官說到2GB檔案的時候,他其實就是在暗
微軟筆試題 大型檔案外部排序(二路歸併和k路歸併的實現和比較)
這兩種排序方法都是先將一個無序的大的外部檔案,分成若干塊,分別讀到記憶體中。 將每一塊都先排好序,放到一個新的外部檔案中。 二路歸併的思路是每次將外部排序的檔案兩兩合併,變成一個二倍大小的檔案,然後對二倍大小的檔案繼續兩兩合併。直到最終合併為一個檔案為止。k路歸併是將外部排
(9-4) 快速排序
快速排序是目前應用最廣泛的排序演算法。但快速排序是一種不穩定的排序演算法。 快速排序演算法是C.R.A. Hoare於1962年提出的一種劃分交換的方法,它採用分治法(divide and conquer)進行排序。其基本思想是任取待排序元素序列中的某個元素(例如取第一個元素)作為基準,按照該元素的
資料結構-陣列排序-二路歸併-迴圈實現-C語言
/* * * 歸併排序-迴圈實現 * * */ #include <stdio.h> #include <stdlib.h> void Merge(int Element[],int TmpA[],int L,int R,int RightEnd){
java實現排序演算法之歸併排序(2路歸併)
歸併排序:“歸併”的含義就是將兩個或兩個以上的有序表合併成一個新的有序表,假定待排序表含有n個記錄,則可以看成是n個有序的子表,每個子表的長度為1,然後兩兩歸併,得到n/2個長度為2或1的有序表,然後在兩兩歸併,如此重複,直到合併成一個長度為n的有序表為止,這就是2路歸併
演算法導論最小堆實現k路歸併
問題:請給出一個時間為O(nlgk),用來將k個已排序連結串列合併為一個排序連結串列的演算法。此處的n為所有輸入連結串列中元素的總數。(提示:用一個最小堆來做k路合併) 程式設計思路: 假設k個連結串列都是非降序排列的。 (1)取k個元素建立最小堆,這k個元素分別是
2017多校第一場 HDU 6041 I Curse Myself Tarjan找環+K路歸併
Problem Description There is a connected undirected graph with weights on its edges. It is guaranteed that each edge appears in at
改進的二路歸併排序(演算法4)
文章目錄 簡述 改進辦法 執行結果 簡述 我們常見的二路歸併排序基本上分為兩步,時間複雜度為 O
【排序演算法】外部排序二 —— 外部排序技術之多路歸併
外部排序技術之多路歸併 重點:敗者樹的建立調整函式 1.外部排序概述 外部排序指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。外部排序最常用的演算法是多路歸併排序,即
演算法問題分類---Top-K問題與多路歸併排序
Pro1:尋找前K大數 方法1:K小根堆 後面的值若大於當前根,則替換之,並調整堆 大部分人都推薦的做法是用堆,小根堆。下面具體解釋下: 如果K = 1,那麼什麼都不需要做,直接遍歷一遍,時間複雜度O(N)。 下面討論K 比較大的情況,比如1萬。 建立一個小根堆,則根是當
[4] 算法之路 - 插入排序之Shell間隔與Sedgewick間隔
取出 然而 int edge lsh 分享 間隔 使用 des 題目 插入排序法由未排序的後半部前端取出一個值。插入已排序前半部的適當位置。概念簡單但速度不快。 排序要加快的基本原則之中的一個: 是讓後一次的排序進行時,盡量利用前一次排序後的結
排序之二路歸併排序
分治思想 //歸併 void Merge(int R[],int left,int right) { int mid=(left+right)/2; int *p=(int *) malloc(sizeof(int)*(right-left+1))
【UVA11997】K Smallest Sums 優先佇列的多路歸併問題
背景 給你個有序列表(假設非降序),將其合併為一個列表(這為《演算法導論》上堆部分一道例題) 一種策略是建立一個大小為的小根堆,每個序列第一個元素入堆,標記每個元素所屬佇列. 依次取出,取出後若對應序列還有元素,則加入堆中否則不加入或者加入. PS:歸併排序的歸併過程
歸併排序(2路歸併)
要點 時間複雜度:平均情況O(nlogn);最好情況(nlogn);最壞情況O(nlogn) 空間複雜度:O(n) 歸併排序是一種穩定的排序方式 基本思想:假設初始序列含有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然後兩兩歸併,得到[n/2
歸併排序 && 外部排序
基本思想 先對資料進行均分------>左右兩半部分------->均分到左右部分已經有序------>歸併 歸併排序核心步驟: 分組 歸併 MergeSort.h #ifndef __MERGESORT_H__ #define __MERG
二路歸併排序(未完)
注:歸併演算法是典型的分治法例項,即將一個大問題分解為n個原子問題(不可再分割),將這n個小問題解決後再逐漸合併,一般使用的是遞迴法。歸併排序是一種交穩定的排序演算法,時間複雜度固定式nlogn,但在實際操作中,其時間複雜度將會遠遠大於該值,因為在程式碼執行過程中不停的申請臨時記憶體和釋放記
java 實現二路歸併排序
歸併排序:是指將兩個或兩個以上有序的數列(或有序表),合併成一個仍然有序的數列(或有序表) 程式碼實現二路歸併排序如下: public class MergeSort { /*二路歸併演算法
多路歸併排序【JAVA實現】
對遠遠大於記憶體的資料進行外排序,在多路比較的時候用敗者樹效率會更高。 這個演算法可以在建立倒排索引的時候使用 package my.sort; import java.io.BufferedInputStream; import java.io.BufferedOu
python二路歸併排序實現法
歸併原理: 第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 第二步:設定兩個指標,最初位置分別為兩個已經排序序列的起始位置 第三步:比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置 重複步驟3直到某一指
【Java常用排序演算法】歸併排序(二路歸併排序)
歸併排序的思路 歸併排序是通過“歸併”操作完成排序的,將兩個或者多個有序子表歸併成一個子表。歸併排序是“分治法”的一個非常典型的應用,同時它也是遞迴演算法的一個好的例項。它將問題分成一些小的問題然後遞