恒定时间“bool数组全0?”

时间:2012-01-31 23:50:42

标签: c++

我有一个布尔数组:

bool * arr = new bool[n];

如果这个数组中有1个,我想在常数时间内弄清楚;可以这样做吗? 我知道bitset有一个执行相同操作的none()方法,但是这个数组需要动态调整大小,而boost的dynamic_bitset实际上不是一个选项。

为清晰起见而编辑

3 个答案:

答案 0 :(得分:4)

简答:不。你必须平均检查一半的元素,这需要花费O(n)时间。

答案很长:是的。如果您准备为写操作添加一些额外的O(1)复杂性。只需使用向上/向下计数器跟踪每个0-> 1和1-> 0。


注意:我假设在一般情况下你有bool *arr = new bool[n];。对于一个恒定大小的数组,那么当然查询将是恒定时间!

答案 1 :(得分:2)

不是开箱即用,但您可以轻松维持1s的数量:

  • 每当0变为1
  • 时递增
  • 并在1变为0时递减。

完成后,将计数值与0进行比较是一个恒定时间操作。

因此,基本上,你交换稍微降低的写入性能,以换取回答“剩下的任何1”更快。这是否是正确的权衡,只有你能知道......

答案 2 :(得分:0)

如果您能够控制对数组的访问,您可以编写一个包装器,在项目更新时保持数组中1的计数。