HashTable

Hash是各种数据结构中最为重要的数据结构之一

Hash具有O(1)的数据检索效率

Hash的空间开销却通常很大 以空间换时间

适用于读取操作频繁,写入操作很少的操作类型

存储结构:

以数据的方式保存期,数组的大小不一为素数.

当数组中存在的数据项个数大于数组容量的扩张因子倍数时,数组进行扩张

。NET优化认为0.72最为合适, 所有数据将会被复制。

hash算法:

h(key,n) = h1(key) + n*h2(key)

key为要hash的关键字,N为由于发生冲突而需要重新hash的次数

h1(key)=”具体对象的hashCode数值”

h2(key)=1 +(((h1(key)>>5)+1)%(hashsize -1)); hashsize为保存hash数据的桶数组的大小

插入算法:

计算seed值和遇到冲突时的hash值增量步长

根据hash值计算应放入的桶的位置

如果当前桶位置为空: 直接插入数据,当前桶位置冲突位被置位,记录当前位置,继续向后扫描是否有重复的KEY插入

如果当前桶位置已经存在数据

  将当前冲突位设置为1,hash值增加增量,重新判断hash桶是否可用。

通过key读取value算法

计算seed值和遇到冲突时的hash值增量步长,获取当前hash桶的快照,

根据HASH值获取第一个可能的桶,注意这里采用lockfree类似的方法保证访问同步

如果找到相等的KEY返回结构,否则HASHCODE+=增量步长,重新查找。

每个元素都存储在DictionaryEntry对象中的键/值对。

foreach(DictionaryEntry myDE in myHashtable){…}

foreach是对枚举数的包装,只允许从集合读取,不允许写入集合。

hashtable是线程安全的,可由多个读取器线程。

Hashtable公共属性:

Count            Hashtable键值对的数目

IsFixedSize     指示Hashtable是否具有固定大小

IsReadOnly     指示是否只读

IsSynchronized 是否同步对hashtable访问

Item              获取或设置与指定的键相关联的值

Keys              获取包含Hashtable中的键的ICollection

Values            获取包含Hashtable中的值的ICollection

受保护的属性:comparer, enqualityComparer, hcp

公共方法:

add, clear,clone, contains, containsKey, ContainsValue, CopyTo, Equals, GetEnumerator, GetHashCode, GetObjectData, GetType, Remove, ToString

posted @ 2009-10-16 10:09  smodi  阅读(961)  评论(0编辑  收藏  举报