`

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经典算法之费氏搜寻法

    费氏搜索法是一种高效的搜索算法,它利用了费氏数列(Fibonacci sequence)的特性来进行数据查找。与传统的二分搜索法相比,费氏搜索法在某些情况下可以提供更快的搜索速度,尤其是在处理较大的数据集时更为明显。 ...

    杭电数据结构java版 查找.docx

    在计算机科学中,数据结构和查找算法是核心概念,尤其对于Java开发者而言,理解并掌握这些知识至关重要。本文将详细阐述《杭电数据结构java版 - 查找》中的主要知识点,包括基本概念、静态查找与动态查找方法以及...

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

    4. **搜索算法**: 包括顺序搜索、二分搜索、插补搜索和费氏搜索。二分搜索尤其适用于有序数据,其时间复杂度为O(log n),效率较高。 5. **集合问题与组合问题**: 如约瑟夫问题(Josephus Problem)、排列组合、格雷...

    java开发经典算法

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

    Java算法大全

    6. **搜索算法**:如顺序搜索、二分搜索、插补搜索、费氏搜索等,用于在数据集中查找特定元素。 7. **矩阵操作**:包括稀疏矩阵、多维矩阵转换、上三角矩阵、下三角矩阵、对称矩阵等,这些都是线性代数中的基本概念...

    经典问题算法的Java实现

    本篇文章将围绕一些经典的算法问题以及它们的Java实现进行详细的探讨。 首先,河内塔问题是一个经典的递归问题,它描述了如何将一系列大小不同的盘子从一个柱子移动到另一个柱子上。在这个问题中,每次只能移动一个...

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

    在这个案例中,"费氏数列 源码"可能是指用不同编程语言(如C++, Java, Python等)实现的计算费氏数列的代码。这些源码可以作为学习和理解算法的实例,帮助开发者掌握如何用代码来解决实际问题。 在计算机科学中,...

    C语言经典算法大全.pdf

    6. 搜索算法:书籍中收录了多种搜索算法,例如二分搜索法、插补搜索法、费氏搜索法等,这些算法都可以用于解决实际问题。 7. 矩阵问题:书籍中收录了多种矩阵问题,例如矩阵加法、矩阵乘法、矩阵转置等,这些问题都...

    费氏搜寻法.zip

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

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

    Java和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语言超经典算法大全.doc

    如顺序搜索、二分搜索、插补搜索、斐波那契搜索。 22. **矩阵运算**: 包括稀疏矩阵的存储与操作,多维矩阵转一维,以及上三角、下三角、对称矩阵的处理。 23. **奇数魔方阵**(Magic Square): 魔方阵是每一...

    经典算法(c&java版)

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

    费氏搜寻算法

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

Global site tag (gtag.js) - Google Analytics