Algorithm 序列的数据结构
我正在为数据结构测试进行培训,但我无法解决此问题: 设计一个保持序列a_1,…,a_n的数据结构 并且可以对其执行两个操作:Algorithm 序列的数据结构,algorithm,data-structures,Algorithm,Data Structures,我正在为数据结构测试进行培训,但我无法解决此问题: 设计一个保持序列a_1,…,a_n的数据结构 并且可以对其执行两个操作: 将a_i设置为值x 计算值x在两个索引之间的序列中出现的次数: i、 和j;只是为了确保我清楚地表明(我不擅长英语)它的意思 要返回|{a_k:a_k=x和i,这是一个带有两个数据字段的BST: BSTNode<E>{ int index; E value; BSTNode left, right; } BSTNode{ 整数指数; E值;
要返回
|{a_k:a_k=x和i,这是一个带有两个数据字段的BST:
BSTNode<E>{
int index;
E value;
BSTNode left, right;
}
BSTNode{
整数指数;
E值;
左,右;
}
按索引对树排序,以便搜索为O(lg n):这有助于插入和设置(seta_i to value x
)
计算值x在两个索引i、j之间的序列中出现的次数
- 查找i和j的直接公共父级:
- 然后遍历以公共父节点为根的子树:对于每次访问,只计算值为
x
的节点。这类似于按顺序(从同一站点)对单个子节点或访问叶进行求和
编辑:
在找到i
和j
的公共父节点后,不必遍历子树,只需查找值的频率即可:每个节点(此处为公共父节点)都可以有一个频率映射:map childrenFreq=new HashMap()
。一旦在O(lg n)中找到公共父节点,这将是O(1)当您遍历整个子树时,至少是Ω(k)
其中k
是出现的次数。它应该是O(logn)
,但是k
不需要被logn
@Daniel Fischer支配:在找到i
和j
的公共父节点后,不需要遍历子树,只需查找值的频率即可:每个节点(此处为公共父节点)可以有一个频率映射:map childrenFreq=new HashMap()
。一旦在O(lg n)Yes中找到公共父级,这将是O(1),更新HashMap
应该是O(1),因此设置a_i
的值将保持O(log n),我想。所以我会说,把它编辑到你的答案中。还要提到为什么将a_I
的值设置为O(logn))丹尼尔·菲舍尔:将a_I设置为值x
意味着找到索引a_I
为lg n的节点,然后将该节点的值替换为x
,即O(1)。我认为这是显而易见的。我将用搜索是lg n
替换搜索是快速的
。这会澄清吗?