使用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 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的 清理 操作,釋放資源 用途 最常用的兩個地方,檔案使用後...