2009/07/13 17:10
複製鏈結
rss** : 譯言-每日精品譯文推薦 | imqiang 去看原文章
譯者:imqiang
當使用結構物件作為雜湊表的鍵時,雜湊表的查詢操作的效能糟透了。這要「歸功於」內部所使用的用來查詢的方法gethashcode()。
如果乙個結構只是包含簡單的值型別(int, short等), 計算gethashcode的演算法建立的大多數雜湊值會被放入同乙個bucket裡。
舉個例子,雜湊表建立10個buckets,那麼很可能,所有的鍵都會被放到同乙個bucket。因此,當進行查詢的時候,.net執行時就得遍歷整個bucket來獲取值。
bucket1 - value1, value2, value3,...,valuen
bucket2 - (empty)
bucket3 - (empty)
bucket4 - (empty)
bucket5 - (empty)
bucket6 - (empty)
bucket7 - (empty)
bucket8 - (empty)
bucket9 - (empty)
bucket10- (empty)
因此,平均來說,查詢操作的時間複雜度從o(1)變成了o(n) 。
為了克服這一點,可以考慮重寫gethashcode()方法。
一種方法是建立乙個字串,然後把結構中所有的值型別都合併起來,並用某個特殊的字元作為分隔符。
因為你的結構是個查詢條件,能確保所有的結構的值是不同的,因此能保證產生的字串是唯一的。
產生的字串有乙個gethashcode()方法,因為它繼承自system.object(像其他的物件一樣),僅僅返回這個api的輸出就好了。**例項理解起來容易些:
struct
public override int gethashcode()
} 顯示的生產hashcode,可以保證hashcode是唯一的,因此能增強查詢的效能。
參考:
Lua的雜湊表結構
原址 分享一下對lua的雜湊表結構的研究。一般雜湊表處理衝突有兩種方式,拉鍊法和開放定址法。拉鍊法就是雜湊表的每個元 素都是乙個鍊錶,如果有衝突的鍵就放在鍊錶裡面。而開放定址法是如果遇到了衝突,就 再計算乙個雜湊值,直到沒有衝突位置。拉鍊法的優點就是實現簡單,缺點也是有的 鍊錶會導致低的快取命中率,...
結構體作為物件的屬性
結構體作為物件的屬性 結構體如何開闢儲存空間 結構體分配儲存空間是將所有屬性占用的儲存空間的總和加在一起後再分配 注意 其實結構體分配儲存空間本質上並不是將所有屬性占用的儲存空間的總和加在一起後再分配 而是會獲取結構體型別中占用記憶體最大的屬性的大小,然後取該大小的倍數 特例 如果剩餘的儲存空間 不...
結構體作為物件的屬性
typedefstruct date inte ce student nsobject end 1 結構體只能在定義的時候初始化 系統並不清楚它是陣列還是結構體 2 初始化結構體屬性 方法一 強制轉換 stu birthday date 方法二 定義乙個新的結構體,給d賦值,將d賦值給 birthd...