map小结

来源:互联网 发布:四川大学软件工程学院 编辑:程序博客网 时间:2024/05/19 09:15

待整理。。。。

http://blog.csdn.net/qw121301152358/article/details/52122043
数组的特点是:寻址容易,插入和删除困难;
而链表的特点是:寻址困难,插入和删除容易。
那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。
Hash就是找到一种数据内容和数据存放地址之间的映射关系。
哈希表就是利用利用这种基本的思想,建立一个从key到位置的函数,然后进行直接计算查找。
散列法:元素特征转变为数组下标的方法。哈希表,又称为散列,是一种更加快捷的查找技术。而哈希表是完全另外一种思路:当我知道key值以后,我就可以直接计算出这个元素在集合中的位置,根本不需要一次又一次的查找!
“如果两个字符串在哈希表中对应的位置相同怎么办?”,毕竟一个数组容量是有限的,这种可能性很大。解决该问题的方法很多,我首先想到的就是用“链表”。我遇到的很多算法都可以转化成链表来解决,只要在哈希表的每个入口挂一个链表,保存所有对应的字符串就OK了。

散列表的查找步骤
当存储记录时,通过散列函数计算出记录的散列地址
当查找记录时,我们通过同样的是散列函数计算记录的散列地址,并按此散列地址访问该记录。

关键字——散列函数(哈希函数)——散列地址
优点:一对一的查找效率很高;
缺点:一个关键字可能对应多个散列地址;需要查找一个范围时,效果不好。
散列冲突:不同的关键字经过散列函数的计算得到了相同的散列地址。
好的散列函数=计算简单+分布均匀(计算得到的散列地址分布均匀)
哈希表是种数据结构,它可以提供快速的插入操作和查找操作。

优缺点
优点:不论哈希表中有多少数据,查找、插入、删除(有时包括删除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。
哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。
如果不需要有序遍历数据,并且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。
缺点:它是基于数组的,数组创建后难于扩展,某些哈希表被基本填满时,性能下降得非常严重,所以程序员必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。

散列法:元素特征转变为数组下标的方法。
1,除法散列法
最直观的一种,上图使用的就是这种散列法,公式:
index = value % 16
学过汇编的都知道,求模数其实是通过一个除法运算得到的,所以叫“除法散列法”。
2,平方散列法 :index = (value * value) >> 28 (右移,除以2^28。记法:左移变大,是乘。右移变小,是除。)
3,斐波那契(Fibonacci)散列法。 对我们常见的32位整数而言,公式: index = (value * 2654435769) >> 28

使用方法:

#include <map> //注意,STL头文件没有扩展名.hstd:map<int, string> personnel; 这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.改变map中的条目非常简单,因为map类已经对[]操作符进行了重载enumMap[1] = "One";enumMap[2] = "Two";
0 0