![](/img/trans.png)
[英]Limitations of using binary_checksum() to represent a URL or similar string?
[英]Represent of a collection of binary data
我正在處理其中樣本包含Float
的信號。 我編寫的某些算法僅需要知道信號何時穿過x軸(即,正值變為負值,反之亦然)。 當我執行這些操作時,我意識到我不需要知道每個樣本的實際Float
值。 我只需要知道樣本的值是否為正即可。
我最初將信號表示為Float
的Vector
。 發現之后,我開始將其表示為Boolean
值的Vector
(即, False
(負)值, True
(正)值)。 事實證明,這要高效得多,而且我在運行時和內存消耗方面都提高了程序的性能。
我仍然想知道是否沒有一種更有效的方式來表示這種“二進制數據集合”。 就像一個Bit Vector
或Bit Array
。 我在Hackage上找到了BitArray ,但它似乎不支持Vector
所具有的相同功能。
是否有一種更有效的方式來表示用例的數據,還是應該堅持使用Boolean
值Vector
?
vector
和array
程序包中分別提供了每字節1個布爾值和每比特1個布爾值選項。
首先,來自Data.Vector.Unboxed
的Vector Bool
使用一個字節數組,每個Bool
一個字節。 可以從Data.Vector.Unboxed.Base
模塊中的源進行驗證,其中Vector Bool
定義為:
newtype instance Vector Bool = V_Bool (P.Vector Word8)
和獲取和設置是通過以下功能來實現的:
fromBool :: Bool -> Word8
toBool :: Word8 -> Bool
另外,也可以通過對程序進行概要分析來直接對其進行驗證:
import Data.Vector.Unboxed as V
main = let v = V.replicate 1000000000 True
in print (v ! 5)
並觀察到它分配的剛好超過1,000,000,000個字節。
第二,一個UArray Int Bool
從Data.Array.Unboxed
被實現為位向量,其中一個Bool
每比特。 相關源位於Data.Array.Base
,您可以在其中查看實例中使用的位操作:
instance IArray UArray Bool where
...
unsafeAt (UArray _ _ _ arr#) (I# i#) = isTrue#
((indexWordArray# arr# (bOOL_INDEX i#) `and#` bOOL_BIT i#)
`neWord#` int2Word# 0#)
同樣,這可以通過分析直接驗證:
import Data.Array.Unboxed as A
main = let v = A.listArray (1,1000000000) (repeat True) :: UArray Int Bool
in print (v ! 5)
並確認它分配了大約125,000,000字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.