搜索索引的最佳方法是什么,以及属于大型无序整数数组的整数元素的值是什么?对于这个过程,这是最好的搜索tecnhique /算法?
int[] temp = new int[]{1,4,3,6,7,8,5,2,9,......}
现在说,我想搜索元素'9',我也需要获得该元素的索引。我的意思是说,排序数组元素并确定它在这里不起作用(因为我需要跟踪元素的索引)。有什么建议?我正在研究java ..
答案 0 :(得分:5)
如果您手动执行此操作,则可以迭代每个数组项:
public int indexOf(int search, int[] arr) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] == search) {
return i;
}
}
return -1;
}
如果你知道数组在进行多次搜索之间不会改变,你也可以使用Map缓存结果..只要你更改数组就清空缓存。
private Map<Integer, Integer> indexCache;
public int indexOf(int search, int[] arr) {
Integer cachedIndex = indexCache.get(search);
if(cachedIndex != null) return cachedIndex;
for(int i = 0; i < arr.length; i++) {
if(arr[i] == search) {
indexCache.put(search, i);
return i;
}
}
return -1;
}
实际上,最好使用Map而不是数组来存储这些数据,因为它更适合于键值查找。
答案 1 :(得分:2)
如果需要多次搜索(同一个数组),可以创建一个临时结构,它结合了原始索引和值:
class Pair implements Comparable<Pair> {
final int index;
final int value;
Pair(int index, int value) {
this.index = index;
this.value = value;
}
public int compareTo(Pair oth) {
if (value < oth.value) return -1;
else if (value > oth.value) return 1;
else if (index < oth.index) return -1;
else if (index > oth.index) return 1;
else return 0;
}
}
final ArrayList<Pair> list = new ArrayList<Pair>();
for (int k = 0; k < array.length; ++k) {
list.add(new Pair(k, array[k]);
}
Arrays.sort(list);
现在,list
按值排序,然后按索引排序。我们现在可以使用二进制搜索(例如)来查看元素。但是请注意,这只是值得的,如果你搜索一个值(现在是O(log n)
而不是O(n)
)的次数,则会占用构建数组所需的时间({{ 1}}由于排序)。
或者,您可以使用(O(n log n)
或HashMap
构建类似索引的结构,该结构从整数值映射到其在数组中的位置。在使用TreeMap
的情况下,访问时间约为HashMap
,如果是O(1)
则为TreeMap
,与提议的二元搜索方法一样上方。
如果您必须经常搜索阵列,那么所有这些建议显然都是值得的。
另外,您应该考虑,如果阵列相当小,使用普通线性搜索(如其他人所建议的)可能实际上是最快的解决方案,因为所涉及的“常量”较低且阵列组件的位置较好。
所以,另一种方法可能是在排序成两个整数数组(一个包含值,另一个包含索引)后再次解包O(log n)
结构:
Pair
现在您可以使用二分查找搜索int[] values = new int[list.size()];
int[] indices = new int[list.size()];
int pt = 0;
for (Pair p: list) {
values[pt] = p.value;
indices[pt] = p.index;
pt += 1;
}
数组:
values
请记住:最简单的解决方案(线性扫描)可能是最快的,具体取决于阵列的大小和搜索条目所需的次数。我实际上会先尝试一下,只使用一个更复杂的提案,如果事实证明它是一个瓶颈。
答案 2 :(得分:1)
增强型:
int[] temp = new int[]{1,4,3,6,7,8,5,2,9,......}
for (int i : temp) {
if (i == 9)
// do something
}
答案 3 :(得分:0)
Begin at the beginning and go on till you come to the end: then stop.
Lewis Carroll
除非你在结束之前找到你想要的东西。
答案 4 :(得分:-1)
更好的方法是先对数组进行排序。
Arrays.sort(array);
Arrays.binarySearch(array, value);
扫描未排序的数组需要线性时间“O(n)”。如果您不想对数组进行排序,可以尝试此操作:
public int find(int[] array, int value) {
int index = -1;
for (int i=0; i<array.length; i++) {
if(array[i] == value) { index = i; }
}
return index;
}
答案 5 :(得分:-2)
最少的编码是:
Arrays.asList(temp).indexOf(9)