理想的数据结构来回答IsOn(i)和Toggle(i,j) - 应该比HashSet更好

时间:2017-09-04 10:23:56

标签: algorithm data-structures

这是我最近在接受采访时被问到的一个问题。我提出了一个不错的解决方案,但我的采访者告诉我有一个更好的解决方案。

想象一下,有n个灯泡(或者你选择的任何二进制物......),最初它们全都关闭了。设计一种方法来回答理想时间和空间复杂度两个问题:

(1)IsOn(i) - 如果元素'i'在

上,则返回true

(2)Toggle(i,j) - 改变[i,j](包括)范围内所有元素的状态。

  1. 初始解决方案:数组。 IsOn在O(1)中,在O(j - i)中切换,但O(N)空间复杂。
  2. 更好的解决方案:包含所有元素的Hashset。 IsOn仍然是O(1),Toggle仍然是O(j - i),但空间复杂度要好得多。
  3. 有人告诉我,我应该找到一个更好的解决方案,一个与存储元素的范围有关的解决方案 - 但我很难理解它。

1 个答案:

答案 0 :(得分:1)

这可以通过具有延迟传播的分段树来完成。算法如下

  1. 最初数组将填充0
  2. update(i,j)将切换i到j范围内的值。这可以使用延迟传播在O(nlogn)中完成
  3. 查询(l)会告诉我们索引[l,l]
  4. 的值

    构建树的时间复杂度O(nlogn)和查询和更新的O(logn)