從乙個演算法題學到的

2021-07-10 13:57:54 字數 810 閱讀 4606

《程式設計珠璣》

a題:給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中的32位整數。

1、在檔案中至少存在這樣乙個數?

2、如果有足夠的記憶體,如何處理?

3、如果記憶體不足,僅可以用檔案來進行處理,如何處理?

答案:1、32位整數,包括-2146473648~~2146473647,約42億個整數,而檔案中只有40億個,必然有整數少了。

2、如果採用位數思想來存放,則32位整數最多需要占用43億個位。約512mb的記憶體空間  (2^32/8=512mb)

可以採用位處理方法。然後判斷每個int是否等於-1。因為-1的二進位制表示是全1的。如果不等於-1。那麼說明某一位沒有置位。需要  進行處理。

3、記憶體不足,可以採用如下思想:

按最高位分為兩段,沒有出現的那個數,肯定在比較小的段裡面。

如果比較少的段最高位為1,那麼缺少的那個數的最高位也為1.

如果比較少的段最高位為0,那麼少的那個數的最高位也是0.

依次按以上方法去處理每個位。演算法複雜度為o(n)。每次處理的部分都是上一次的一半。累加之後是o(n).

收穫:從該問題中,思考問題方式的轉變是巨大的。

1、記憶體足夠的情況下,可使用位域位向量對每個數字進行標識(也可以用於對整數排序),降低了問題的複雜度。

2、記憶體不足的情況下,可以使用二分搜尋,(針對整數的二進位制表示,按位依次進行處理,每次都將問題規模減半)

擴充套件問題:

給定包含4 300 000 000個32位整數的順序檔案,如何找出乙個出現至少兩次的整數?

從乙個大學到了另乙個大學

掐指一算,從大隊培訓開始到現在整整乙個月了。進入工作崗位倆星期了。公司給我的感覺就是從乙個大學到了另乙個大學。今天和同事聊起來,都感覺對在深圳的兩個星期特別有感情。說起來也是一件很奇怪的事情,在壓力之下,一百來個互相不認識,隔了幾個代溝的人竟然能成為共患難的兄弟姐妹。今天買了床墊,發現沒有床墊中午午...

乙個演算法題

題目描述 某省會城市街道縱橫交錯,為了監控路燈的執行狀況,每條街道使用乙個數字字串標識該街道上所有路燈的執行狀況。假設路燈只有如下 3種狀態 分別用數字 0,1,2標識,一盞路燈只對應其中一種狀態 0 標識路燈熄滅 1 標識路燈開啟 2 標識路燈故障 請根據輸入的字串,找出該街道上連續的處於相同狀態...

乙個演算法題

關鍵字 演算法 有101塊金幣,其中一塊是假的,要求用無砝碼的天平稱兩次,判斷是真的金幣重還是假的重 答案 分三份,第乙份份五十個,第二份五十個,第三份份乙個。第一次 將兩份五十個分別放到天平兩端。如果天平是平的,證明第三份是假的。這時只要從真的裡拿出乙個,和假的分別放到天平兩端,就能知道假的是輕是...