java實現查找算法(二):費氏查找 ,插補查找

[b]一 費氏查找[/b]

使用費氏數列 1 1 2 3 5 8 13 構成的數列,切割範圍來進行查找
[code="java"]public class FSearch
{
public static int Max = 20;
public static int[] Data = { 12, 16, 19, 22, 25, 32, 39, 48, 55, 57, 58,
63, 68, 69, 70, 78, 84, 88, 90, 97 }; // 數據數組
public static int Counter = 1; // 計數器

public static void main(String args[])
{
int FinA; // 費氏數

FinA = 1; // 定義費氏數
while (Fib(FinA) <= Max)
FinA++;

int KeyValue = 32;
// 調用費氏查找
if (FibonacciSearch(FinA, KeyValue))
{
// 輸出查找次數
System.out.println("");
System.out.println("Search Time = " + (int) Counter);
}
else
{
// 輸出沒有找到數據
System.out.println("");
System.out.println("No Found!!");
}
}

// ---------------------------------------------------
// 遞歸求費氏級數
// ---------------------------------------------------
public static int Fib(int N)
{
if (N <= 1) // 遞歸結束條件
return N;
else
return Fib(N - 1) + Fib(N - 2); // 遞歸執行部分
}

// ---------------------------------------------------
// 費氏查找法
// ---------------------------------------------------
public static boolean FibonacciSearch(int n, int KeyValue)
{
int Root; // 左邊界變量
int Distance_1; // 上一個費氏數
int Distance_2; // 上二個費氏數(差值)
int Temp; // 數據暫存變量

Root = Fib(n - 1);
Distance_1 = Fib(n - 2);
Distance_2 = Fib(n - 3);

do
{
if (KeyValue < Data) // 欲查找值較小
{ // 查找前半段
Root = Root - Distance_2;
Temp = Distance_1;
Distance_1 = Distance_2;
Distance_2 = Temp - Distance_2;
}
// 欲查找值較大
else if (KeyValue > Data)
{ // 查找後半段
Root = Root + Distance_2;
Distance_1 = Distance_1 - Distance_2;
Distance_2 = Distance_2 - Distance_1;
}
else if (KeyValue == Data) // 查找到數據
{
System.out.println("Data[" + (Root - 1) + "] = "
+ Data);
return true;
}
Counter++;
} while (Distance_2 >= 0);
return false;
}
}[/code]
運行結果:
Data[5] = 32
Search Time = 5
[b]
二 插補查找[/b]

類似於折半查找,不同的是插補查找使用的是按照比例來選擇對比項
public class ISearch
{
public static int Max = 20;
public static int[] Data = { 12, 16, 19, 22, 25, 32, 39, 48, 55, 57, 58,
63, 68, 69, 70, 78, 84, 88, 90, 97 }; // 數據數組
public static int Counter = 1; // 計數器

public static void main(String args[])
{
int KeyValue = 32;
// 調用插補查找
if (InterpolationSearch(KeyValue))
{
// 輸出查找次數
System.out.println("");
System.out.println("Search Time = " + (int) Counter);
}
else
{
// 輸出沒有找到數據
System.out.println("");
System.out.println("No Found!!");
}
}

// ---------------------------------------------------
// 插補查找法
// ---------------------------------------------------
public static boolean InterpolationSearch(int KeyValue)
{
int Low; // 插補查找法左邊界變量
int High; // 插補查找法右邊界變量
int Middle; // 插補查找法中間數

Low = 0;
High = Max - 1;
Middle = Low + (KeyValue - Data[Low]) * (High - Low)
/ (Data[High] - Data[Low]);

if (Middle < Low)
Middle = Low;
if (Middle > High)
Middle = High;

while (Low <= High)
{
if (KeyValue < Data[Middle]) // 欲查找值較小
High = Middle - 1; // 查找前半段
// 欲查找值較大
else if (KeyValue > Data[Middle])
Low = Middle + 1; // 查找後半段
// 查找到數據
else if (KeyValue == Data[Middle])
{
System.out.println("Data[" + Middle + "] = " + Data[Middle]);
return true;
}

if (Low < High)
Middle = Low + (KeyValue - Data[Low]) * (High - Low)
/ (Data[High] - Data[Low]);
if (Middle < Low)
Middle = Low;
if (Middle > High)
Middle = High;

Counter++;
}
return false;
}
}

運行結果:
Data[5] = 32
Search Time = 2


原文網址:[url]http://blog.csdn.net/myjava_024/archive/2008/11/19/3335548.aspx[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章