快速搜索java.util.LinkedList数组中的元素
嘿,我正在寻找一个更好的方法来搜索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<>();
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;
}