数据结构:图文详解 - 动态查找、静态查找、散列查找

时间:2022-07-25
本文章向大家介绍数据结构:图文详解 - 动态查找、静态查找、散列查找,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

  • 查找是 数据结构中的重要操作
  • 今天,我将主要讲解介绍 查找的相关知识,如查找算法等,希望你们会喜欢。

目录


1. 简介

  • 本节将介绍关于 查找 的相关基础概念
  • 具体请看下图:

2. 查找 需求场景

  • 对于不同的查找需求场景,会采用不同的查找类型,最终采用的查找方式(查找算法)也有所不同
  • 具体如下
  • 下面,将根据不同的查找需求类型,讲解对应的查找算法

3. 静态查找

  • 定义:仅作 查找操作
  • 面向的数据结构:静态查找表
  • 算法:顺序查找、有序查找、线性索引查找
  • 具体介绍如下

3.1 顺序查找

  • 具体介绍如下

3.2 有序查找

  1. 主要算法有:二分查找、插值 & 斐波那契
  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 散列冲突

  • 简介 & 解决方案
  • 解决方案介绍