费伯那西搜寻法.ppt

费伯那西搜寻法

費伯那西搜尋法 定義 費氏搜尋法和二元搜尋法十分類似 是將二元搜尋的中分方式,改變成費氏級數: 0,1,1,2,3,5,8,13,21,34,55,…。 其定義如下: F0 = 0; F1 = 1; Fi = Fi -1+Fi -2,i≧2。 它的好處是在搜尋過程中,只需用到加減法而不必用到除法,如此對於程式的效率有很大的幫助。 費氏搜尋樹 它是以費氏級數的特性建造的二元樹。 假設有F(n)-1筆由小至大排列的整數資料 若其排列的方式如下圖所示,則可它為n級完整費氏樹。 分成根節點、左子樹及右子樹三部分 左子樹的節點數為F(n-1)-1 右子樹的節點數為F(n-2)-1 各子樹仍為n-1級和n-2級的費氏樹 例:n=7,F(7)-1 =20 演算法 =>C語言程式碼 int fibsch(int a[ ], int n, int key) { int i, p, q, b ; b = chkfib( n+1 ) ; i = fib(b – 1) – 1 ; p = fib(b – 2) ; q = fib(b – 3) ; while (p = 0 q = 0) { if (key = = a[i ] { i - = q ; t = p ; p = q ; q = t – p ; } else { i + = q ; p - = q ; q - = p ; } } return(-1); } =>時間複雜度分析 【分析】 平均而言,費氏法的比較次數會少於二元搜尋法,但最壞的情況下則遜於二元法。其平均時間為O(log2N)。 程式實作 #include stdio.h void main ( ) { int data [10] = {75, 33, 98, 44, 56, 24, 65, 48, 83, 12} int i, input, p, q, b ; printf ( “\n Fibonacci search \n”) ; printf ( “\nData: “ ) ; for ( i= 0; i 10; i + +) { printf ( “%d “, data [i] ); puts(“ “); printf ( “\nPlease enter a number from data: “ ) ; scanf ( “%d”, input); printf ( “\nSearch…..\n” ) ; } 雜湊搜尋法 (Hashing) 定義 雜湊搜尋法是透過一個數學函數來計算或轉換一個鍵值所對應的位址,這種搜尋可以直接且快速的找到鍵值所放的地址,再者,任何透過雜湊搜尋的檔案皆不須經過事先的排序。也就是可以直接以下列方式搜尋資料: 鍵值 ---> 雜湊函數 ---> 位址 雜湊法又可稱為赫序法或散置法 雜湊法是將資料的鍵值或識別字經由一個已設計好的數學公式,將原來的鍵值轉換成對應的儲存位址。 是一種將鍵值轉換成位址的方法 一般而言,在有限的記憶體中,使用雜湊法能夠快速的建檔、插入、刪除、搜尋及更新。 雜湊法的優點 檔案不需事先排序過 在沒有碰撞及溢位的情形下,只需一次讀取即可,且其搜尋速度與資料量的多少無關; 保密性高,若不知散置函數,則無法擷取資料; 可做資料壓縮,利用適當的赫序函數,可將資料壓縮到一個較小的範圍內,節省空間。 雜湊函數 雜湊搜尋法是透過一個數學函數來計算或轉換一個鍵值所對應的位址 必須符合兩項特點 計算速度要快 碰撞頻率儘量小 雜湊函數的選取通常是考慮能否將關鍵值轉換索引地址時均勻地散開。 若關鍵值是字串,必須將字串根據ASCII碼轉換成數目。 雜湊(赫序)函數取得方式 除法(Division) 平方取中法(Mid-Square) 折疊法(Folding) 抽取法(Extraction) 乘法(Mutiplication) 基數法(Radix Method) 位數分析法(Digit Analysis) 雜湊表(hash table) 雜湊搜尋法是透過一個數學函數將關鍵值映射成表格之索引值,該關鍵值之記錄是依索引位置存放在表格內,此表格稱之為雜湊表 雜湊表格通常用來達成像字典般功能之資料結構。 例如拼字檢查,百科字典載入器之地址連結,編譯器裡的符號表,保留字表等查尋。例如學生檔案表格,以學號為關鍵值,姓名及平均成績為其欄位。 抽象資料型態(ADT) 一般表格的抽象資料型態(ADT)共有7個方法(子程序): Initialize() 事後狀態:表格是空的。 Isempty() 事後狀態:若表格是空的傳回True,反之傳回False。 size() 事後狀態:傳回表格的總資料量。 Search(target, Found) 事後狀態:若target的key在表格查

文档评论(0)

1亿VIP精品文档

相关文档