如何获得k min元素的原始索引

时间:2019-03-24 13:48:59

标签: java algorithm sorting

我有一个像{40,78,56,98,1,-9}的数组,这个数组的大小可能很大。我想获取第一个K min元素的索引。我可以使用min-heap / priority-queue获得非常好的时间复杂度的K min个元素。但是我不知道如何获得他们的索引。请以某种方式指导我解决我的问题。

我尝试使用TreeMap获得相同的信息,但是如果数组变大,那将花费太多时间。

示例 输入:{40,78,56,98,1,-9},K = 2 输出:{5,4}

2 个答案:

答案 0 :(得分:0)

好吧,我假设您需要执行以下操作:获取给定数组的前2分钟元素的索引。可以通过以下方式实现:

 int[] array = {5,75,73,4,78,6,4,3,4,3,64};
 // stream the array of integers, box them, sort them by comparing values of their indexes, unbox them, limit only first 2 and get them to array.
 int[] getIndexes = IntStream.range(0, array.length).boxed().sorted(Comparator.comparing(i -> array[i])).mapToInt(i->i).limit(2).toArray();

答案 1 :(得分:0)

如果被允许使用优先级队列,则可以通过创建一个类对并在初始化优先级队列的同时传递一个比较器来在优先级队列中添加值和索引。 Pair类可以如下:

class Pair {
    Pair(int val, int idx){
        this.val = val;
        this.idx = idx;
    }
    int val;
    int idx;
}
  1. 您可以创建一个最大堆,并在其中添加前 k 个元素。
  2. 从第(k + 1)个元素遍历数组。
  3. 检查max元素(即堆的根)是否小于(k + 1)th 元素(如果小于),则删除max元素并添加新元素创建新的Pair对象。
  4. 执行步骤3 ,直到到达数组末尾。

您可以按以下方式初始化优先级队列:

Queue<Pair> maxHeap = new PriorityQueue<>(k, (pair1, pair2) -> -Integer.compare(pair1.val, pair2.val));