搜索无序整数数组

时间:2013-03-13 15:53:28

标签: java arrays search

搜索索引的最佳方法是什么,以及属于大型无序整数数组的整数元素的值是什么?对于这个过程,这是最好的搜索tecnhique /算法?

int[] temp = new int[]{1,4,3,6,7,8,5,2,9,......}

现在说,我想搜索元素'9',我也需要获得该元素的索引。我的意思是说,排序数组元素并确定它在这里不起作用(因为我需要跟踪元素的索引)。有什么建议?我正在研究java ..

6 个答案:

答案 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)