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中搜索多个min_Java_Arrays - Fatal编程技术网

在java中搜索多个min

在java中搜索多个min,java,arrays,Java,Arrays,我是java的新手。我在java中搜索很多min时遇到问题。 我有一个大数据。但是像这样的例子数据 k[][] = [74 85 123 73 84 122 72 83 121 70 81 119 69 80 118 76 87 125 77 88 126

我是java的新手。我在java中搜索很多min时遇到问题。 我有一个大数据。但是像这样的例子数据

    k[][] =   [74   85  123 
               73   84  122
               72   83  121
               70   81  119
               69   80  118
               76   87  125
               77   88  126
               78   89  127];
min1 = 69    min1 = 80   min1 = 118
min2 = 70    min2 = 81   min2 = 119
min3 = 72    min3 = 83   min3 = 121
我想要这样的输出

    k[][] =   [74   85  123 
               73   84  122
               72   83  121
               70   81  119
               69   80  118
               76   87  125
               77   88  126
               78   89  127];
min1 = 69    min1 = 80   min1 = 118
min2 = 70    min2 = 81   min2 = 119
min3 = 72    min3 = 83   min3 = 121
我在这些数据中使用排序,但结果并不有效。 有人帮帮我吗
thx

假设您的数据有N行和M列

  • 迭代每一列
  • 将列中的所有元素添加到minHeap(最小优先级队列)中
  • 从minHeap中检索前3个数字(这将是3分钟)
  • 清除队列并转到下一列

  • O(n)空间,O(MNlg(n))时间

    这里是一个使用助手类查找最低X整数的通用实现

    对于三列,将创建helper类的三个实例,然后迭代数据以收集每列的三个最低值

    此代码的优点是:

    • 仅保留最低的X值
    • 不需要对整数进行装箱
    • 使用二进制搜索提高X值较高时的性能
    这意味着它应该速度快,内存占用少,支持无限量的数据(如果流式传输)

    请参见演示

    import java.util.Arrays;
    
    class Ideone {
        private static final int MIN_COUNT = 3;
        public static void main(String[] args) {
            int[][] data = { { 74, 85, 123 },
                             { 73, 84, 122 },
                             { 72, 83, 121 },
                             { 70, 81, 119 },
                             { 69, 80, 118 },
                             { 76, 87, 125 },
                             { 77, 88, 126 },
                             { 78, 89, 127 } };
            // Initialize min collectors
            Min[] min = new Min[data[0].length];
            for (int col = 0; col < min.length; col++)
                min[col] = new Min(MIN_COUNT);
            // Collect data
            for (int row = 0; row < data.length; row++)
                for (int col = 0; col < min.length; col++)
                    min[col].add(data[row][col]);
            // Print result
            for (int i = 0; i < MIN_COUNT; i++) {
                for (int col = 0; col < min.length; col++)
                    System.out.printf("min%d = %-5d ", i + 1, min[col].get(i));
                System.out.println();
            }
        }
    }
    class Min {
        private int[] min;
        public Min(int count) {
            this.min = new int[count];
            Arrays.fill(this.min, Integer.MAX_VALUE);
        }
        public void add(int value) {
            int idx = Arrays.binarySearch(this.min, value);
            if (idx != -this.min.length - 1) { // not insert at end
                if (idx < 0)
                    idx = -idx - 1;
                System.arraycopy(this.min, idx, this.min, idx + 1, this.min.length - idx - 1);
                this.min[idx] = value;
            }
        }
        public int get(int index) {
            return this.min[index];
        }
    }
    
    导入java.util.array;
    表意文字{
    私有静态最终整数最小计数=3;
    公共静态void main(字符串[]args){
    int[]data={{74,85,123},
    { 73, 84, 122 },
    { 72, 83, 121 },
    { 70, 81, 119 },
    { 69, 80, 118 },
    { 76, 87, 125 },
    { 77, 88, 126 },
    { 78, 89, 127 } };
    //初始化最小收集器
    Min[]Min=新的Min[数据[0]。长度];
    用于(int col=0;col
    对不起,我不知道你在问什么。你能澄清你面临的问题吗?你说的“结果没有效率”是什么意思?你是想在每列中找到三个最小的元素吗?@PM77-1我想OP需要什么,但他的数据结构和问题有点不清楚。你可以使用树形图吗?是的,我想在每列中找到三个小元素。这段代码很好。但如果我有数据是双精度不是整数?怎么做?@swatzz你是认真的吗?