查找元素的几种常用方法

  • 1.顺序查找
  • 2.折半查找
  • 3.分块查找


1.顺序查找

顺序查找的思想很简单,就是遍历数组,和需要查找的元素进行比较,直到匹配为止。

寻找tensor某元素索引 查找元素_算法

int OrderFind(int arr[], int value){
        int index = 0;     //value值对应数组的索引
        for (int i = 0; i < arr.length; i++)
        {
            if (arr[i] == value)
            {
                index = i;
                break;
            }

        }
        return index+1;
    }

对于这个算法,最好的情况很显然就是需要查找的元素在第一个位置,所以时间复杂度为O(1)

最坏的情况就是需要查找的元素在最后一个位置,所以时间复杂度为O(n)

很显然平均复杂度为O(n/2)

2.折半查找

折半查找对数组的要求有点高,就是需要数组是已经排好序的。算法思想就是首先确定中间值(一开始为数组索引最中间的那个数),然后和需要查找的元素进行比较大小,如果小于,则放到小于中间值的区域,反之则进行相反的操作,然后又进行同样的操作,直到区域的左右区间相等(如果此时仍没有找到需要查找的元素)。

寻找tensor某元素索引 查找元素_顺序查找_02

int FindByHalf(int[] arr,int left,int right,int value){
        int middle = (left+right)/2;
        if(left > right){
            System.out.println("没有找到元素!");
            return -1;
        }
        if (value == arr[middle]){
            return middle;
        }
        else {
            if(value > arr[middle]){
                return FindByHalf(arr, middle+1, right, value);
            }
            else {
                return FindByHalf(arr, left, middle-1, value);
            }
        }
    }

3.分块查找

分块查找是顺序查找的一个改进。分块查找的思想就是将n个数据元素“按块有序”划分为m块(m<=n)。每一块中的数据元素不必有序,但块与块之间必须“按块有序”,即第1块中的最大的元素必须小于第2块中最小的元素;而第2块中最大的元素又小于第3块中的最小的元素,如此反复。然后在每一块中找出最大的元素和它的索引,建立一个索引表。因为索引表是有序的,如果说索引表很长的话,可以采用折半查找来查找被查找的元素在哪一块区域,然后在区域中通过顺序查找来查找对应的元素。

int BlockFind(HashMap<Integer,Integer> I,int b,int n,int arr[],int value)
    {
        int number;   //每一块的元素个数
        if ( n % b == 0)
            number = n / b;
        else
            number =  (n /b) + 1;
        int low = 0, high = b-1,mid,i;
        while (low <= high)
        {
            mid = (low + high)/2;
            if (I.get(mid) >= value)
            {
                high = mid - 1;
            }
            else
            {
                low = mid + 1;
            }
        }
        i = (high + 1) * number;
        while (i < (high + 2) * number && arr[i] != value && i < arr.length)  //i < arr.length是为了防止最后一组越界
        {
            i++;
        }
        if (i < (high + 2) * number)
        {
            return i+1;
        }
        else
        {
            return -1;
        }
    }

由于博主的水平限制,可能会有一些问题,希望大家指正。