数据结构 JAVA描述(十四) 静态查找表

来源:互联网 发布:动态网络中的线粒体 编辑:程序博客网 时间:2024/04/29 23:34

顺序查找

顺序查找又称为线性查找,它是一种最简单、最基本的查找方法。

    /**     * @description 不带监视哨的顺序查找算法      * @date  2016年1月6日     */    public static int seqSearch(int[] a, int key){        int i = 0, n = a.length;        while(i < n && a[i] != key){            i++;        }        if(i < n){ //查找成功,返回下标            return i;        }        else{            return -1;        }    }    /**     * @description 从顺序表a[1]到a[n-1]的顺序表中顺序查找出关键字值为key的数据元素       * @date  2016年1月6日     */    public static int seqSearchWithGuard(int[] a, int key){        int i = a.length - 1;        a[0] = key;        while(a[i] != key){            i--;        }        if(i > 0){            return i;        }        else{            return -1;        }    }

对于带监视哨的查找算法,要查找到第i条元素,需比较次数为n-i+1,所以ASL=∑pi ci = (n+1)/2。查找失败时,比较次数都为n+1。因此时间复杂度是O(n)。

为了尽量提高查找速度,一种办法是在已知各个元素的查找概率不等的情况下,将各元素按照概率从小到大排序;另一种办法是在未知各个元素查找概率的情况下,在每次查找到一个元素时,就将它与前驱元素交换位置。


二分查找

二分查找又称为折半查找:

  • 置初值:low = 0,high = n-1
  • 当low < high,重复下列步骤
    • mid = (low + high)/ 2
    • 若key与a[mid]相等,则返回mid,查找成功
    • 若key < a[mid],则high = mid - 1;否则,low=mid+1
  • 当 low > high, 查找失败
/**     * @description 二分查找算法      * @param key     * @return     * @author liuquan     * @date  2016年1月6日     */    public static int binarySearch(int[] a, int key){        if(a.length > 0){            int low = 0, high = a.length - 1;            while(low <= high){                int mid = (low + high) / 2; //中间位置,当前比较的元素位置                if(a[mid] == key){                    return mid;                }                else if(a[mid] > key){                    high = mid - 1;                }                else{                    low = mid + 1;                }            }        }        return -1;    }

假设n=2^k - 1,线性表最多被评分k次即可完成查找,即在最坏情况下,k = ㏒₂(n+1)次即可结束,每次可查找的结点(即最坏情况下要比较最多的次数)是2^(i-1)。因此二分查找长度为ASL = 1/n∑(i * 2 ^(i-1)) = 1/n[(1+n)(㏒₂(n+1) - 1)+ 1] ≈ ㏒₂ (n+1) - 1

但二分查找要求关键字有序,且仅适用于顺序存储结构。

分块查找

分块查找又称索引顺序查找,它是顺序查找和二分法的结合:首先线性表分成若干块,在每一块中,结点的存放不一定有序,但块与块之间必须是有序的。还需建立一个索引表,将每一块中的最大的关键字值按块的顺序存放好。 ASL = Lb + La,Lb是查找索引表的平均查找长度,La是在某一块中查找的平均查找长度

0 0