Algorithm 序列的数据结构

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_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值;
    左,右;
    }
    
    按索引对树排序,以便搜索为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
    替换
    搜索是快速的
    。这会澄清吗?