解決乙個排序問題
輸入:
乙個最多包含n個正整數的檔案,每個數都小於n,n=10^7,沒有重複資料,資料之間互不關聯。
輸出:
按公升序排列的整數列表。
約束:
最多有1mb記憶體空間可用,執行時間最多幾分鐘。
條件:
約束:
空間有限,需要用特殊方法表示資料集合
方法:
1. 普通歸併排序(讀入一次,工作檔案多次讀寫排序)
2. 利用條件特殊性,遍歷檔案40遍,每一次遍歷取從小到大的250000個資料,進行排序後輸出(讀取40次,輸出一次,不使用中間檔案)
3. 結合1,2,讀入一次,且不使用中間檔案
需要解決的問題轉化為:是否能用800w可用位來標示最多1000w個互異的整數,考慮合適的表示方式。
用位圖方法表示集合:
輸入資料為7位數,所以都小於1000w,使用乙個1000w位長的字串,當整數i在集合中時,第i位為1,否則為0.
將所有位置為0,初始化集合
讀入檔案中的資料,將相應位置的資料置為1
檢驗字串中每一位,若為1,就輸出該檔案。
第一章 開篇 程式設計珠璣 讀書筆記
在朋友的推薦下開始讀這本書。讀技術類的書有個習慣,先看下目錄並決定要精讀還是泛讀。感覺不錯,值得精讀。其中乙個不錯的方法就是寫讀書筆記,並堅持每一篇多多少少寫一些完整的 比如開篇的問題便是掌握和應用位運算的乙個很好的例子。作者巧妙地通過填充位圖 位向量 作為整數集合並遍歷完成排序的方式達到的時間和空...
《程式設計珠璣》第一章筆記
文章從乙個實際的問題開始 乙個 系統,7位數的 號碼,用1mb的記憶體空間將這些 號碼排序。分析 如果將這些 號碼看成int型別的整數,將其讀入記憶體中進行排序,int型別4個位元組,最多有10000000個 號碼,則需要40mb的記憶體空間,遠遠超出題目的要求,但是這10000000個資料有他們的...
第一章讀書筆記
本章內容主要講的是android系統移植和驅動開發概述,通過本章的學習知道了學習linux驅動程式設計一定要了解linux驅動只與linux核心有關,與客戶的使用的linux系統無關。也就是說,不管是那個linux系統,只要使用了同樣的linux核心,驅動就可以通過。唯一可以判斷的linux核心是否...