在別人不會問問題時,引導他去問問題也是乙個很大的學問,jon與乙個程式設計師問的問題而展開。
如何將1千萬條記錄排序?(都是七位的**號碼)最好是將時間控制在十秒鐘左右,如果不行,幾分鐘也可以,但是不能超過十分鐘,同時不可超過一兆的記憶體。
jon先生要求我思考一分鐘,並給他乙個答案。我的答案有兩個,一是使用鍊錶的方式,運用插入排序的方法,二是使用規定排序的方法(儘管直至此時,我仍沒有成功的完成固定排序,但我推薦他這麼做的原因是其時間複雜度最低)下面向您簡述我了解到的歸併排序演算法的原理,首先將陣列分為兩部分,然後將ab兩部分分別排序,最後將ab兩部分合併為乙個陣列。
如下圖所示。
插入排序的過程如下:
將ab中待插入的元素作比較,將較小的插入l,然後將插入的陣列定位器後移,繼續比較兩個陣列的待插入元素,嗯,直到a與b中所有元素全部插入到l中,嗯,此時結束。當然以上並沒有說明如何將ab陣列排序,這裡其實有乙個很好的辦法,就是將其分割若干次,直至每個陣列都是單一元素陣列,那麼陣列遍都是排序排好序的陣列。
以上便是我的解答,非常奈斯!
下面是python的實現**。
def
marge
():pass
defmarge_sort
():pass
''' 實在是困得不行,明天再寫'''
而jon思考後的解決辦法是使用位圖,我覺得原因有以下幾點:
1千萬條記錄又是用一兆的記憶體直接執行的,怕是不行。
複習一下組成原理的知識。
1 byte = 8 bit
1 kb = 1024 byte = 8 * 1024 bit
1 mb = 1024 kb
1 gb = 1024 mb
1 tb = 1024 gb
二進位制數程式中,每個零或一就是一位。位就是bit。
假使這裡運用八位二進位制表示乙個數字,且每個**號碼都為7位,則有(1024×1024×8) / (8*7) = 143000(jon老師可能將1000視為1024)。
jon的另一種方法似乎可以存放更多的數,即每個號碼用32位二進位制表示,則有(1000×1000*8) / 32 = 250000,即1m可以存放250000個號碼,因為最大的7位數為9999999,便有9999999 / 250000 = 40。嗯,40次才能裝得下1000萬個**號碼。以上次多趟排序的空間大小分析,多趟排序的原理是第一趟排序中將0-250000之間的任何整數讀入記憶體,並對著25萬個整數排序,然後寫到輸出檔案中,重複40次則排序完成。
jon說此問題若是採用歸來排序可能需要幾天的時間(包括寫程式,除錯,執行。我覺得晚上回去可以試一下)。
點陣圖的方式更加簡明記,即將大小為n的數用1佔位表示第n個數是存在的,即array[1048256] = 1,即表示**號碼1048256存在。好了,下面來簡述一下jon的方法——點陣圖的方法:
第一步就是初始化乙個大小為一千萬的shuzu。
第二部遍歷輸入檔案。如果某個數存在則設其位置為1。
第三步,輸出答案。
哇哇。真的簡單明瞭,可惜可惜!為什麼我們早點想到這個方法,腦中是有閃過這個想法的。但是覺得不成熟也沒有在思考,而是轉念去想歸併排序這個方法了,是什麼原因?我覺得是思維不願意去思考的原因,前幾天還看了關於開發思維的書籍,裡面講的:同時從好幾個方面來思考方法。不要只從一面來思考。先不著急著否定了某個想法。先記下來。可惜可惜!
但是這個方法好像有問題。不是這個解法有問題,自己該用什麼資料結構的儲存,jon首先說用字串的方式。然後我說用陣列的方式,我覺得都可以。好的牛皮!
2.問:如何使用位邏輯運算子(如與,或,移位)來實現位向量?
珠璣程式設計讀書筆記 《一》
我看這本書是這樣的,你呢?也是偶然發現這本書的,好多書都沒能堅持看完,希望這次能堅持下去。第一章 問題描述 對磁碟檔案中的10000000個 號碼 7位數字 進行排序。約束 1mb的主存,磁碟空間充足,時間最多幾分鐘,10秒為最佳。我想,如果在面試的時候給我這個問題,我肯定不能給出乙個讓面試官滿意的...
《程式設計珠璣》看書筆記
臨睡前翻看了下 程式設計珠璣 續 這本書,看到第一章就被吸引了,效能監視工具這節從計算素數入手。題目是 列印所有小於1000的素數 簡單直白的方法就是,針對每個小於1000的數字n,從2開始到n 1,如果能被任意乙個數整除,那它就不是素數。如下 int prime int n return 1 in...
程式設計珠璣筆記1
乙個檔案裡有1千萬 10000000 個7位的整數 小於1千萬 給大約1m記憶體讓排序 向量旋轉 abcdefgh 長度n為8 向左旋轉i 3次 某檔案包含40億個隨機次序32位整數,其中有乙個整數未出現,找出來。限制 記憶體幾百位元組,若干順序檔案。乙個詞典有230000個單詞,file和life...