数据结构之查找

来源:互联网 发布:java 绝对值运算符 编辑:程序博客网 时间:2024/06/05 06:27

一、顺序查找法:时间复杂度为O(n)
二、有序查找法:前提是数据是有序的
1、二分查找法(折半查找法):要定义头角标、中间角标、尾角标。
  折半查找的时间复杂度是O(logn)
  如果涉及频繁的插入和删除,最好不要使用折半查找。
  
例:数组查询

int max,mid,minmin=0;max=arr.length-1;min=(max+min)>>1;while(arr[mid] != key){    if(key>arr[mid])       min=mid+1;    else if(key<arr[mid])       max=mid-1;    if(max<min)       return -1;    mid=(max+min)>>1;}

2、插值查找
  插值查找将折半查找的角标变化的公式进行了改进mid=min+keyarr[min]arr[max]arr[min](maxmin),时间复杂度依旧是O(logn),但是如果表很大的话,插值查找算法的平均性能要比折半查找好得多。
3、裴波那契查找
  事先设置一个裴波那契数列F={0,1,1,2,3,5,8,13,21,34,55……}
  裴波那契查找的角标换算公式是mid=min+F[k1]1,其时间复杂度是O(logn)
  

static int FibonacciSearch(int [] a, int n, int key){            int [] F = {0,1,1,2,3,5,8,13,21,34};            int low, high, mid, i, k;            low = 1;            high = n;            k = 0;            while (n > F[k]-1) /* 计算n位于斐波那契数列的位置 */                k++;            while (low <= high) {                mid = low + F[k-1] -1;                if (key < a[mid]){                    high = mid - 1;                    k = k - 1;                }                else if (key > a[mid]){                    low = mid + 1;                    k = k - 2;                }                else {                    if (mid <= n)                        return mid;                    else                        return n;                }            }            return 0;        }

 虽然他们的时间复杂度都是O(logn),但是按平均性能:斐波那契>折半>插值。因为对于海量数据查找,折半查找是进行加法和除法运算,插值查找是进行四则运算,而斐波那契查找只有加减法运算。

0 0
原创粉丝点击