我们有n
个值。所有值均为false
,可以更改为true
。
我希望对这些值进行3次操作,并且具有一定的时间复杂度:
val(i)
- >返回索引i
处的值。时间复杂度 - O(1)。change(i)
- >将索引i
的值更改为true。时间复杂度 -
摊销O(1)。find(i)
- >返回索引i
的最近索引,其中包含值
false
(如果false
上有i
,则返回i
)。时间复杂度 - O(log n)。我并不关心空间复杂性。 结构在开始时以固定长度初始化。启动化需要多长时间并不重要。
用于这些操作的数据结构应该如何?
答案 0 :(得分:2)
在[0,n]上设置segment tree,并且对于每个基本间隔[i 2^k, (i+1) 2^k)
,将布尔值的AND存储在该间隔中。
val(i)
是常量时间,因为它只是一个数组查找。
change(i)
将按照常数时间摊销。这是因为在任何给定时间,从根开始到间隔k级别的写入次数最多是从根到k + 1级别的写入次数的一半(通过k上的归纳证明这一点)。
find(i)
可以在对数时间内实现,如下所示。首先观察到找到最近的假左邻居和最近的假右邻居并且更接近两者是足够的。要查找位置i
最近的假右邻居,请将[i, n)
分解为基本区间。找到包含false的最左边的这些间隔(即,其AND为false)。从这个间隔开始向前移动,检查每个级别是否有左半部分是假的。如果确实如此,那就下降吧;否则,请使用右半部分。
在单位成本RAM(即实际硬件的理论版本)上,通过更改树,我们可以find(i)
时间O(log n / log log n)
时间O(n / log n)
存储2
个字从Theta(log n)
扇出到字大小(R
)并使用按位操作。
答案 1 :(得分:-1)
使用hashmap和二叉搜索树的组合。
例 - 假设boolean [] A = {false,false,false,false}
创建hashmap(将键映射为整数,将值映射为Object)
迭代每个项目: 1.创建具有索引和值作为属性的对象。 2.将对象添加到地图中。 3.使用BST中位置的对象索引将相同的对象添加到BST。
现在进行以下操作:
Val(i):直接获取对象并返回对象的值。复杂性(1)
更改(i,true / false):再次从地图获取对象并更新其值。复杂性O(1)
查找(i):检查该地图中对象的值是否为假。如果为false则返回,否则在BST中进行遍历以检查具有值为false的最近索引。注意基于对象密钥的BST遍历可以在O(logn)中完成。因此复杂性O(logn)