在python中使用BitMap排序

2021-10-11 04:09:27 字數 2672 閱讀 9158

使用bitmap對整數陣列排序時首先我們要分配這個bitmap的大小,獲取陣列中的最大整數 m,m//31+1 除以31向上取整,比如乙個未排序陣列最大數不超過60,那麼得到結果為2,意思是我們需要兩個int型資料大小的空間來存放這個陣列。

bm=[a[0],a[1]] ,a[0]和a[1]就是我們申請到的資源,a[0]的0-31位分別表示整數的0-31,a[1]的0-31位分別表示整數的32-63,排序時只需將陣列中元素對應bit位的0置為1即表示該整數存在,一趟下來每個陣列中的元素都在對應的bit位被置為1.我們輸出排序結果時只需按順序輸出為1的bit位的索引即可。比如a=[1,5,3,4,7,8,15,6,9] 我們只需用16位的bit即可表示全部整數,他們在bitmap中的位置應該是這樣的「1000001111111010」 從左往右數為1的位置索引就是1,3,4,5,6,7,8,9,15這就是a的排序結果。

import bitmap

print

(dir

(bitmap)

)#result:['bitmap', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'bitmap']

[finished in

0.3s]

首先引引入bitmap模組,使用dir檢視有哪些屬性,bitmap這個應該就是類,我們可以使用它來建立乙個bitmap物件。

from bitmap import bitmapa=[

1,5,

3,4,

7,8,

15,6,

9] bm=bitmap(

max(a)

)print

(dir

(bm)

)print

(bm.tostring())

for i in a:

bm.set(i)

print

(bm.tostring())

print

(bm.nonzero())

#['bitmask'

,'bit_cnt'

,'__class__'

,'__del__'

,'__delattr__'

,'__dict__'

,'__dir__'

,'__doc__'

,'__eq__'

,'__format__'

,'__ge__'

,'__getattribute__'

,'__getitem__'

,'__gt__'

,'__hash__'

,'__init__'

,'__init_subclass__'

,'__le__'

,'__lt__'

,'__module__'

,'__ne__'

,'__new__'

,'__reduce__'

,'__reduce_ex__'

,'__repr__'

,'__setattr__'

,'__setitem__'

,'__sizeof__'

,'__str__'

,'__subclasshook__'

,'__weakref__'

,'all'

,'any'

,'bitmap'

,'count'

,'flip'

,'fromhexstring'

,'fromstring'

,'none'

,'nonzero'

,'reset'

,'set'

,'size'

,'test'

,'tohexstring'

,'tostring'

]0000000000000000

1000001111111010[1

,3,4

,5,6

,7,8

,9,15

]

我們先引入bitmap包下的bitmap類,例項化乙個bm物件,bitmap初始化時傳入的引數值為我們需要排序的陣列中的最大值,他可以幫我們自動分配所需的最小位數。bm此時應該是16位的0,使用dir(bm),可以發現它有三個方法set、tostring和nonzero字面意思理解為轉為字串,非零位,我們使用set(陣列中的元素值),將a中的元素全部存入bm的bit位置為1,使用bm.tostring()方法可以看到每乙個為1的位對應的索引就是a中的元素的值。只需輸出這個為1的索引列表即為我們的排序結果。nonzero方法就是封裝好的方法。

該演算法為解決大量的資料排序而生,如乙個10g的檔案,每行都為數字,想要對它進行排序,我們要考慮記憶體不夠的情況,如果使用bitmap排序則可以大大減少空間資源使用。

bitmap的缺點如果我們需要排序的元素數量過少且間隔過大,就容易造成空間浪費,比如乙個陣列只有[1,100000]兩個元素,使用bitmap就很浪費空間。

bitmap無法保留陣列中的重複元素,因為每個位置只能儲存乙個資料,若兩個相同的資料都在a中,經過bitmap排序後的輸出只會有乙個,這也可以算作它的優勢幫我們自動去重。

以上僅為個人理解,有不對的地方也請賜教。關於bitmap的更多用法後續有用到再做**。

在python中使用websocket

介紹一款很帥的外掛程式autobahnpython,通過它可以在python中很方便的使用websocket進行通訊 基於twisted框架 這個外掛程式真正強大的地方是它提供了乙個 發布 訂閱模式,具體內容有空再寫,先簡單介紹一下如何建立傳統的連線。建立伺服器 必須的模組 from twisted...

在Python中使用 slots

這篇文章主要介紹了在python中使用 slots 方法的詳細教程,slots 方法是python的乙個重要內建類方法,基於python2.x版本,需要的朋友可以參考下 正常情況下,當我們定義了乙個class,建立了乙個class的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。...

with語句在Python中使用

引言 with語句生於python2.5,通過 from future import with statement 匯入後使用 2.6以後無需匯入直接使用 with 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的 清理 操作,釋放資源 用途 最常用的兩個地方,檔案使用後...