`

java实现查找算法(二):费氏查找 ,插补查找

阅读更多
一 费氏查找

使用费氏数列  1 1 2 3  5 8 13 构成的数列,切割范围来进行查找
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 - 1]) // 欲查找值较小
   { // 查找前半段
    Root = Root - Distance_2;
    Temp = Distance_1;
    Distance_1 = Distance_2;
    Distance_2 = Temp - Distance_2;
   }
   // 欲查找值较大
   else if (KeyValue > Data[Root - 1])
   { // 查找后半段
    Root = Root + Distance_2;
    Distance_1 = Distance_1 - Distance_2;
    Distance_2 = Distance_2 - Distance_1;
   }
   else if (KeyValue == Data[Root - 1]) // 查找到数据
   {
    System.out.println("Data[" + (Root - 1) + "] = "
      + Data[Root - 1]);
    return true;
   }
   Counter++;
  } while (Distance_2 >= 0);
  return false;
 }
}

运行结果:
    Data[5] = 32
    Search Time = 5

二 插补查找


类似于折半查找,不同的是插补查找使用的是按照比例来选择对比项
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


原文网址:http://blog.csdn.net/myjava_024/archive/2008/11/19/3335548.aspx
分享到:
评论

相关推荐

    C经典算法之费氏搜寻法

    二分搜寻法每次搜寻时,都会将搜寻区间分为一半,所以其搜寻时间为O(log(2)n),log(2)表示以2为底的log值,这边要介绍的费氏搜寻,其利用费氏数列作为间隔来搜寻下一个数,所以区间收敛的速度更快,搜寻时间为O(logn...

    基于费氏树的费氏查找思想的探索与实现

    本文档详细的说明了费氏树的创建和费氏查找中的一些关键概念,对于什么是费氏查找而理清思路!

    经典问题算法的Java实现

    经典问题算法的Java实现/河内塔、费氏数列、Pascal三角形、选择插入气泡排序、快速排序、合并排序、二分查找等。

    java开发经典算法

    详细介绍了java中应用到的各类经典算法河内塔 费式数列 排序方法Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法...

    经典算法全部用C语言实现

    以下算法均用C语言实现,代码可运行 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题...

    费氏搜寻法.zip

    常见的搜索算法包括线性搜索、二分搜索等。 图算法:图算法用于处理图结构的数据,如最短路径算法(如Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(如Prim算法、Kruskal算法)等。 动态规划:动态规划是...

    Java和C语言实现各种经典算法(含代码图例)

    Java和C语言实现各种经典算法(含代码图例) 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包...

    费氏数列算法 整个工程文件下载

    费氏数列算法 整个工程文件下载,欢迎大家分享

    java各种经典算法

    插补搜寻法 费氏搜寻法 矩阵 稀疏矩阵 多维矩阵转一维矩阵 上三角、下三角、对称矩阵 奇数魔方阵 4N 魔方阵 2(2N+1) 魔方阵 堆叠、伫列 堆叠 - 使用阵列实作 堆叠 - 使用链结实作(C 语言动态记忆体...

    Java算法大全

    插补搜寻法 费氏搜寻法 矩阵 稀疏矩阵 多维矩阵转一维矩阵 上三角、下三角、对称矩阵 奇数魔方阵 4N 魔方阵 2(2N+1) 魔方阵 堆叠、伫列 堆叠 - 使用阵列实作 堆叠 - 使用链结实作(C 语言...

    经典算法大全.pdf

    基数排序法 102 42.Algorithm Gossip: 循序搜寻法(使用卫兵) 104 43.Algorithm Gossip: 二分搜寻法(搜寻原则的代表) 106 44.Algorithm Gossip: 插补搜寻法 109 45.Algorithm Gossip: 费氏搜寻法 ...

    经典算法(c&java版)

    • 插补搜寻法 • 费氏搜寻法 矩阵 • 稀疏矩阵 • 多维矩阵转一维矩阵 • 上三角、下三角、对称矩阵 • 奇数魔方阵 • 4N 魔方阵 • 2(2N+1) 魔方阵 堆栈、队列 • 堆栈 - 使用数组实作 • 堆栈 - ...

    费氏搜寻算法

    费氏搜寻使用费氏数列来决定下一个数的搜寻位置,所以必须先制作费氏数列,这在之前有提过;费氏搜寻会先透过公式计算求出第一个要搜寻数的位置,以及其代 表的费氏数,以搜寻对象10个数字来说,第一个费氏数经计算...

    MIT_Introduction to Algorithms 算法导论视频字幕

    4 第三课 各个击破法: Strassen 算法,费氏数列,多项式乘法。 阅读:28 章第 2 节,30章第1节 5 演示课 2 递归公式,松散性 阅读:Akra-Bazzi 的讲义 6 第四课 快速排序法,随机化算法 阅读:5 章 1 到 3 节,7 ...

    经典算法大全

    介绍经典ACM算法,包括费氏数列、杨辉三角、三色旗、八皇后、生命游戏等五十余种算法及实现。

    经典算法教程 举例详解

    经典算法.pdf 算法举例详解 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem) 数、运算 ...

    数据结构与算法

    插补搜寻法 费氏搜寻法 矩阵 稀疏矩阵 多维矩阵转一维矩阵 上三角、下三角、对称矩阵 奇数魔方阵 4N 魔方阵 2(2N+1) 魔方阵 堆叠、伫列 堆叠 - 使用阵列实作 堆叠 - 使用链结实作(C 语言动态记忆体...

    费氏链霉菌HTP6分批发酵动力学研究

    费氏链霉菌HTP6分批发酵动力学研究,张新刚,侯太平,对费氏链霉菌HTP6产新霉素的分批发酵动力学进行了研究,并建立了动力学模型。对数生长期最大比生长速率μm为0.0866 h-1,产物合成期最�

    C语言经典算法大全

    C语言经典算法大全 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem...

Global site tag (gtag.js) - Google Analytics