哈希表
Hash,一般翻译做“散列”,也有直接音译为”哈希“的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是说,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
一般的线性表、树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建基础上,查立在“比较”的找的效率与比较次数密切相关。理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。因而查找时,只需根据这个对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需要进行比较便可直接取得所查记录。在此,称这个对应关系f为哈希函数,按这个思想建立的表为哈希表(又称为杂凑法或散列表),所以,哈希表在数据查找方面可以说效率是很高的。
哈希表的不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址 即key1≠key2,而f(key1)=f(key2)。具有相同函数值的关键字对该哈希函数来说称为同义词(synonym)。 因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。可如下描述哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集(区间)上并以关键字在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。
C#中的哈希表
在.net framework中,hashtable是system.collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。hashtable中key/value键值对均为object类型,所以hashtable可以支持任何类型的key/value键值对. 所以,在建立hashtable时,首先需要引入命名空间system.collections
在哈希表中添加一个key/value键值对采用add(key,value)方法:hashtableobject.add(key,value);
在哈希表中去除某个key/value键值对采用remove(key)方法:hashtableobject.remove(key);
从哈希表中移除所有元素采用clear()方法: hashtableobject.clear();
判断哈希表是否包含特定键key采用contains(key)方法: hashtableobject.contains(key);
class hashtable
{
public static void main()
{
Hashtable ht=new Hashtable();
ht.Add("a","a"); //往hashtable里加入键值对
ht.Add("b","b");
ht.Add("c","c");
ht.Add("e","e");
ht.Add("d","d");
foreach(DictionaryEntry de in ht) //遍历所有键值对输出
{
Console.WriteLine(de.Value);
}
Console.WriteLine("-----------------------------------");
string s=(string)ht["a"];
Console.WriteLine("(string)ht[\"a\"]={0}",s);
s=ht["a"].ToString();
Console.WriteLine("ht[\"a\"].ToString()={0}",s);
Console.WriteLine("-----------------------------------");
if(ht.ContainsKey("e")) //判断hashtable中是否包含e
{
Console.WriteLine("Contains the key of \"e\"");
}
ht.Remove("e");
Console.WriteLine("Remove(\"e\")");
if(!ht.Contains("e"))
{
Console.WriteLine("It does not Contains the key of \"e\"");
}
Console.WriteLine("-----------------------------------");
ht.clear();//移除所有元素
console.writeline(ht["a"]); //此处将不会有任何输出
}
}
遍历哈希表
遍历哈希表需要用到dictionaryentry object,代码如下:
foreach(dictionaryentry de in ht) //ht为一个hashtable实例
{
console.writeline(de.key);//de.key对应于key/value键值对key
console.writeline(de.value);//de.key对应于key/value键值对value
}
对哈希表进行排序
在这里的定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在hashtable进行对key进行重新排列,如果需要hashtable提供某种规则的输出,可以采用一种变通的做法:
arraylist akeys=new arraylist(ht.keys); //别忘了导入system.collections
akeys.sort(); //按字母顺序进行排序
foreach(string skey in akeys)
{
console.write(skey + ":");
console.writeline(ht[skey]);//排序后输出
}
浙公网安备 33010602011771号