【问题标题】:search 200 k array of arrays of integers?? java搜索 200 k 整数数组数组?爪哇
【发布时间】:2015-04-16 09:11:16
【问题描述】:

我有一个包含 200 000 行整数的数组(包含较小的整数数组)。每行包含 1 - 20 个成员。整数的值是 0-200。看起来像这样:

...

[42, 66, 54, 145, 183, 198, 104, 24, 22, 125, 127]
[71, 149, 59, 147, 115, 36, 124]  // <--lets say i am searching for this line
[27, 141, 19, 75, 101, 149, 36, 7, 12, 108, 69, 149, 1, 39, 55, 87, 178, 76, 133]
[94, 170, 185, 17, 121, 42, 51, 70, 176, 187, 31, 181, 167, 200, 144, 126, 123, 120, 91, 40]
[112, 162, 173, 145, 0, 165, 106, 137]
[141, 198, 32]
...

如何在其中搜索特定的行?请指导我正确的方向,如果可能的话将我链接到示例。

我的意思是搜索 - 当我输入 71、149、59 时,我会得到我的行(如果有几行类似的行,则接近它)。
花几天时间阅读仍然不知道如何进行。请帮忙。 (我的列表按升序排序)

哪种方法更好,散列?二进制搜索?任何好的关键字或链接表示赞赏(我第一次进行搜索)

【问题讨论】:

  • 如果您已经花费了几天的时间,您能否展示您的尝试并解释您遇到的具体问题。就目前而言,您要求我们为您编写它。
  • 另外,最好建立一个返回“the”行的规则。也许有一条规则说“我将返回包含someString 的第一行”;它可以是您希望的复杂规则,但不要对自己引入不必要的限制。
  • @Chief 如果你为我写,我会很高兴 :) 但如果你指出我正确的方向也会很好:)
  • 我不明白寻找线路的标准。它必须包含您输入的所有数字吗?我的顺序一样吗?紧挨着吗?
  • 从左到右的顺序相同。但不一定是所有数字。所以输入 71 会找到很多行,输入 71、149、59 会返回几行或只返回一行。

标签: java arrays sorting search


【解决方案1】:

我怀疑您正试图过早地优化您的搜索。除非您打算每秒执行多次,否则详尽的搜索应该没问题。我假设“接近它”你的意图是找到所有以你传入的值开头的数组。

这是使用 Java 8 进行的详尽搜索:

List<int[]> searchForArrays(int[][] data, int[] value) {
    return Arrays.stream(data).parallel()
        .filter(line -> {
            for (int i = 0; i < value.length; i++)
                if (i >= line.length || value[i] != line[i])
                    return false;
            return true;
        });
        .collect(Collectors.toList());
}

这会查找与您的搜索词匹配的所有数组。如果您只需要找到一个匹配的数组并且您的数组已排序,那么您可以使用二分搜索加快速度:

int[] binarySearch(int[][] data, int from, int to, int[] value) {
    int trial = (from + to) / 2;
    if (from >= to)
        return new int[]{};
    int compare = compareTo(data[trial], value);
    if (compare < 0)
        return binarySearch(data, from, trial, value);
    else if (compare > 0)
        return binarySearch(data, trial, to, value);
    else 
        return data[trial];
}

如果您确实需要优化,那么您最好将数据重新组织成一棵树,其中包含从值到节点的映射。然后搜索将是一件小事,只需按照树的节点查找您正在搜索的值。这可能类似于:

class Node {
    private final Map<Integer, Node> children;
    private boolean terminal;
}

【讨论】:

  • 详尽搜索。感谢关键字和示例。是的,我不需要每秒搜索多次,只需单击按钮即可。
  • 我最终使用了详尽的搜索 - 从开始循环遍历列表,直到我发现我的行在没有优化的情况下似乎已经足够快了,thanx 4 指导
【解决方案2】:

像下面这样的东西怎么样,如果合适的话,我可以稍后充实它:

package area51;

import java.util.ArrayList;
import java.util.List;

public class Junk {
    Node root;
    static void main(String[] args) {

    }

    public Node initialize() {
        root = new Node(0);
        int[][] matrix = { { 1, 2, 3 }, { 4, 5, 6 } };
        for (int[] row : matrix) {
            Node parent = root;
            for (int childValue : row) {
                parent = parent.addChild(childValue);
            }
        }
        return root;
    }

    public List<int[]> find(int[] key, int limit){
        //use some recursion
        List<int[]> list = new ArrayList<int[]>();
        Node node = root;
        for (Node child: node.children){
            ....
        }
        return list;
    }


    class Node {
        int value;
        List<Node> children;

        Node(int value) {
            super();
            this.value = value;
        }

        Node addChild(int childValue) {
            if (children == null) {
                children = new ArrayList<Node>();
            }
            Node child = new Node(childValue);
            children.add(child);
            return child;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多