小知识点
1.map和unordered_map的区别
1.1 内部实现机理
- map:map内部实现了一个红黑树,该结构具有自动排序的功能,所以map内部是有序的。
- unordered_map:内部实现了一个哈希表,顾名思义也知道是无序的。
1.2 优缺点以及适用场合
- map
优点:
(1)有序性。
(2)红黑树结构。效率比较高,很多操作都可以在logn的时间复杂度下实现。
缺点:
空间占用率高。红黑树虽然提高了运行效率,但是每一个节点都需要额外保存父节点、孩子节点以及红/黑性质,使得每一个节点都需要占用大量空间。
**适用场合:**对于有顺序要求的问题,map更加高效。
- unordered_map
**优点:**由于内部实现为哈希表,所以查找速度非常快。
**缺点:**哈希表建立比较耗费时间。
**适用场合:**对于查找问题,更加高效。
2.基于范围的for循环
vector<int> res{1,2,3};
for(auto n : res)
cout<<n;
这里的for循环等价于:
for(vecotr<int>::iterator iter = res.begin(); iter != res.end(); res++)
cout<<*iter;
不过前一个遍历是只读的,不能修改遍历的值。如果要修改的话,需要将遍历的变量声明为引用类型。比如:
for(auto &n : res)
n++;
3.vector初始化
(1)vector res;
(2)vector res(res1);
等价于:vector res = res1;
(3)vector res = {1,2,3};
等价于:vector res{1,2,3};
如果列表中元素与初始定义的元素不一样会进行强制类型转换。
(4)vector res(res1.begin()+1, res1.end()-1);
(5)vector res(5);
res将包含5个元素,每个元素进行默认值初始化,对于int初始化为0。
(6)vector res(5,3);
res被初始化为包含5个值为3的向量。
4. using关键词
using value_t = pair<int, int>;
指定别名。
5.Lambar表达式
Lambar表达式把函数看作对象,Lambar表达式可以像对象一样使用,比如可以赋给变量和作为参数传递,还可以像函数一样对其求值。
8.TopK问题
8.1
比如找出10亿个数中最小的一百个。
要利用分布式思想处理海量数据。一台机器不可能跑完所有的数据,可以把数据分散在多台机器中,然后每台机器并行计算各自的TopK数据,最后汇总再计算得到最终的TopK数据。
对于每个机器分散的数据排序,利用堆。维护一个大小为K的大顶堆。最开始依次把数据放入堆中,当堆的大小满的时候,只需要将堆顶元素与下一个数比较:如果小于堆顶元素则将当前堆顶元素抛弃,并将该元素插入堆中。遍历完所有的数据即可得到TopK数据。
对于复杂度,遍历数组需要O(n),一次堆化操作需要O(logK),总共需要O(nlogK)的复杂度,一般K远小于n,所以O(nlogK)接近于O(n)。
9 为什么内存分配要用到栈这个数据结构
栈一般存储的是函数的调用信息的函数中申明的变量,因为函数的调用是递归的,外层函数一定比内层被调用的函数先加载和执行,等到内层被调用函数结束后才能结束,即需要先进后出。