C++知识点总结(三)

1、什么是二叉搜索树?
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

  1. 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  2. 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  3. 它的左右子树也分别为二叉搜索树

二叉搜索树中序遍历是有序的。

2、map和set的底层实现是什么?
map和set的底层实现都是红黑树。map中的元素是<key,value>键值对,而set的元素只有key。两者都是键值有序的,并且两者都不允许出现键值重复。

3、map和set的区别?

  1. map中的元素是<key,value>(键值对):关键字起到索引的作用,值则表示与索引相关联的数据;set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字key。
  2. set的迭代器是const的,不允许修改元素的值;map允许修改value,但不允许修改key。 其原因是因为map和set是根据关键字排序来保证其有序性的,如果允许修改key的话,那么首先需要删除该键,然后调节平衡,再插入修改后的键值,调节平衡,如此一来,严重破坏了map和set的结构,导致iterator失效,不知道应该指向改变前的位置,还是指向改变后的位置。所以STL中将set的迭代器设置成const,不允许修改迭代器的值;而map的迭代器则不允许修改key值,允许修改value值。
  3. map支持下标操作,set不支持下标操作 。map可以用key做下标,map的下标运算符[ ]将关键码作为下标去执行查找,如果关键码不存在,则插入一个具有该关键码和mapped_type类型默认值的元素至map中。

4、set和multiset的区别。map和 multimap的区别.
multiset与set的区别是:multiset中的元素可以重复,set中value是唯一的 。
multimap和map的唯一不同就是:map中的key是唯一的,而multimap中key是可以重复的。

5、什么是AVL树?
一棵AVL树或者是空树, 或者是具有以下性质的二叉搜索树:

  1. 它的左右子树都是AVL树
  2. 左右子树高度之差(简称平衡因子)的绝对值不大于1(-1/0/1)

6、什么是红黑树?
红黑树,是一种二叉搜索树,红黑树确保没有一条路径会比其它路径长出两倍,因而是接近平衡的。
并且具有以下性质:

  1. 每个结点不是红色就是黑色
  2. 根节点是黑色的
  3. 如果一个节点是红色的,则它的两个孩子结点是黑色的
  4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
  5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点

7、AVL树和红黑树的比较。
红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O(log2(N) ),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。

8、unordered_map和unordered_set的底层。
unordered_map和unordered_set的底层是由hash结构实现的,并且unordered_map和unordered_set的存储是无序的。

9、什么是哈希冲突?怎么处理?
不同关键字通过相同哈希函数计算出相同的哈希地址,该种现象称为哈希冲突或哈希碰撞。

解决哈希冲突两种常见的方法是:闭散列和开散列

  1. 闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。
  2. 开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集,每一个子集称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。

10、位图。
位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个 数据存不存在的。

11、布隆过滤器。
布隆过滤器是用多个哈希函数,将一个数据映射到位图结中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”

布隆过滤器不能直接支持删除工作,因为在删除一个元素时,可能会影响其他元素。

12、STL的六大组件。
STL中包含了容器、适配器、算法、迭代器、仿函数以及空间配置器。

13、迭代器。
迭代器是一种设计模式,让用户通过特定的接口访问容器的数据,不需要了解容器内部的底层数据结构。
C++中迭代器本质:是一个指针,让该指针按照具体的结构去操作容器中的数据。

14、适配器。
适配器:又叫做配接器,是一种设计模式。即:将一个类的接口转换成用户希望的另一个类的接口,使原本接 口不兼容的类可以一起工作。

  1. 容器适配器-stack和queue
  2. 迭代器适配器-反向迭代器
  3. 函数适配器

15、仿函数。
仿函数:一种具有函数特征的对象,调用者可以像函数一样使用该对象 ,为了能够“行为类似函数”,该对象所在类必须自定义函数调用运算符operator(), 重载该运算符后,就可在仿函数对象的后面加上一对小括号,以此调用仿函数所定义的operator()操作。

作用:提高算法的灵活性。

16、空间配置器。
配置、管理和释放空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值