程式設計珠璣第二章ABC

2021-09-14 07:01:57 字數 2828 閱讀 4557

問題:找出乙個不在檔案中的32位整數。

注意:題目中沒有說,這40億個數是否是含有重複的資料

條件限制:

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

2、如果記憶體僅有上百位元組(記憶體不足)且 可以用若干外部臨時檔案,如何處理?

舉例:比如abcdef 左移三位,則變成defabc

條件限制:空間限制:可用記憶體為幾十位元組

時間限制:花費時間與n成比例

舉例:abc 的變位詞為:abc acb bca bac cba cab 

~~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~~

問題:找出乙個不在檔案中的32位整數。

條件限制:

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

2、如果記憶體僅有上百位元組(記憶體不足)且 可以用若干外部臨時檔案,如何處理?

思路:由於2^32 = 4 294 967 296個資料,超過給出的40億,所以肯定有資料不在檔案中。

1、如果給出的記憶體是沒有限制的

思想:我們可以使用位圖法,尋找不在檔案的數

申請的空間為(2^32)/8 = 最大數/乙個位元組可以表示8位 = 2^29b = 2^9mb = 512mb記憶體

之後,使用位圖法。此時出現次數為0的資料為缺失的整數

2、如果記憶體僅有上百位元組(記憶體不足)且 可以用若干外部臨時檔案,如何處理?

思想:類似二分查詢。可以根據某一位(操作時,可以從最高位 到 最低位依次處理),把待處理的資料分成兩部分。在一部分中,此位為0,另一部分此位為1。

之後,分別統計落在兩個部分的數的個數。(此時我們不考慮資料是否重複)

如果,沒有缺失,那麼這兩部分數的個數應該是相等的。

如果,資料有缺失,那麼兩部分數可能相等,也可能不等

兩部分相等的情況:兩段都缺失,但缺失的個數相等

兩部分不等的情況:乙個缺乙個不缺  或  都缺但缺的個數不同 

基於此,把資料分成兩部分後,我們可以去資料量小的那個部分尋找缺失的數。如果兩個部分的數相等,我們可以隨意選擇乙個部分尋找缺失的資料。此時,可以遞迴的處理緊挨著的下一位。直到遍歷完所有的位後,就可以找到乙個缺失的數

package algorith.程式設計珠璣.第二章;

/** * @classname 找缺失的數

* @description todo

* @date 2019/4/6 8:48

* @created by 大大

*/public class 找缺失的數

else

}if (locone > loczero)//該bit位上是1的總數 大於 是0的總數

else

}return lostnum;

}public static void main(string args) ;

*/ /*int len = 1;

int maxbits = 1;

int arr[10] = ;*/

int len = 15;

int maxbits = 4;

int arr = ;

int lostnum = 找缺失的數.findlostnum(arr,len,maxbits);

system.out.println(lostnum);

}}

舉例:比如abcdef 左移三位,則變成defabc

條件限制:空間限制:可用記憶體為幾十位元組

時間限制:花費時間與n成比例

將前n個元素複製到乙個臨時陣列,再將後面的依次前移,最後將臨時陣列加上,時間複雜度o(n),但需要額外的n空間

如abcd->bcda->cdab->dabc 不需要額外的空間,但時間複雜度o(n^2)

直觀的想法:先區域性翻轉,在整體翻轉

字串abcdefgh->cba defgh ->cba hgfed -> defghabc 時間複雜度o(n)

需要三步:

reverse(0,i-1); //cba defgh

reverse(i,n-1); //cba hgfed

reverse(0,n-1); //defghabc

**:#include #include #include using namespace std;  

void reverse(char* str,int start,int end)} 

/*把字串迴圈左移k位*/

void leftrotatestring(char* str,int k)

int main()

if (m % n == 0)

else }

//*把字串迴圈左移k位*/

void leftrotatestring(char* str,int k)

str[first] = tmp;//臨時變數中儲存每一趟的迴圈的最後乙個字元 }}

int main()

{ //char str[81] = "abcde";

char str[81] = "abcdef";

leftrotatestring(str,3);

cout《三、給出乙個英語字典,找出所有變位詞集。

舉例:abc 的變位詞為:abc acb bca bac cba cab 

思想:1、為每乙個單詞生成乙個標籤,並使所有的變位詞有相同的標籤

2、根據標籤收集單詞,每乙個標籤對應乙個集合,這個集合包括其所有的變位詞

每個單詞標籤的生成:把這個單詞所包含的字母,按照字母順序排列。這樣,所有變位詞的標籤就全相等了。

如mississippi可以寫成i4m1p2s4 

可以用鍵值對記錄每個字元出現次數,變位詞不管則麼變,每個字元出現次數是固定的只是順序不同

程式設計珠璣第二章

a題給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中一32位整數。1 在檔案中至少存在這樣乙個數?2 如果有足夠的記憶體,如何處理?3 如果記憶體不足,僅可以用檔案來進行處理,如何處理?答案 1 32位整數,包括 2146473648 2146473647,約42億個整數,...

程式設計珠璣第二章總結

分析 如果記憶體足夠的話,可以採取第一章的點陣圖排序法,以o n 的效率就可以解決。如果記憶體不足的話,但是有幾個外部檔案可以儲存資料,那麼就可以採用二分查詢的思想來解決問題 這裡的思路比較巧妙,它不是通常意義上的二分查詢,但是思維模式很相似.我們可以通過掃瞄輸入檔案,將第一位是0的寫入乙個檔案,將...

《程式設計珠璣》第二章 「啊哈!演算法」

三個問題 1.給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中的32位整數 在檔案中至少缺失乙個這樣的數 為什麼?在具有足夠記憶體的情況下,如何解決該問題?如果有幾個外部臨時檔案可用,但是僅有幾百位元組的記憶體,又該如何解決該問題?記憶體足夠的情況下,可以採用位圖法。即設一...