📜  流中最大 K 个数字的平均值

📅  最后修改于: 2021-10-28 02:09:59             🧑  作者: Mango

给定一个包含“N”个数字和一个整数“K”的列表。任务是在每次查询后打印最大“K”个数字的平均值,其中查询由一个需要添加到元素列表中的整数元素组成。
注意:查询是用整数数组 ‘q’ 定义的

例子:

方法:堆(最小堆)数据结构可用于解决此类问题,其中元素的插入和删除可以在 O(log n) 时间内执行。

  • 最初,将给定元素列表中的最大 k 个元素存储在最小堆中。
  • 如果传入元素小于或等于当前位于最小堆根部的元素,则丢弃该元素,因为它对平均值没有影响。
  • 否则,如果该数字大于根元素,则删除最小堆的根,然后插入新元素,然后计算当前堆中元素的平均值。
  • 打印平均值并为所有传入元素重复上述两个步骤。

下面是上述方法的实现:

// Java implementation of the approach
import java.util.*;
  
class GFG {
  
    // Function that returns the
    // average of max k elements in
    // the list after each query
    static void max_average_k_numbers(int n,
                                      int k,
                                      int m,
                                      int[] arr,
                                      int[] query)
    {
        double max_avg = 0.0;
  
        // min-heap to maintain
        // the max k elements at
        // any point of time;
        PriorityQueue pq = new PriorityQueue();
  
        // Sort the array
        // in ascending order
        Arrays.sort(arr);
  
        // add max k elements
        // to the heap
        double sum = 0;
        for (int i = n - 1; i >= n - k; i--) {
            pq.add(arr[i]);
            sum = sum + arr[i];
        }
  
        // perform offline queries
        for (int i = 0; i < m; i++) {
  
            // if the minimum element in
            // the heap is less than
            // the incoming element
            if (query[i] > pq.peek()) {
                int polled = pq.poll();
                pq.add(query[i]);
  
                // decrement the current
                // sum by the polled element
                sum = sum - polled;
  
                // increment sum by the
                // incoming element
                sum = sum + query[i];
            }
  
            // compute the average
            max_avg = sum / (double)k;
            System.out.println(max_avg);
        }
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int n = 4;
        int k = 3;
        int m = 4;
        int[] arr = new int[] { 1, 2, 3, 4 };
        int[] query = new int[] { 7, 2, 1, 5 };
  
        max_average_k_numbers(n, k, m, arr, query);
    }
}
输出:
4.666666666666667
4.666666666666667
4.666666666666667
5.333333333333333

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。