如何使用二叉树在log(n)时间复杂度中获取堆栈的部分求和

how to use a binary tree to get partial sumation of a stack in log(n) time complexity

提问人:fil1423 提问时间:11/16/2023 最后编辑:fil1423 更新时间:11/16/2023 访问量:67

问:

我几乎完成了自定义数据结构,但我被困在最后一个功能上,因为我几乎没有使用树的经验。我需要添加一个函数,该函数可以获取堆栈中前 k 个元素的总和。例如,在堆栈 [1, 2, 3, 4, 5] 中,前 3 个元素的总和为 5+4+3 = 12。这一切都需要符合 log(n) 时间复杂度或尽可能接近。这应该通过创建一个二叉树来实现,该二叉树的叶子是堆栈中的元素,父树是其 2 个子树的总和。下面是树应该是什么样子的示例

                           38
                         /    \
                       21     17
                      /  \   /  \
                     13   8 10   7    

我需要能够将元素设置为新值,并且只能从前面添加或删除值,因为“主要”数据存储在堆栈中。

我有一个使用常规 arrayList 实现它,但它的运行时是 O(n) 而不是所需的 O(log(n))

public long ksum(int k) {
    long sum = 0;
    for(int i=0; i<k && i<ds.size(); i++)
      sum += ds.get(ds.size() - 1 - i);
    return sum;
  }

这是我目前所拥有的全部代码。将对 push、pop 和 set 等函数进行更改,以更新数据结构以及 ksum 函数本身

import java.util.Iterator;
import java.util.PriorityQueue;
import java.util.Stack;
import java.util.TreeMap;

public class UltraFast implements UltraStack {
    protected Stack<Integer> stack;
    protected PriorityQueue<Integer> maxHeap;

    public UltraFast() {
        stack = new Stack<>();
        maxHeap = new PriorityQueue<>((a, b) -> Integer.compare(b, a));
    }

    public void push(int x) {
        stack.push(x);
        maxHeap.offer(x);

    }

    public Integer pop() {
      if (stack.isEmpty()) {
          return null;
      }
      int top = stack.pop();
      maxHeap.remove(top);


      return top;
  }
  

    public Integer set(int i, int x) {
        if (i < 0 || i >= stack.size())
            return null;

        int oldValue = stack.get(i);
        stack.set(i, x);

        maxHeap.remove(oldValue);
        maxHeap.offer(x);

        return oldValue;
    }

    public long ksum(int k) {
      //code here
      return null;
  }
  
  

    public Integer get(int i) {
      if (i < 0 || i >= stack.size())
        return null;
        return stack.get(i);
    }

    public Integer max() {
      if (maxHeap.isEmpty()) {
         return null;
      }
      return maxHeap.peek();
    }

    public int size() {
        return stack.size();
    }

    public Iterator<Integer> iterator() {
        return stack.iterator();
    }
    
    
}

java 时间复杂 度二进制树

评论

0赞 Bohemian 11/16/2023
请准确定义“前k个元素”的含义。
0赞 fil1423 11/16/2023
我已经更新了帖子以添加此示例:在堆栈 [1, 2, 3, 4, 5] 中,前 3 个元素的总和是 5+4+3 = 12
0赞 Bohemian 11/16/2023
您可以在恒定时间内返回前 k 个元素的总和,而无需树。我不明白这个问题。顺便说一句,为什么 5、4 和 3 是“第一元素”?你是说“最后 k 个元素”吗?或者你是从后到先迭代?[1, 2, 3, 4, 5]
0赞 trincot 11/16/2023
我没有看到您的代码中尝试创建二叉树。您确实创建了一个堆,但这与您描述的结构不同(它不会将总和存储为内部节点)。是什么阻碍了你开始实施这棵树?
0赞 Kelly Bundy 11/16/2023
对于您的示例 [1, 2, 3, 4, 5],,

答: 暂无答案