Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 降低算法的复杂度_Java_Arrays - Fatal编程技术网

Java 降低算法的复杂度

Java 降低算法的复杂度,java,arrays,Java,Arrays,代码: private static String[][]\u list=新字符串[200][100]; 私有静态int foundIndex(字符串s){ 对于(int i=0;i(x,y)和rev(x,y)->z的函数。我并不是说,当性能是您最关心的问题时,您会这样做。但这是可能的。例如,对于排序,您需要能够交换a(i)和a(i+1)。如图所示,您可以使用该映射器函数简单地计算a(f(i))和a(f(i+)的结果。 public static void put(int i, int j, S

代码:

private static String[][]\u list=新字符串[200][100];
私有静态int foundIndex(字符串s){
对于(int i=0;i<200;i++){
对于(int j=0;j<100;j++){
如果(_列出[i][j].equals(s)=true){
返回j;
}
}
}
返回-1;
}
问题就从这里开始

如果我要查找的代码是
\u list[180][?]
,则很难找到它


如何加速我的代码?

您无法在比
O(n*m)
更短的时间内对
nxm
数组中的每个元素进行比较。您可以将数据结构更改为支持快速检查的数据结构->如果您有一个可以在
O(n*m)
时间内构造的
HashSet
,您将能够在
O(1)
时间内检查项目是否在集合中。如果在数组末尾附近检查两次,这将非常有效

可以通过删除不起任何作用的
==true
来简化代码。我还建议您使用Java命名约定,这样您的代码将更易于阅读


另外,您可能应该使用类来返回这两个值:
i
j
我们只能看到部分代码,但在某些情况下,您可以通过在HashMap中使用索引来提高速度:

private static String[][] _lists = new String[200][100];

private static int foundIndex (String s) {
  for (int i = 0; i < 200; i++) {
    for (int j = 0; j < 100; j++) {
        if (_lists[i][j].equals(s) == true) {
            return j;
        }
    }
  }
  return -1;
}
然后,您的方法foundIndex将变为:

public static void put(int i, int j, String value) {
    _lists[i][j] = value;
    Point pos = _index.get(value);
    if (pos == null || pos.x > i || pos.x == i && pos.y > j) {
        _index.put(value, new Point(i, j));
    }
}

其他答案是正确的:当您有n*m或n个要搜索的元素时,您必须迭代所有元素

这里唯一的另一件事是:有时您可以将n个元素分成更小的组,并并行处理这些组

换言之,您可以有10个线程,每个线程都在数组的不同部分工作。你等待他们完成;然后在大于-1的单个结果上建立最小值

但是:您正在谈论20000个字符串比较。是的,听起来很多,但在现代硬件上并不多。只有当您调用
findIndex()
(提示:方法名也应该遵循语法规则!)时(比如每分钟调用100次),才会出现问题。在这种情况下,您需要重新设计数据结构。当查找元素是您的主要需求时,使用列表是没有意义的。那你就用一套吧


或者无需重新设计:首先对数据进行排序(可能需要记住初始i,j),然后可以应用二进制搜索来识别相应的元素

数据是否以任何方式排序?您可以使用不同的容器来
String[][]
吗?嗯,您不能。这里有一个
O(n²)
算法,根据给出的信息,您可以得到最好的结果。提示:这不是python。不要在名称中使用下划线-唯一的例外是SOME_CONSTANT=…并且仅供记录:请不要忘记答案。(我只是在检查我的旧答案,我发现无数的新手问一个问题,人们花时间来帮助他们……然后OP消失了,这个问题永远不会被接受。)你给出了代码,我给出了一些解释。我觉得很合身;-)@GhostCat I添加了重构:)@Xentros您做错了:_列表有下划线,并且您没有将_索引更改为indexMap everywhere。我做了一次回滚。@MauricePerry我知道它有,但它不应该。@MauricePerry非常感谢你!速度非常快。在430毫秒时处理了100322条“字符串”表达式。我喜欢Hashmap:)二维数组上的二进制搜索?当然。二维数组有n*m个元素。您可以很容易地定义一个方法,将一维索引映射到二维对象上。当然可以,但为什么要对二维数据进行排序,使其表现为一维?这就像在
字段[64]
中表示棋盘一样,不会搞乱初始化2d数组;pAgain:你只需要定义做f(z)->(x,y)和rev(x,y)->z的函数。我并不是说,当性能是您最关心的问题时,您会这样做。但这是可能的。例如,对于排序,您需要能够交换a(i)和a(i+1)。如图所示,您可以使用该映射器函数简单地计算a(f(i))和a(f(i+)的结果。
public static void put(int i, int j, String value) {
    _lists[i][j] = value;
    Point pos = _index.get(value);
    if (pos == null || pos.x > i || pos.x == i && pos.y > j) {
        _index.put(value, new Point(i, j));
    }
}
private static int foundIndex(String s) {
    Point pos = _index.get(s);
    return pos == null ? -1 : pos.y;
}