給你乙個檔案,裡面包含40億個整數,寫乙個演算法找出該檔案中不包含的乙個整數, 假設你有1gb記憶體可用。
如果你只有10mb的記憶體呢?
我們先來做個算術題,40億個整數大概有多大?
40 * 10^8 * 4b = 16gb (大約值,因為不是按照2的冪來做單位換算)
這個明顯無法一次性裝入記憶體中。但是,如果我們用計算機中的一位來表示某個數出現與否, 就可以減少記憶體使用量。比如在一塊連續的記憶體區域,15出現,則將第15位置1。 這個就是bit map演算法。關於這個演算法,網上有篇文章寫得挺通俗易懂的,推薦:
如果用bit map演算法,乙個整數用一位表示出現與否,需要的記憶體大小是:
40 * 10^8 b = 5 * 10^8 b = 0.5gb
而我們有1gb的記憶體,因此該演算法可行。由於bit map只能處理非負數, (沒有說在第-1位上置1的),因此對於有符號整數,可以將所有的數加上0x7fffffff, 將資料移動到正半軸,找到乙個滿足條件的數再減去0x7fffffff即可。 因此本文只考慮無符號整數,對於有負數的情況,按照上面的方法處理即可。
我們遍歷一遍檔案,將出現的數對應的那一位置1,然後遍歷這些位, 找到第乙個有0的位即可,這一位對應的數沒有出現。**如下:
#include #includeusing
namespace
std;
intmain()
//fclose(stdout);
freopen(
"12.3.in
", "r"
, stdin);
int int_len = sizeof(int) * 8
;
int bit_len = 0xffffffff /int_len;
int* bit = new
int[bit_len];
intv;
while(scanf("
%d", &v) !=eof)
bool found = false
;
for(int i=0; ii)
}if(found) break
; }
delete
bit;
fclose(stdin);
return0;
}
而我們有1gb的記憶體,因此該演算法可行。由於bit map只能處理非負數, (沒有說在第-1位上置1的),因此對於有符號整數,可以將所有的數加上0x7fffffff, 將資料移動到正半軸,找到乙個滿足條件的數再減去0x7fffffff即可。 因此本文只考慮無符號整數,對於有負數的情況,按照上面的方法處理即可。
接下來我們就可以用bit map演算法了。我們再遍歷一遍資料, 把落在這個塊的數對應的位置1(我們要先把這個數歸約到0到blocksize之間)。 最後我們找到這個塊中第乙個為0的位,其對應的數就是乙個沒有出現在該檔案中的數。 **如下:
#include #includeusing
namespace
std;
intmain()
fclose(stdin);
intstart;
for(int i=0; ii)
}freopen(
"12.3.in
", "r"
, stdin);
while(scanf("
%d", &v) !=eof)
}bool found = false
;
for(int i=0; i1; ++i)
}if(found) break
; }
delete
block;
delete
bit;
fclose(stdin);
return0;
}
架構 擴充套件性
擴充套件選和伸縮性 擴充套件性 指對現有系統影響最小的情況下,系統功能可持續擴充套件或提公升的能力。表現在系統基礎設施穩定不需要經常變更,應用之間較少依賴和耦合,對需求變更可以敏捷響應。它是系統架構設計層面的開閉原則 對擴充套件開放,對修改關閉 架構設計考慮未來功能擴充套件,當系統增加新功能時,不需...
CSS可擴充套件性
今日在寫pc官網的時候,一直對於html css的結構編寫完全按照自己的思維方式,今天把 交給老大的時候,被他指出很多編寫 的錯誤性,比如 結構,標籤的使用,語義化,css的可擴充套件性,由於 主要還是需要做seo優化,所以在標籤使用上也有些不合理之處,給了我一些建議,自己記錄以下 1 在html標...
具有高擴充套件性的儲存引擎 TokuDB
tokudb是什麼?tokudb是乙個應用在mysql和mariadb中的儲存引擎,它使用索引來加快查詢速度,具有高擴充套件性並支援hot schema modification。如果你的記錄數量過億 儲存舊的記錄或想要縮小資料占用的儲存空間,很適合使用tokudb。本文內容摘自 核心系統 插入效能...