問題:找出乙個不在檔案中的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位整數 在檔案中至少缺失乙個這樣的數 為什麼?在具有足夠記憶體的情況下,如何解決該問題?如果有幾個外部臨時檔案可用,但是僅有幾百位元組的記憶體,又該如何解決該問題?記憶體足夠的情況下,可以採用位圖法。即設一...