这篇文章是关于有序表的查找,主要包括了顺序查找的优化用法、折半查找、插值查找、斐波那契查找;

顺序优化查找:效率极为底下,但是算法简单,适用于小型数据查找;

折半查找:又称为二分查找,它是从查找表的中间开始查找。查找结果只需要找其中一半的数据记录即可。效率较顺序查找提高不少。比较适用与静态表,一次排序后不在变化;

插值查找:与折半查找比较相似,只是把中间之mid的公式进行了变换将mid = (low+high)/2;换成了mid = low + (high - low) * (key - sum[low]) / (sum[high] - sum[low]);

插值查找的效率比折半查找的效率又要高出不少,比较适用与表长较大,而关键字又分布得比较均匀的表查找;

斐波那契查找:是利用了黄金分割的原理来进行查找,平均性能要由优于折半查找,但是如果时最坏的情况,则效率低于折半查找(要查找的关键字一直比较靠近黄金分割较长的那一                             段),但是运算比较简单,只有最简单的加减运算;

代码实现:

 /**
* 查找
* 2016/5/1
*
**/
package cn.Link; public class Search {
public static void main(String [] args){
int n = 10; //数组长度
int key = 18; //查找关键数
int sum[] = new int[n];//有序数组 for(int i = 0;i < n;i++ ){
sum[i] = i*2;
}
System.out.println("本程序由于查找值为key的数组下标,如果返回负数,则表示没有找到,");
//打印sum数组
System.out.print("sum数组:");
for(int u: sum){
System.out.print(u+" ");
}
System.out.println("\n要查找的数为:"+key); int result = Sequential_Serach(sum,n,key);
System.out.println("\n顺序优化查找结果:"+result);
result = Binary_Serach(sum,n,key);
System.out.println("折半查找查找结果:"+result);
result = Interpolation_Serach(sum,n,key);
System.out.println("插值查找查找结果:"+result);
result = Fibonacci_Serach(sum,n,key);
System.out.println("斐波那契查找结果:"+result); } //顺序优化查找
public static int Sequential_Serach(int sum[],int n, int key){
if(key >sum[n-1] || key < sum[0])
return -1; //sum为从小到大排列,如果key大于sum[n-1]或小于sum[0]则肯定找不到 int i;
int sum_1 = sum[0]; //记录sum首位值,用以在程序结束时还原
sum[0] = key;
i = n-1;
while(sum[i] != key){
i--;
}
sum[0] = sum_1;
if(i !=0 ){
return i;
}else{
return -1;
}
} //折半查找
public static int Binary_Serach(int sum[],int n,int key){
if(key >sum[n-1] || key < sum[0])
return -1; //sum为从小到大排列,如果key大于sum[n-1]或小于sum[0]则肯定找不到 int low = 0;
int high = n-1;
int mid ;
while(low <= high){
mid = (low+high)/2;
if(key < sum[mid]){
high = mid -1;
}else if(key > sum[mid]){
low = mid +1;
}else{
return mid;
}
}
return -1;
} //插值查找 与折半查找只有mid的得到结果一行代码不同 优势:查找表长比较大,而关键字分布又比价均匀的查找表时平均性能比折半查找要好
public static int Interpolation_Serach(int sum[],int n,int key){ if(key >sum[n-1] || key < sum[0])
return -1; //sum为从小到大排列,如果key大于sum[n-1]或小于sum[0]则肯定找不到
if(sum[0] == sum[n-1]) return 0; //首数和尾数相等 这是一个所有数都想等的数组 没有这一步的话会发生除零错误 int low = 1;
int high = n-1;
int mid ;
while(low <= high){
mid = low + (high - low) * (key - sum[low]) / (sum[high] - sum[low]);
if(key < sum[mid]){
high = mid -1;
}else if(key > sum[mid]){
low = mid +1;
}else{
return mid;
}
}
return -1;
} //斐波那契查找 平均性能要由优于折半查找,但是如果时最坏的情况,则效率低于折半查找如key=2
public static int Fibonacci_Serach(int sum[],int n,int key){
if(key >sum[n-1] || key < sum[0])
return -1; //sum为从小到大排列,如果key大于sum[n-1]或小于sum[0]则肯定找不到 int low, high, mid, i, k;
low = 0;
high = n-1;
k = 0;
int F[] = new int[n];
F[0] = 0;
F[1] = F[2] = 1;
for(i = 3;i < n;i++){ //建立一个斐波那契数列,理论上这个数组是无限长的
F[i] = F[i-1] + F[i-2];
}
while(n > F[k]-1){ //计算n位于斐波那契数列的位置
k++;
} int[] sum_1 = new int[F[k]-1]; //增加数组的长度
for(i = 0;i < F[k]-1;i++){ //将不满的数值补全
if(i < n){
sum_1[i] = sum[i];
}else{
sum_1[i] = sum[n-1];
}
} while ( low <= high ){
mid = low+F[k-1]-1;
if(key < sum_1[mid]){
high = mid-1;
k = k-1;
}else if(key > sum_1[mid]){
low = mid + 1;
k = k-2;
}else{
if(mid < n ){
return mid; //找到了这个数
}else{
return n-1; //如果差找到的数在sum[n-1]以后返回sum最后一个数
}
}
}
return -1;
}
}

java数据结构之有序表查找的更多相关文章

  1. Java数据结构之线性表

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  2. Java数据结构之线性表(2)

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  3. java 数据结构与算法 之查找法

    一.二分查找法 二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找:如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素. @Test public ...

  4. JAVA数据结构--哈希表的实现(分离链接法)

    哈希表(散列)的定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度 ...

  5. java数据结构----哈希表

    1.哈希表:它是一种数据结构,可以提供快速的插入操作和查找操作.如果哈希表中有多少数据项,插入和删除操作只需要接近常量的时间.即O(1)的时间级.在计算机中如果需要一秒内查找上千条记录,通常使用哈希表 ...

  6. java数据结构之hash表

    转自:http://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.html Hash表也称散列表,也有直接译作哈希表,Hash表是一种特 ...

  7. 【数据结构】 顺序表查找(折半查找&&差值查找)

    #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXSIZE 10 首先构造一个 ...

  8. java数据结构——哈希表(HashTable)

    哈希表提供了快速的插入操作和查找操作,每一个元素是一个key-value对,其基于数组来实现. 一.Java中HashMap与Hashtable的区别: HashMap可以接受null键值和值,而Ha ...

  9. Java数据结构-01顺序表

    一.定义 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列. 二.存储分类 1.顺序存储: ①简述:是指将线性表中的各个元素依次存放在一组地址连续的存储单元中,通常将这种方 ...

随机推荐

  1. openwrt增加串口登录需要密码

    https://wiki.openwrt.org/doc/howto/serial.console.password Openwrt 串口默认是没有密码的.Openwrt启动后,一个默认的密码将被启用 ...

  2. MySQL(1) - 基础

    参考资料: http://www.jianshu.com/p/91e3af27743f 一.MySQL介绍以及安装 1.1 MySQL介绍 MariaDB数据库管理系统是MySQL的一个分支,主要由开 ...

  3. HTML5 学习总结

    1,h5比原来的h4.0版本的页面头部更为简化, <!doctype html> <meta charset="utf-8"/>sublime中快速生成格式 ...

  4. Gym 100553B Burrito King 无脑背包

    题意就是你有n和m两个上限 吃一个东西会同时增加两个东西 m的值不能超过给定的m 问最后的n m值和每个东西吃了多少 贪心一下就好了 算一下性价比 从最大的开始吃 直到吃满了m n也一定是最大了 只是 ...

  5. C++ 中 delete 和 delete[] 的区别

    一直对 C++ 中 delete 和 delete[] 的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++ 告诉我们在回收用 new 分配的单个对象的内存空间时用 de ...

  6. WinHex V18.7(16进制编辑器) 多国语言绿色版

    软件名称: WinHex V18.7(16进制编辑器)软件语言: 简体中文授权方式: 免费试用运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 1.7MB图片预览: ...

  7. PureLayout

    PureLayout 是 iOS & OS X Auto Layout 的终极 API——非常简单,又非常强大.PureLayout 通过一个全面的Auto Layout API 扩展了 UI ...

  8. Codeforces Round #375 (Div. 2)A. The New Year: Mee

    A. The New Year: Meeting Friends time limit per test 1 second memory limit per test 256 megabytes in ...

  9. redis第一篇--综述

    1 redis里边有数据库的概念.可分为1-255这些表.在存储或者查找的时候要指明. redis_sentinel 集群里边封装成了namespace这样的概念.与db是不一样的.

  10. Centos中压缩(zip)和解压(unzip)命令

    摘自:http://liuzhichao.com/p/681.html 1.我下载了一个yasuo.zip文件,想解压缩: # unzip yasuo.zip 2.我当前目录下有abc1.zip,ab ...