程序员面试知识点超全整理之数据结构

本文深入探讨了STL vector的内部实现及其优化技巧,同时对比了vector与其他容器如list和deque的性能;此外还介绍了map与hashmap的不同实现方式及其优缺点,并详细说明了hash冲突的解决方案。

原创不易,如果需要转载请附上本连接

数据结构

1. vector 底层实现

STL vector的内部实现原理及基本用法


2. 如何控制 vector 的内存分配

《C++ Primer》中对顺序容器的内存分配是这样描述的:为了支持随机访问,Vector 中的元素采用顺序存放,即每一个元素紧挨着前一个元素进行存储。
那么现在只有可能出现问题了,当内存中没有足够连续的空间去存放新插入来的元素怎么办?

重新分配内存空间,将原来旧的元素全部复制到新的存储空间中去,然后再插入新的元素。如果之前申请的内存不是特别充足,向 Vector 容器中插入元素可能会有相当大的CPU开销。其中最糟糕的情况是每次插入一个元素,程序要将所有的元素复制到一个新的内存块上去。

**优化处理:**当我们插入元素时,如果旧的内存块是连续空闲空间不够,则重新分配一块新内存空间,内存空间的大小不是只比旧的内存空间大一个元素的大小,相反而是多分配几个元素空间大小(之前的空间2倍),这样对于接下来的几个新插入元素做到有空间可以插入,这样之后使得 Vector 的性能得到很大提高。

Vector每次插入新的元素,要将插入点后的所有数据往后移动。这么一说的话,可能没有用链表高效。 不过根据《C++ Primer》作者给出的解释,Vector的实际使用效率要比 list 和 deque 要高一点。主要还是要看应用场景吧。


3. Map, Hashmap 底层实现

Map成员
TreeMap 是基于树(红黑树)的实现方式,即添加到一个有序列表,在O(log n)的复杂度内通过key值找到value,优点是空间要求低,但在时间上不如HashMap。C++中Map的实现就是基于这种方式

HashMap 是基于HashCode的实现方式,在查找上要比TreeMap速度快,添加时也没有任何顺序,但空间复杂度高。C++ unordered_Map就是基于该种方式。

HashTableHashMap类似,只是HashMap是线程不安全的,HashTable是线程安全的,现在很少使用

ConcurrentHashMap也是线程安全的,但性能比HashTable好很多,HashTable是锁整个Map对象,而ConcurrentHashMap是锁Map的部分结构

C++ map和HashMap原理详解
HashMap底层实现原理(上)
HashMap底层实现原理(下)


4. map 的 key 如果是结构体需要注意什么问题

map中的 key 默认是以 less<> 升序对元素排序(排序准则也可以修改),也就是说 key 必须具备 operator< 对元素排序,而平常我们的用的基本上都是基本类型元素作为key,就不存在这个问题,但如果是结构体就要对< 进行重载负责会报错

map中结构体做关键字的注意事项


5. hash冲突如何解决

  1. 开放寻址法

    1. 线性探测(Linear Probing)
    2. 二次探测(Quadratic probing)
    3. 双重散列(Double hashing)
  2. 链表法

Hash冲突如何解决?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值