c++之STL模板,hash_set与hash_map

一,hash_set

原理:说到哈希,那么必须讲一下哈希表和哈希函数,这个相对于红黑树,又在一个角度,简化了搜索的复杂性,以及在构造时候的繁琐性;

  哈希表:通过哈希函数,生成的一维数组,长度有限,

  哈希函数,将具体的数据值,转换为对应哈希表的索引下标的函数,举一个例子,f(x)=x%7; 那么当你的数据值x为22的时候,算出来f(22)=1,那么这个22就存放在下标为1的位置,很简单!

  给出一个数组,比如说10个数,a1[10]={1,2,...},我们都知道,除以7,余数为1的数,太多了,那么对应相同下标的数,如何存放呢?那么就是通过链表,把这些书都串起来,(在更高级的java中,为了提高效率,使用的是红黑树,相当于:vector<set<T>>)

  由此图,举个例子看看,给出一个哈希表的长度为7,下标为0,1,。。。6;哈希函数为f(x)=x%7那么存入的数据里面,23,16,9算出来,自然都是2,全部串起来。

 

 

 

  我们可以发现,这个数组的效率,搞不搞,完全取决于我们的哈希表的长度取的是否恰当,如果太短,那么聊表就会累积的很长,如果取的太长,又会造成很大的空间浪费,所以,这也是哈希表的缺点不足之一,为了尽量避免,哈希表的长度,一般取为质数

功能

    增加:insert(value),这里不能指定插入的位置,因为位置是根据哈希函数指定的;

  删除:erase(),直接删除某个元素值,或者删除某个指针范围;

  修改:因为位置不固定,所以修改比较麻烦,等效于删除该节点后,再插入一个新的结点

  查找:find()使用哈希函数查找

  遍历:使用迭代器iterator(),从begin(),到end()遍历;

优缺点

  优点:提高了查询的速度,构造比较简单,可以动态的删除,结点与结点之间,没有关系,不像set与map,删除一个结点,会影响整个结构,但是如果把红黑树与哈希表结合后,那么该优点就会消失。

  缺点:无法动态修改(修改后,会影响该点所在的位置),其次,哈希表长度的选择,是一个难点,

二,hash_map

  c++的hash_map其原理差别不大,我们介绍一下java里面的hash_map是如何实现的,

   原理: 在jdk8,对hash_map进行了优化,使用链表和红黑树两种方式对接哈希表的桶,我们都知道,链表构建很简单,而红黑树,一个结点就会多4个区域,也存在空间的浪费,但是查询效率很多,所以为了达到最好的效果,设置了一个阈值,比如说8,捅下的结点数,如果超过了这个值,那么就会转为为红黑树存放,这样就大大的优化了速度。

 

 

功能

    基本功能

posted @ 2019-09-21 13:13  菜鸟奔跑  阅读(2652)  评论(0编辑  收藏  举报