試想乙個問題,乙個陣列長度10億,查詢某乙個數字是否在其中,怎麼計算?
首先常規的查詢演算法不能直接用了,這就需要用上我們的bitmap演算法了。
什麼是bipmap演算法呢?
假如在8位的電腦中(懶的打0 ,就不舉例32位的電腦),數字1 ,在計算機的表示為00000001,數字5在計算機中為00000101,假如我有個陣列為a= [0,1,5,7],現在我們需要開闢乙個記憶體儲存a ,但是在資料量巨大的情況,一台膝上型電腦根本沒法實現,這個時候辦法來了,我們用8位電腦00000000,分別表示是否含有7,6,5,4,3,2,1,0 這幾個數字,如果有7 ,上述記憶體的數值就是10000000,那麼對應a陣列就為,10100011,這樣1bit就可以存下乙個陣列
(同樣在32位中可以這樣做)。
具體如何用python實現bitmap演算法:
#coding=utf8
class
bitmap
(object):
def__init__
(self, max):
self.size = self.calclength(max) + 1
self.array = [0]*self.size
defcalclength
(self, num):
return int((num + 31 - 1) / 31) #這裡有向上取整和向下取整的區別
defcalcbyteindex
(self, num):
return num % 31
defcount
(self, num):
eindex = self.calclength(num)
# print eindex
bindex = self.calcbyteindex(num)
elem_num = self.array[eindex]
self.array[eindex ] = elem_num | (1
<< bindex )
deferase
(self, num):
eindex = self.calclength(num)
bindex = self.calcbyteindex(num)
elem_num = self.array[eindex]
self.array[eindex] = elem_num & (~(1
<< bindex))
deftest
(self, num):
eindex = self.calclength(num)
bindex = self.calcbyteindex(num)
if self.array[eindex ] & (1
<< bindex):
return
true
return
false
if __name__ == '__main__':
train_array = [5, 12, 738, 385, 617, 91, 8, 0, 30, 23, 46,1036]
max_value = max(train_array)
sort_array =
bitmap = bitmap(max_value)
for num in train_array:
bitmap.count(num)
for num in range(max_value + 1):
if bitmap.test(num):
print sort_array
BIT MAP的簡單實現
主要是參考guisu同學的 確實很漂亮 我是顯得主要功能是把txt中存在的ip位址在map中的位元位置1,從而方便後續的判斷,判斷是否出現過ip欄位,其中上篇文中自己津津樂道的strtok 竟然被淘汰了啊,我都不知道,這裡換成了strseq char char 這裡使用的時候注意char 指向的內容...
使用Bitmap實現排序
使用bitmap實現排序,是通過在bitmap將待排序列表中的數值位標記為1,然後順序輸出bitmap的標記位實現排序的方法。具體來說,分為兩步 1 迴圈待排序列表,i 表示待排序列錶值。bitmap i 1 二 實踐篇 參考一篇python實現的bitmap encoding utf 8 auth...
golang之路 bitmap 實現
介紹一下bitmap的思想 情景1 有些時候我們為了判斷乙個某個元素是否存在乙個集合中,普通的方式是map int x儲存。資料量小的時候還可以 待資料量龐大的時候,比如我們判斷某人的momoid是否在某個momoid切片中,儲存就悲劇了。算一下 乙個int 4byte 倘若儲存500w個資料 4 ...