面试题答案
一键面试-
使用std::unordered_set
- 原理:
std::unordered_set
基于哈希表实现,其查找操作平均时间复杂度为 $O(1)$。当插入元素时,通过哈希函数将元素映射到特定的桶(bucket)中,查找时同样利用哈希函数快速定位到可能存放目标元素的桶,然后在桶内进行比较查找。相比std::vector
结合find
算法平均 $O(n)$ 的时间复杂度(find
是线性查找),std::unordered_set
大大提高了查找效率,尤其是数据量较大且查找频繁的场景。
- 原理:
-
对std::vector排序后使用std::lower_bound
- 原理:先对
std::vector
进行排序(如使用std::sort
),时间复杂度为 $O(nlogn)$。排序后,利用std::lower_bound
进行查找,std::lower_bound
采用二分查找策略,时间复杂度为 $O(logn)$。二分查找每次将查找区间缩小一半,不断逼近目标元素,从而提高查找效率。如果找到的元素与目标元素相等,则说明存在;否则说明不存在。
- 原理:先对
-
构建索引结构(如B - 树等数据结构)
- 原理:B - 树是一种自平衡的多路查找树,它可以有效地存储和检索大量数据。在B - 树中,节点按顺序存储键值,并且每个节点包含多个键值和指向子节点的指针。查找时,从根节点开始,根据键值与节点中键值的比较,选择合适的子节点继续查找,直到找到目标键值或确定不存在。由于B - 树的高度相对较低(与数据量 $n$ 成对数关系),所以查找效率较高,平均时间复杂度为 $O(logn)$。对于大量整数的查找场景,构建B - 树索引结构可以显著提升查找性能。