Python 實現Bitmap資料演算法

2021-08-26 15:16:28 字數 1886 閱讀 6751

試想乙個問題,乙個陣列長度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 ...