軟考 (三) 尋找演算法

來源:互聯網
上載者:User

          在程式設計中經常會執行尋找操作,有時需要在龐大的資料庫中尋找某一條記錄,這時尋找時間就顯得尤為重要,怎麼樣才能節省尋找時間?提高尋找效率呢,下面我們來看一下常用的一些尋找演算法。

         

 

               【順序尋找】

            一 、概念

                 從表的一端開始,順序掃描線性表,依次將掃描到的結點關鍵宇和給定值K相比較。若當前掃描到的結點關鍵字與K相等,則尋找成功;若掃描結束後,仍未找到關鍵字等於K的結點,則尋找失敗。

            二、特點

                它尋找表的儲存結構:既適用於順序儲存結構,也適用於鏈式儲存結構。

                那麼我們怎麼知道一個演算法好壞呢,在這裡我們利用時間複雜度和空間複雜度表示,又由於空間複雜度一般是相同的,就不予考慮,我們只考慮時間複雜度,我們可以用平均尋找長度ASL表示:如下面公式

               在等機率情況下,pi=1/n(1≤i≤n),故成功的平均尋找長度為
                n+1)/2

         

            【二分尋找】

              一、二分尋找(Binary Search)

                  二分尋找又稱折半尋找,它是一種效率較高的尋找方法。
                  二分尋找要求:線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。

              二、二分尋找的基本思想

                 二分尋找的基本思想是:(設R[low..high]是當前的尋找區間)
          (1)首先確定該區間的中點位置:
 

          (2)然後將待查的K值與R[mid].key比較:若相等,則尋找成功並返回此位置,否則須確定新的尋找區間,繼續二分尋找,具體方法如下:

                ①若R[mid].key>K,則由表的有序性可知R[mid..n].keys均大於K,因此若表中存在關鍵字等於K的結點,則該結點必定是在位置mid左邊的子表R[1..mid-1]中,故新的尋找區間是左子表R[1..mid-1]。
                ②類似地,若R[mid].key<K,則要尋找的K必在mid的右子表R[mid+1..n]中,即新的尋找區間是右子表R[mid+1..n]。下一次尋找是針對新的尋找區間進行的。

                因此,從初始的尋找區間R[1..n]開始,每經過一次與當前尋找區間的中點位置上的結點關鍵字的比較,就可確定尋找是否成功,不成功則當前的尋找區間就縮小一半。這一過程重複直至找到關鍵字為K的結點,或者直至當前的尋找區間為空白(即尋找失敗)時為止。

             三、二分尋找判定樹

                二分尋找過程可用二叉樹來描述:把當前尋找區間的中間位置上的結點作為根,左子表和右子表中的結點分別作為根的左子樹和右子樹。由此得到的二叉樹,稱為描述二分尋找的判定樹(Decision Tree)或比較樹(Comparison Tree)。
    
(1)二分尋找判定樹的組成

  ①圓結點即樹中的內部結點。樹中圓結點內的數字表示該結點在有序表中的位置。
  ②外部結點:圓結點中的所有null 指標均用一個虛擬方形結點來取代,即外部結點。
  ③樹中某結點i與其左(右)孩子串連的左(右)分支上的標記"<"、"("、">"、")"表示:當待查關鍵字K<R[i].key(K>R[i].key)時,應走左(右)分支到達i的左(右)孩子,將該孩子的關鍵字進一步和K比較。若相等,則尋找過程結束返回,否則繼續將K與樹中更下一層的結點比較。

(2)二分尋找判定樹的尋找
  二分尋找就是將給定值K與二分尋找判定樹的根結點的關鍵字進行比較。若相等,成功。否則若小於根結點的關鍵字,到左子樹中尋找。若大於根結點的關鍵字,則到右子樹中尋找。
  
【例】待查表的關鍵字序列為:(05,13,19,21,37,56,64,75,80,88,92),若要尋找K=85的記錄,所經過的內部結點為6、9、10,最後到達方形結點"9-10",其比較次數為3。
 實際上方形結點中"i-i+1"的含意為被尋找值K是介於R[i].key和R[i+1].key之間的,即R[i].key<K<R[i+1].key。

(3)二分尋找的平均尋找長度
 設內部結點的總數為n=2h-1,則判定樹是深度為h=lg(n+1)的滿二叉樹(深度h不計外部結點)。樹中第k層上的結點個數為2k-1,尋找它們所需的比較次數是k。因此在等機率假設下,二分尋找成功時的平均尋找長度為:
ASLbn≈lg(n+1)-1
  二分尋找在尋找失敗時所需比較的關鍵字個數不超過判定樹的深度,在最壞情況下尋找成功的比較次數也不超過判定樹的深度。即為:

  二分尋找的最壞效能和平均效能相當接近。

              五、二分尋找的優點和缺點


  雖然二分尋找的效率高,但是要將表按關鍵字排序。而排序本身是一種很費時的運算。既使採用高效率的排序方法也要花費O(nlgn)的時間。
  二分尋找只適用順序儲存結構。為保持表的有序性,在順序結構裡插入和刪除都必須移動大量的結點。因此,二分尋找特別適用於那種一經建立就很少改動、而又經常需要尋找的線性表。
  對那些尋找少而又經常需要改動的線性表,可採用鏈表作儲存結構,進行順序尋找。鏈表上無法實現二分尋找。

 

            【分塊尋找】

 

              一、概念:

                    分塊尋找是一種效能介於順序尋找和二分尋找之間的一種尋找方法,但它要求先對尋找表建立一個索引表,再進行分塊尋找。

 

              二、 索引表建立方法:

                    先對尋找表進行分塊,要求"分塊有序",即塊內關鍵字不一定有序,但塊件間有序。然後,抽取各塊中的最大關鍵字及其起始位置構成一個索引表。如:

            

 

                  可以看出分開尋找主要由兩部分組成:索引表和分塊序列。

          並有如下特點:

             A  索引表為有序序列

             B  分塊間有順序、塊內無序

          根據特點可確定它的尋找方法:分兩步進行,先尋找索引表,因其有序,故可採用二分法尋找,以確定待查記錄在哪一塊,然後,在已確定的塊中進行再順序尋找。
           帶入公式則分塊尋找的平均尋找長度為:ASLbs=Lb+Lw=log2(b+1)-1+(s+1)/2 ≈
log2(n/s+1)+ s/2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.