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