Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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.util.LinkedList数组中的元素_Java - Fatal编程技术网

快速搜索java.util.LinkedList数组中的元素

快速搜索java.util.LinkedList数组中的元素,java,Java,嘿,我正在寻找一个更好的方法来搜索LinkedList数组中的字符串元素 public static void main(String[] args) { int m = 1000; LinkedList<String>[] arrayOfList = new LinkedList[m]; for (int i = 0; i < m; i++) { arrayOfList[i] = new LinkedList<>();

嘿,我正在寻找一个更好的方法来搜索LinkedList数组中的字符串元素

public static void main(String[] args) {
    int m = 1000;
    LinkedList<String>[] arrayOfList = new LinkedList[m];
    for (int i = 0; i < m; i++) {
        arrayOfList[i] = new LinkedList<>();
    }
}
我的搜索方法应该找到我的单词的索引。示例:搜索(“计算机”)=1;搜索(“房子”)=0

啊,经典

众所周知,LinkedList不适合随机访问,即list.get(j)方法。 它更擅长遍历列表,因此可以从每个项目跳到下一个项目

您可以使用list.iterator(),但foreach循环执行相同的操作:

public int search(String word) {
    for (int i = 0; i < m; i++) {
        for (String listValue: arrayOfList[i]) {
            if (listValue.equals(word)) {
                return i;
            }
        }
    }
    return -1;
}
public int搜索(字符串字){
for(int i=0;i
另一个答案指出,您可以通过迭代每个
链接列表而不是使用
列表来获得更好的性能。这是因为
List.get每次都必须从列表的开头开始搜索。例如,如果
LinkedList
有100个元素,那么对
List.get(j)
的每个调用平均都必须迭代50个元素,并且您要重复100次。foreach循环只在
LinkedList
元素上迭代一次

foreach策略在O(n)时间内运行,也就是说,执行查找所需的时间与n(单词总数)成比例增加,因为您必须为每个单词搜索所有单词

如果您打算经常这样做,并且可以使用除
LinkedList
之外的数据结构,那么您应该在
LinkedList
数组中迭代一次,并构建一个
HashMap
,其中键是单词,值是该单词出现的数组的编号。设置此
HashMap
将需要O(n)个时间,但后续查找只需要O(1)个时间,这意味着无论涉及的字数多少,时间都是恒定的。因此,如果您要执行的不仅仅是单个查找,那么创建
HashMap
在big-O方面将具有更好的性能,尽管对于非常少量的查找(2或3),扫描阵列可能会更快

您可以像这样构建一个
HashMap

Map<String, Integer> index = new HashMap<>();
for (int i = 0; i < m; i++) {
    for (String word: arrayOfList[i]) {
        index.put(word, i);
    }
}

根据程序中字符串的构造方式以及调用搜索方法的频率,测试字符串的哈希代码可以提高性能。例:

public int search(String word) {
    int wordHashCode = word.hashCode();
    for (int i = 0; i < m; i++) {
        for (String listValue: arrayOfList[i]) {
            if (listValue.hashCode() == wordHashCode && listValue.equals(word)) {
                return i;
            }
        }
    }
    return -1;
}
public int搜索(字符串字){
int-wordHashCode=word.hashCode();
for(int i=0;i
Map<String, Integer> index = new HashMap<>();
for (int i = 0; i < m; i++) {
    for (String word: arrayOfList[i]) {
        index.put(word, i);
    }
}
public int search(String word) {
    return index.getOrDefault(word, -1);
}
public int search(String word) {
    int wordHashCode = word.hashCode();
    for (int i = 0; i < m; i++) {
        for (String listValue: arrayOfList[i]) {
            if (listValue.hashCode() == wordHashCode && listValue.equals(word)) {
                return i;
            }
        }
    }
    return -1;
}