面试问题:
在一个可容纳数百万辆汽车的停车位,您需要找到一个免费的停车位.槽可以在哪里没有条件,即停车场可以有多个入口并且在入口附近找到槽等等无关紧要.问题是应该使用什么样的数据结构以及各种操作的复杂性.
我建议使用百位的位数组,0/1用于获取/空闲时隙,因此为了找到自由点,问题转化为找到第一个设置位.不要假设有多少汽车等等,即钻头阵列可能稀疏或密集.
在巨大的位图中找到设置位的最快方法是什么?我建议每个单词的二进制搜索+高效ffs()作为方案.
你可以这样走:
将最后一个空闲槽的索引存储在变量中,然后查找下一个,不要从头开始扫描位图,而是从该值开始扫描。
如果需要释放一些槽,请将其分配给最后一个索引。
std::vector<bool>可以是您的位数组,因此您不需要自己处理位(布尔值在内部打包为整数)。
你可以引入一个mip-mapped结构:
``std::vector<bool>`` Bitmap;
``std::vector<bool>`` Bitmap2; // half-sized
``std::vector<bool>`` Bitmap4; // 1/4
``std::vector<bool>`` Bitmap8; // 1/8
// etc
Run Code Online (Sandbox Code Playgroud)
free上层数组中的值对应于下层数组有任何空闲槽的情况。您可以使用二分搜索来遍历此结构。