我想要一種數據類型,可以讓我有效地跟蹤已經「添加」到的對象,從而允許我測試成員身份。我不需要任何其他功能。是否有一個不存儲值的類Set對象?
據我所知,Python沒有這樣的數據類型。最接近我想要的是集合,但集合將始終存儲值(我不需要)。
目前最好的我可以拿出每個對象的hash()
並將它存儲在一個集合中,但是在較低層次上正在計算散列的散列值,並且散列字符串被存儲爲一個值。
有隻使用集的低級別的查找功能,而無需實際指向什麼辦法?
我想要一種數據類型,可以讓我有效地跟蹤已經「添加」到的對象,從而允許我測試成員身份。我不需要任何其他功能。是否有一個不存儲值的類Set對象?
據我所知,Python沒有這樣的數據類型。最接近我想要的是集合,但集合將始終存儲值(我不需要)。
目前最好的我可以拿出每個對象的hash()
並將它存儲在一個集合中,但是在較低層次上正在計算散列的散列值,並且散列字符串被存儲爲一個值。
有隻使用集的低級別的查找功能,而無需實際指向什麼辦法?
基本上沒有,因爲,正如我在我的評論中指出,這是完全可能兩個不相等的對象共享相同的散列鍵。
散列鍵不指向任何內容或對象,而指向包含零個或多個對象的存儲區。然後,集合實現需要對每個對象進行相等比較,以確定對象是否在集合中。
所以你總是需要至少足夠的信息來進行平等比較。如果你有非常大的對象,它們的平等可以根據他們的數據的一個子集來決定,比如說2或3個字段,你可以考慮用這些字段創建一個新對象,並將其存儲在集合中而不是整個對象中。
weakref
模塊實現了一堆容器,可以在不「存儲」該值的情況下測試成員資格,缺點是當刪除最後一次強引用對象時,對象將從弱容器中消失。
如果這對你的作品,WeakSet
是你想要的。
如果這不適合你,那麼它似乎你想要一個Bloom filter這是可能的(有誤報),但爲了您的目的健壯(默認是沒有錯誤的否定)。
典型安排是「嘗試在過濾器,如果沒有,這是一個沒有;如果是,檢查速度慢的方式如單詞列表文件中的」
,如果你有一個哈希鍵衝突會發生什麼,和兩個對象生成相同的散列? – Russell
嗯,我沒有想到這個問題。我想這必須是少量內存使用以減少碰撞風險。 – Acorn
是否很小取決於你的散列鍵的好壞。 – Russell