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

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

数据结构

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冲突如何解决?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值