how to determine if the kth largest element of the heap is greater than x

后端 未结 2 799
清歌不尽
清歌不尽 2020-12-02 15:12

Consider a binary heap containing n numbers (the root stores the greatest number). You are given a positive integer k < n and a number x. You have to determine whether th

相关标签:
2条回答
  • 2020-12-02 15:23

    Simple dfs can do the job. We have a counter set to zero. Start from the root and in each iteration check the value of current node; if it is greater than x, then increase the counter and continue the algorithm for one of the child nodes. The algorithm terminates if counter is bigger than equal k or if there is no node left to check. The running time is O(k) because at most k node will be iterated and each iteration is in O(1).

    A pseudo-code looks like as follows.

        void CheckNode(Node node,int k, int x, ref int counter)
        {
            if (node.value > x)
            {
                counter++;
                if (counter >= k)
                    return;
    
                CheckNode(node.Left, k, x, ref counter);
                CheckNode(node.Right,k, x, ref counter);
            }
        }
    

    use it:

            counter = 0;
            CheckNode(root,index,val,counter );
            if (counter >= index)
                return true;
            return false;
    

    if node.value < x then all children values are smaller than x and there is no need to check.

    As @Eric Mickelsen mentioned in comments worst case running time is exactly 2k-1 (k>0) as follows.

    The number of nodes visited with values greater than x will be at most k. Each node visited with value less than x must be a child of a visited node with value greater than x. However, because every node visited except the root must have a parent with value greater than x, the number of nodes of value less than x visited must be at most ((k-1)*2)-(k-1) = k-1, since k-1 of the (k-1)*2 children have values greater than x. This means that we visit k nodes greater than x and k-1 less than x, which is 2k-1.

    0 讨论(0)
  • 2020-12-02 15:29
    public class KSmallest2 {
    
    private MinPQ<Integer> minHeap;
    private int x;
    private int k;
    private int count = 0;
    
    public KSmallest2(String filename, int x, int k) {
        this.x = x;
        this.k = k;
        minHeap = new MinPQ<>();
        try {
            Scanner in = new Scanner(new File(filename));
            while (in.hasNext()) {
                minHeap.insert(in.nextInt());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    public boolean check(int index) {
    
        if (index > minHeap.size()) {
            return false;
        }
    
        if (minHeap.getByIndex(index) < x) {
            count++;
            if (count >= k) {
                return true;
            }
    
            return  check(2 * index) ||
                    check(2 * index + 1);
        }
    
        return false;
    }
    
    
    
    public static void main(String[] args) {
        KSmallest2 ks = new KSmallest2("src/main/resources/minheap.txt", 18, 5);
        System.out.println(ks.minHeap);
    
        System.out.println(ks.check(1));
    }
    

    }

    0 讨论(0)
提交回复
热议问题