我有一个布尔数组:
bool * arr = new bool[n];
如果这个数组中有1个,我想在常数时间内弄清楚;可以这样做吗? 我知道bitset有一个执行相同操作的none()方法,但是这个数组需要动态调整大小,而boost的dynamic_bitset实际上不是一个选项。
为清晰起见而编辑
答案 0 :(得分:4)
简答:不。你必须平均检查一半的元素,这需要花费O(n)时间。
答案很长:是的。如果您准备为写操作添加一些额外的O(1)复杂性。只需使用向上/向下计数器跟踪每个0-> 1和1-> 0。
注意:我假设在一般情况下你有bool *arr = new bool[n];
。对于一个恒定大小的数组,那么当然查询将是恒定时间!
答案 1 :(得分:2)
不是开箱即用,但您可以轻松维持1s的数量:
完成后,将计数值与0进行比较是一个恒定时间操作。
因此,基本上,你交换稍微降低的写入性能,以换取回答“剩下的任何1”更快。这是否是正确的权衡,只有你能知道......
答案 2 :(得分:0)
如果您能够控制对数组的访问,您可以编写一个包装器,在项目更新时保持数组中1的计数。