1. 程式人生 > >計算機演算法設計與分析之遞迴與分治策略——二分搜尋技術

計算機演算法設計與分析之遞迴與分治策略——二分搜尋技術

遞迴與分治策略

二分搜尋技術

  我們所熟知的二分搜尋演算法是運用分治策略的典型例子,針對這個演算法,先給出一個簡單的案例。

  目的:給定已排好序的n個元素a[0:n-1],現要在這n個元素中找出一特定的元素x。

  我們首先想到的最簡單的是用順序搜尋方法,逐個比較a[0:n-1]中元素,直至找出元素x或搜尋遍整個陣列後確定x不在其中。這個方法沒有很好地利用n個元素已排好序的這個條件,因此在最壞的情況下,順序搜尋方法需要O(n)次比較。

  而二分搜尋方法充分利用了元素間的次序關係,採用分治策略,可在最壞情況下用O(logn)時間完成搜尋任務。二分搜尋演算法的基本思想是,將n個元素分成個數大致相同的兩半,取a[n/2]與x作比較。如果x=a[n/2],則找到x,演算法終止;如果x<a[a/2],則只在陣列a的左半部繼續搜尋x;如果x>a[a/2],則只在陣列a的右半部繼續搜尋x。具體演算法可描述如下:

template<class Type>
int BinarySearch(Type a[], const Type& x, int n){
    //在a[0]<=a[1]<=...<=a[n-1]中搜索x
    //找到x時返回其在陣列中的位置,否則返回-1
    int left = 0;
    int right = n-1;
    while (left <= right){
        int middle = (left+right)/2;
        if (x == a[middle])
            return
middle; if (x > a[middle]) left = middle+1; else right = middle-1; } return-1; //未找到x }