数据结构 JAVA描述(十四) 静态查找表
来源:互联网 发布:动态网络中的线粒体 编辑:程序博客网 时间:2024/04/29 23:34
顺序查找
顺序查找又称为线性查找,它是一种最简单、最基本的查找方法。
/** * @description 不带监视哨的顺序查找算法 * @date 2016年1月6日 */ public static int seqSearch(int[] a, int key){ int i = 0, n = a.length; while(i < n && a[i] != key){ i++; } if(i < n){ //查找成功,返回下标 return i; } else{ return -1; } } /** * @description 从顺序表a[1]到a[n-1]的顺序表中顺序查找出关键字值为key的数据元素 * @date 2016年1月6日 */ public static int seqSearchWithGuard(int[] a, int key){ int i = a.length - 1; a[0] = key; while(a[i] != key){ i--; } if(i > 0){ return i; } else{ return -1; } }
对于带监视哨的查找算法,要查找到第i条元素,需比较次数为n-i+1,所以ASL=∑pi ci = (n+1)/2。查找失败时,比较次数都为n+1。因此时间复杂度是O(n)。
为了尽量提高查找速度,一种办法是在已知各个元素的查找概率不等的情况下,将各元素按照概率从小到大排序;另一种办法是在未知各个元素查找概率的情况下,在每次查找到一个元素时,就将它与前驱元素交换位置。
二分查找
二分查找又称为折半查找:
- 置初值:low = 0,high = n-1
- 当low < high,重复下列步骤
- mid = (low + high)/ 2
- 若key与a[mid]相等,则返回mid,查找成功
- 若key < a[mid],则high = mid - 1;否则,low=mid+1
- 当 low > high, 查找失败
/** * @description 二分查找算法 * @param key * @return * @author liuquan * @date 2016年1月6日 */ public static int binarySearch(int[] a, int key){ if(a.length > 0){ int low = 0, high = a.length - 1; while(low <= high){ int mid = (low + high) / 2; //中间位置,当前比较的元素位置 if(a[mid] == key){ return mid; } else if(a[mid] > key){ high = mid - 1; } else{ low = mid + 1; } } } return -1; }
假设n=2^k - 1,线性表最多被评分k次即可完成查找,即在最坏情况下,k = ㏒₂(n+1)次即可结束,每次可查找的结点(即最坏情况下要比较最多的次数)是2^(i-1)。因此二分查找长度为ASL = 1/n∑(i * 2 ^(i-1)) = 1/n[(1+n)(㏒₂(n+1) - 1)+ 1] ≈ ㏒₂ (n+1) - 1
但二分查找要求关键字有序,且仅适用于顺序存储结构。
分块查找
分块查找又称索引顺序查找,它是顺序查找和二分法的结合:首先线性表分成若干块,在每一块中,结点的存放不一定有序,但块与块之间必须是有序的。还需建立一个索引表,将每一块中的最大的关键字值按块的顺序存放好。 ASL = Lb + La,Lb是查找索引表的平均查找长度,La是在某一块中查找的平均查找长度
0 0
- 数据结构 JAVA描述(十四) 静态查找表
- 数据结构 JAVA描述(十七) 哈希表查找
- 数据结构--查找(静态查找表)
- 数据结构编程笔记二十四:第九章 查找 顺序表和有序表(静态查找表)查找算法的实现
- 数据结构 查找 静态查找表
- 数据结构:静态查找表
- 数据结构与算法-排序与查找(java描述)
- 数据结构与算法-二叉查找树(java描述)
- 数据结构 JAVA描述(十五) 动态查找表 二叉排序树 二叉平衡树
- 数据结构:静态查找表(顺序表)
- 数据结构学习笔记 --- 查找(静态查找表)
- 数据结构中的查找算法-静态查找表(1)
- 数据结构学习笔记 --- 查找(静态查找表)
- 数据结构之静态查找表
- 数据结构_静态查找表
- 数据结构 JAVA描述(一) 线性表
- 数据结构之“查找”-1:静态查找表
- 数据结构(21)--查找之静态查找表
- myeclipse 从Git导入maven项目
- java执行windows下cmd命令的方法
- ThreadPoolExecutor中策略的选择与工作队列的选择(java线程池)
- python简单爬虫程序
- 15. 3Sum
- 数据结构 JAVA描述(十四) 静态查找表
- Flume入门教程
- PHP压缩文件到zip
- C++11多线程(十一):《atomic 类型详解三 std::atomic (续)》
- Dev GridControl根据单元格内容进行着色
- Sublime Text3注册码(可用)
- Unity3D C# 委托和事件(之二)
- AndroidManifest.xml文件解析
- Android系统之路(初识MTK) ------ 客制化开机LOGO跟开机动画/系统默认壁纸