数据结构:图文详解 - 动态查找、静态查找、散列查找
时间:2022-07-25
本文章向大家介绍数据结构:图文详解 - 动态查找、静态查找、散列查找,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
- 查找是 数据结构中的重要操作
- 今天,我将主要讲解介绍 查找的相关知识,如查找算法等,希望你们会喜欢。
目录
1. 简介
- 本节将介绍关于 查找 的相关基础概念
- 具体请看下图:
2. 查找 需求场景
- 对于不同的查找需求场景,会采用不同的查找类型,最终采用的查找方式(查找算法)也有所不同
- 具体如下
- 下面,将根据不同的查找需求类型,讲解对应的查找算法
3. 静态查找
- 定义:仅作 查找操作
- 面向的数据结构:静态查找表
- 算法:顺序查找、有序查找、线性索引查找
- 具体介绍如下
3.1 顺序查找
- 具体介绍如下
3.2 有序查找
- 主要算法有:二分查找、插值 & 斐波那契
- 本文 主要介绍 = 二分查找(也称:折半查找)
- 定义
- 具体实现
public class BinarySearch {
/**
* 二分查找方法
* @param srcArray:有序数组
* @param des:需要查找的元素
*/
public static int binarySearch(int[] srcArray, int des){
int low = 0; // 比较区间第1位
int high = srcArray.length-1; // 比较区间最后1位
int middle ; // 区间的中间位置
while(low <= high) {
// 1. 通过折半,求出区间的中间位置
middle = low + (high - low)>>1;
// 此处需特别注意以下:
// a. mid = (low + high) / 2:当low、high都是比较大的数时,可能造成上溢除
// b. 采用右移的位运算代替除2,提高效率
// 2. 比较给定值和中间值
// 2.1 若给定值 = 中间记录,则查找成功,返回该位置
if(des == srcArray[middle]) {
return middle;
// 2.2 若给定值 < 中间记录,则 在中间记录的左半区 继续查找
// 即 将比较区间的最后1位 设置为 原中间位置的前1位
}else if(des <srcArray[middle]) {
high = middle - 1;
// 2.3 若给定值 > 中间记录,则 在中间记录的右半区 继续查找
// 即 将比较区间的首位 设置为原中间位置的后1位
}else {
low = middle + 1;
}
}
// 若比较区间的第1位 ≥ 最后1位,则表示查找失败,返回-1
return -1;
}
/**
* 执行 二分查找方法
*/
public static void main(String[] args) {
// 定义1个有序表数组
int[] src = new int[]{1, 4, 5, 7, 8, 13,20,28};
// 输出结果
System.out.println("需要查找数据的数组下标 = " + binarySearch(src,8));
}
}
- 测试结果
需要查找数据的数组下标 = 4
- 二分查找的变式
对于二分查找存在一定的优 & 缺点,所以衍生出2种二分查找的变式方法:插值查找 & 斐波那契查找。具体如下:
区别主要在于:比较元素(中间元素)的计算
3.3 线性索引查找
- 面向的数据结构:索引表
关于 索引 的介绍如下
- 本文主要介绍的线性索引查找算法 = 稠密索引、分块索引、倒排索引。具体介绍如下:
4. 动态查找
- 定义:作 查找、插入 & 删除操作
- 面向的数据结构:动态查找表
- 算法:二叉排序树、平衡二叉排序树(
AVL
树)&多路查找树 - 具体介绍如下
4.1 二叉排序树
也称:二叉查找树、二叉搜索树
- 特点
- 作用 & 应用场景
4.2 平衡二叉排序树(AVL树)
属于 二叉搜索树的一种特殊类型
- 特点
- 具体介绍
4.3 多路查找树
- 具体介绍如下
- 多路查找树的类型介绍 & 对比 http://blog.csdn.net/wtyvhreal/article/details/46442091
5. 散列查找
- 定义:通过关键字获取记录
- 面向的数据结构:散列表
- 算法:散列技术
- 具体介绍如下
5.1 散列技术
- 简介
5.2 散列函数的设计(构造方法)
- 简介 即,该如何构造出 散列函数
- 具体构造方法介绍 & 对比
5.3 散列冲突
- 简介 & 解决方案
- 解决方案介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法