数据结构--有序表查找
来源:互联网 发布:今日头条个人数据 编辑:程序博客网 时间:2024/05/29 19:16
对于已经排好序的表,有
1、折半查找
在有序表中,取中间的记录进行比较,如果相同,匹配成功。如果比中间值小,就在中间记录的左半区进行查找,如果大,就在右半区。
public static int binarySearch(int key){ int height = src.length-1; int low = 0; int mid = 0; while(low <= height) { mid = (height+low)/2;//对下标取半 if(key < src[mid]) //如果比中间值小,改变height的值 height = mid-1; else if(key > src[mid])//如果比中间值大,改变low的值 low = mid+1; else return mid; } return -1;}
2、插值查找
插值查找是对折半查找的改进。
折半时 mid =
折半查找是按1/2进行查找,如果有10000个有序数组找一个很小的数5,就有了优化的空间。
将查mid的公式替换为mid=low+
3、斐波那契查找
斐波那契相邻的数接近黄金分割,与折半类似,只是切割的范围为黄金分割点。平均效率高于折半,最坏的效率比折半差
public static void main(String[] args) { int[] src = { 1, 5, 15, 22, 25, 31, 39, 42, 47, 49, 59, 68, 88 }; System.out.println("==>" + FBSearch(src, 88)); } public static int FBSearch(int array[], int key){ int mid,k=0; int fibon[] = getFibon(20);//构建斐波那契数组 while(array.length > fibon[k]-1) //查找比数组长度大的斐波那契数 ++k; int tmp[] = Arrays.copyOf(array, fibon[k]-1);//将原数组长度扩展为斐波那契数的长度 for (int i = array.length; i < tmp.length; i++) //将扩展的部分填充为原数组最后一个数据 tmp[i] = array[array.length-1]; int low = 0; int high = fibon[k]-1; while(low <= high) { mid = low + fibon[k-1]-1; if(key < tmp[mid]) { high = mid-1; k -= 1; } else if (key > tmp[mid]) { // 查找后半部分,高位指针移动 low = mid+1; // (全部元素) = (前半部分)+(后半部分) // f[k] = f[k-1] + f[k-2] // 因为后半部分有f[k-2]个元素,所以 k = k-2 k -= 2; } else { return mid<=array.length?mid:array.length;//如果mid大于原数组长度,则表示是原数组的最后一个 } } return -1; } //获取斐波那契数组 public static int[] getFibon(int len){ int fibon[] = new int[len]; fibon[0] = fibon[1] = 1; for (int i = 2; i < len; i++) { fibon[i] = fibon[i-1] + fibon[i-2]; } return fibon; }
参考:大话数据结构
阅读全文
0 0
- 数据结构--有序表查找
- 【数据结构-查找】有序表的查找-折半查找
- 数据结构之详解有序表查找
- 【数据结构】算法9.2 有序表查找-折半查找
- 数据结构-查找-二分查找(1)有序表复杂度(lg(n))
- 数据结构之查找(三)——有序表查找
- 大话数据结构—顺序表、有序表、线性索引查找
- 数据结构实现之有序符号表BST二叉查找树
- 数据结构学习6——有序表查找(折半查找与斐波那契查找)
- 数据结构实现之有序符号表BinarySearchST(使用有序数组的二分查找)
- 【数据结构与算法】有序数组二分法查找
- 查找-顺序,有序表
- 有序表查找
- 有序表查找
- 有序表的查找
- 有序表的查找
- 有序表查找
- 有序表查找
- 暴力状压 [Usaco2007 Open]Fliptile 翻格子游戏
- 顺序栈 顺序队列编写的小停车场
- STL容器初探
- 最长公共子串 最长公共子序列 最长递增子序列
- 打印1到最大的n位数
- 数据结构--有序表查找
- LCS 最大公共子序列
- Scrapy+PhantomJS+Selenium动态爬虫
- 使用指向指针的指针创建任意大小的二维数组
- HDU 1251 统计难题
- HDU 6060 RXD and dividing
- win7快捷键大全
- 整数、浮点型在内存中存储
- 用批处理批量替换文件中的某个字符串(亲自验证通过!完美!哈哈哈)