Java 查找算法
2023-09-14 08:57:59 时间
* 二分查找又称折半查找,它是一种效率较高的查找方法。
【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
* @author wzj
public class BinarySearch {
public static void main(String[] args) {
int[] src = new int[] {1, 3, 5, 7, 8, 9};
System.out.println(binarySearch(src, 3));
System.out.println(binarySearch(src,3,0,src.length-1));
* * 二分查找算法 * *
* @param srcArray
* 有序数组 *
* @param des
* 查找元素 *
* @return des的数组下标,没找到返回-1
public static int binarySearch(int[] srcArray, int des){
int low = 0;
int high = srcArray.length-1;
while(low = high) {
int middle = (low + high)/2;
if(des == srcArray[middle]) {
return middle;
}else if(des srcArray[middle]) {
high = middle - 1;
}else {
low = middle + 1;
return -1;
/**
*二分查找特定整数在整型数组中的位置(递归)
*@paramdataset
*@paramdata
*@parambeginIndex
*@paramendIndex
*@returnindex
public static int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){
int midIndex = (beginIndex+endIndex)/2;
if(data dataset[beginIndex]||data dataset[endIndex]||beginIndex endIndex){
return -1;
if(data dataset[midIndex]){
return binarySearch(dataset,data,beginIndex,midIndex-1);
}else if(data dataset[midIndex]){
return binarySearch(dataset,data,midIndex+1,endIndex);
}else {
return midIndex;
}
子数节点要完全大于、小于、或者在其之间。 也就是不能越过父节点的两个值 叶子节点中的值的个数 =m/2 非叶子节点中的值的个数=子节点个数-1
如下图:
![这里写图片描述](http://img.blog.csdn.net/20150708191657325)
可以看出,三个子节点的有两个值,三个子节点中的数据分别对应了小于、之间、大于这个范围
父节点存储的都是到子节点的指针 会有两个入口,一个是根节点,另外一个是从最小叶子节点开始的指针
常用排序算法的实现(Java版) 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序等。
java二分查找算法实现 package arithmetic; * @author JasonLee * @description java的二分查找(折半查找),前提是数组中的数据是有序的 * 思想:搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素, * 则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空, * 则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半
但是插入因为会涉及当前节点后的所有值得移动,一次,其时间复杂度为O(n) + O(log n)
只能从头节点遍历, 查找的复杂度是O(n)
插入或者是删除,因为只需要移动指针,时间复杂度为O(1) + O(n)
插入的复杂度本身并不高,只是简单的节点添加。但是因为寻找插入位置的查找操作的复杂度跟树的高度相关为logn,极差的情况下可能接近于线性查找。
平衡二叉树是尽量减少数高的二叉树,其算法中增加了左旋和右旋的操作。插入复杂度会高一些,但是会得到不错的查找性能。
学习自这里
这个就要说一下上面说的跟磁盘I/O相关的,因此为了减少磁盘I/O。可以利用磁盘的预读特性,一次提取大概相当于一页大小的节点到内存中。
先要说一下B-Tree.
一个平衡的m-way查找数,其要满足如下的条件:
子数节点要完全大于、小于、或者在其之间。 也就是不能越过父节点的两个值 叶子节点中的值的个数 =m/2 非叶子节点中的值的个数=子节点个数-1
如下图:
可以看出,三个子节点的有两个值,三个子节点中的数据分别对应了小于、之间、大于这个范围
B+Tree
与上面的差别是:
父节点存储的都是到子节点的指针 会有两个入口,一个是根节点,另外一个是从最小叶子节点开始的指针
查找跟二叉树比较像,因为插入的时候已经是相当于二分算法了,所以只需要,递归找到就可以了。
Hash表为了解决一些不容易排序,或者查找的对象。 比如图像,视频等等。
在Java的HashMap中有使用。
是一个链表的数组
- 对key进行进行散列函数,求Hash值,找到其对应的链表。
- 剩下的解决hash冲突的问题
- 解决hash冲突,可以在命中链表之后顺序比较
- 这里顺便再说一下一致性hash. 预置很多节点,选择最近的节点存入,可以解决增加节点数据转移的问题。
常用排序算法的实现(Java版) 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序等。
java二分查找算法实现 package arithmetic; * @author JasonLee * @description java的二分查找(折半查找),前提是数组中的数据是有序的 * 思想:搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素, * 则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空, * 则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半
相关文章
- Contest1620 – 2020-2021-2学期《Java Web 系统开发》:java基础:字符串
- java冒泡排序经典代码_Java 8大经典排序算法(含源代码),必须收藏!
- 两种方式实现java Md5加密
- java笛卡尔积算法_Java 笛卡尔积算法的简单实现
- 线性查找算法(Java实现)
- java字符串转换为json对象6_Json对象与Json字符串的转化、JSON字符串与Java对象的转换…
- Java中使用正则表达式
- 【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )
- 【错误记录】Java AWT 图形界面编程报错 ( Exception in thread “main“ java.awt.AWTError: BoxLayout can‘t be shared )
- Java采用zip压缩文件代码示例详解编程语言
- Oracle 视图 ALL_JAVA_METHODS 官方解释,作用,如何使用详细说明
- Java try catch语句
- 使用Java连接Linux服务器的简单方法(java连接linux)
- 机制Redis 中 Java 过期机制研究(redisjava过期)
- 数据清理Java 实现 Redis 过期数据清理(redisjava过期)
- 期Java开发高效配置MySQL长期支撑(mysql java 长)
- Java与MySQL事务处理(mysql中java事物)
- Java与Oracle 一种天生的结合(java属于oracle)
- 深入java垃圾回收的详解
- 浅析java双向冒泡排序算法