Hash解决冲突的方法
总体有三种方法:
1. 开放地址法 使用地址长度为x 则为arr[i]%x找到位置
2. 随机探测法,使用地址长度为x生成一个随机数链r,(arr[i]+r[i])%x为要找到的位置。
3. 拉链法,使用地址长度为x 发生冲突后,在当前位置用一个链来保存地址上的数据,减少了处理冲突的时间,和保存时的问题
这个链中保存的数据
Map的使用方法
1. map最基本的构造函数;
map<string, int >mapstring; map<int ,string >mapint;
map<sring,char>mapstring; map< char ,string>mapchar;
map<char,int>mapchar; map<int ,char >mapint;
2. map添加数据;
map<int ,string>maplive;
1.maplive.insert(pair<int,string>(102,"aclive"));
2.maplive.insert(map<int,string>::value_type(321,"hai"));
3,maplive[112]="April";//map中最简单最常用的插入添加!
3,map中元素的查找:
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
map<int ,string >::iteratorl_it;;
l_it=maplive.find(112);
if(l_it==maplive.end())
cout<<"we do not find112"<<endl;
elsecout<<"wo find 112"<<endl;
4,map中元素的删除:
如果删除112;
map<int ,string>::iterator l_it;;
l_it=maplive.find(112);
if(l_it==maplive.end())
cout<<"wedo not find 112"<<endl;
else maplive.erase(l_it); //delete 112;
4.交换
m1.swap( m2);
map的基本操作函数:
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
map的实现原理:
map和list有相通的一些特性,map底层是使用了RB_Tree来实现的,所以map是一种自动排序的数据结构,,由于map所开放的各种操作接口都是由转RB_Tree操作行为而已。。
红黑树:
红黑树的特性
1. 每个节点要么红要么黑
2. 根节点为黑色
3. 叶子结点为黑色
4. 红结点的俩个子节点为黑色
5. 当前结点到叶子结点的任意一条路上所经过的黑结点的个数的相同的。
红黑树的各种操作的时间复杂度为0(logn)
红黑树相比其他的数据结构。
1. 相比二叉查找树:bst树在一些操作后可能让树的结构成为一个线性,导致树的查找效率降到很低,无法利用树的特性。使用了红黑色RB_TREE可以使树状结构保持,同时最长路径不大于俩倍的最短路径,使最坏的查找也能使其在0(logN)找到。而如果是线性的bst树要使用0(N)
2. 相比avl树,平衡树,其平衡程度没有avl树高,但是因为avl树的插入,删除所花费的时间要比红黑树高很多,代价太大,红黑树在插入删除节点都能够在三次旋转中解决。
3. 哈希表,面对海量数据和内存受限时hash将花费更多的时间去构造,同时处理冲突的问题。所以哈希表的查找速率很高,适用于静态的数据中,而红黑树在构建和插入删除上的优势可以让其能够更好的处理动态数据。
如使用rb_tree处理 防火墙。
Map使用红黑树的原因是:
红黑树为一种平衡树,利用其自动排序功能。和插入删除搜索的方便性