Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取k min元素';s原始索引_Java_Algorithm_Sorting - Fatal编程技术网

Java 如何获取k min元素';s原始索引

Java 如何获取k min元素';s原始索引,java,algorithm,sorting,Java,Algorithm,Sorting,我有一个类似{40,78,56,98,1,-9}的数组,这个数组的大小可能很大。我想得到第一个K min元素的索引。我可以使用最小堆/优先级队列以非常好的时间复杂度获得K min元素。但我不知道怎样才能得到他们的索引。请指导我如何解决我的问题 我曾尝试使用TreeMap来获得相同的结果,但若数组变大,那个么这将花费太多时间 范例 输入:{40,78,56,98,1,-9},K=2 输出:{5,4}好的,我假设您需要如下内容:获取给定数组前2分钟元素的索引。可以通过以下方式实现: int[] a

我有一个类似{40,78,56,98,1,-9}的数组,这个数组的大小可能很大。我想得到第一个K min元素的索引。我可以使用最小堆/优先级队列以非常好的时间复杂度获得K min元素。但我不知道怎样才能得到他们的索引。请指导我如何解决我的问题

我曾尝试使用TreeMap来获得相同的结果,但若数组变大,那个么这将花费太多时间

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

好的,我假设您需要如下内容:获取给定数组前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();

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

class Pair {
    Pair(int val, int idx){
        this.val = val;
        this.idx = idx;
    }
    int val;
    int idx;
}
  • 您可以创建一个最大堆,并向其中添加第一个k元素
  • 从第(k+1)个元素遍历数组
  • 检查max元素(即堆的根)是否小于(k+1)th元素,如果小于,则删除max元素并将新元素添加到堆中,创建新的Pair对象
  • 执行步骤3,直到到达阵列末端
  • 您可以按如下方式初始化优先级队列:

    Queue<Pair> maxHeap = new PriorityQueue<>(k, (pair1, pair2) -> -Integer.compare(pair1.val, pair2.val));
    
    Queue maxHeap=new PriorityQueue(k,(pair1,pair2)->-Integer.compare(pair1.val,pair2.val));
    
    在你的例子中你是如何得到{3,1}的?@NestorSokil对不起,我很愚蠢,现在它是正确的。看看我的答案,看看它是否适合你@ManishSharmaI想学习lambda和函数式编程,根据您的要求,应该是我的初始路径。上述方法都是关于比较两个对象的,您可以编写一个匿名类比较器,或者您可以在Pair类中实现可比接口,在这种情况下与函数式编程无关。关于lambdas,如果你尝试使用它们并将它们带到你的实践中,你会习惯的。学习和阅读同样的东西有多种来源。你可以很容易地通过谷歌找到它们。