C#散列表(Hash表的理解,解决哈希冲突)

散列是一种常见的储存数据的技术,采用这种计算可以非常迅速的插入和检索数据。散列所采用的数据结构被称位是散列表。但是查找最大值或者最小值这样的查找操作,散列表无法执行的非常快。

散列表容量最好的容量大小为质数,因为这样在取余求哈希值的时候可以减小哈希冲突。

一般求字符的散列值都是使用霍纳法则来进行求值。霍纳法则也叫秦九韶算法,西方称为霍纳法则.
将字符转换成ASCII码的键值来得到哈希值。

            string test = "OneSitDown";
            string[] storeStrArray = new string[10];
            int hash=0;
            for (int i = 0; i < test.Length; i++)
            {
                hash += hash * 31 + (int)test[i];
            }
            hash = hash % storeStrArray.Length;
            if(hash<0)
            {
                hash += storeStrArray.Length;
            }
            storeStrArray[hash] = test;
            Console.WriteLine(storeStrArray[hash]);
            Console.ReadKey();

霍纳法则的具体数学方法这里由于讲解的不是相关的数学知识这里就不讲了。

在计算的得到哈希值的时候会不可避免的遇到hash冲突的情况(计算出哈希值的地址已经储存了另一个数据),这个时候我们需要解决哈希冲突。下面有四个方法来解决哈希冲突。

1.开放定址法
①:线性探查法:
线性探查发会查找发生冲突周围+1,-1,+2,-2…地址的储存空间直到找到地址为止。但线性探测法可能会导致数组内相邻单元中的数据元素会趋近形成聚类,从而使后续单元探查时间变长且效率更低。
②:平方探查法:
和上面的线性探查法相同发生冲突会不过是在加上1的平方,减去1的平方…一直查找直到找到储存的地址为止。
2.拉链法
每次发生冲突时,用链表来储存数据,不过缺点是假如很多哈希值相同的数据时会储存到同一个链表中,会使查找变成线性。
3.再哈希法
发生冲突就再次使用另一个哈希函数计算地址直到找到地址为止。
4.建立一个公共溢出区
当发生哈希冲突之后将冲突的值都放在另一个地方(数组等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值