数据结构复习之查找算法的总结回顾

一、查找的基本概念

  查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值得数据元素(或记录)。

  查找表(Search Table)是同一类型的数据元素(或记录)构成的集合。

  查找表按照操作方式分为两大类:

    静态查找表:只作查找操作的查找表。

          顺序表查找、有序表查找、线性索引查找

    动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个元素。

          二叉排序树、平衡二叉树(AVL树)、多路查找树(B树)

二、顺序表查询

  这是最简单的一种,从表中的最后一个记录开始,逐个进行记录的关键字与给定值进行比较,若某个记录的关键字与给定值相等,则查找成功,找到所查的记录;反之,若直到第一个记录,其关键字和给定值比较都不相等,则表明表中没有所查的记录,查找失败。

平均的查找长度为(n+1)/2,最好的长度为1,最差的查找长度为n。时间复杂度o(n)

  优化措施:

    设置哨兵

      设置a[0] 为关键字值,称之为哨兵,当返回值为0则表示未找到。从尾部开始查找。

      免去了查找过程中每一次比较后都要判断查找位置是否越界的小技巧。

    将查找概率大的记录放到查找表的前面。

三、有序表查找

  折半查找(二分法查找)

    平均查找长度:log(n+1)-1,通过二分查找树的判断树来推的。二分查找的最坏性能和平均性能非常接近。时间复杂度o(lgn)。

  插值查找

    这种方法是在二分查找基础上改进的,核心是对mid的取值,公式为:

mid = low + (key - arr[low])*(high-low)/(arr[high]-arr[low])

    至于为什么这么改进,因为key小的话,那么我趋向于在表中低地址端去查找,而key大的话那么我们趋向在表的高地址端去查找。  

    时间复杂度也是  o(lgn)。

  斐波那契查找

    不是采用二分,而是斐波拉契序列的值去缩小我们的范围。时间复杂度o(lgn)。

四、线性索引查找

  稠密索引

  分块索引

  倒排索引

五、二叉排序树

六、平衡查找树(AVL树)

  由于二叉排序树一般都不是平衡的,而二叉排序树的查找性能取决于二叉排序树的形状,所以构造一种平衡的二叉树。左右子树高度相差不到1。所以此树总是平衡的。提高了查找效率。

  二叉树上的结点的左子树的深度减去右子树的深度的值称为平衡因子BF。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。

  平衡二叉树的构建过程:

    总之就是把不平衡消灭在最早的时刻。

  查找时间复杂度为O(logn),而插入和删除的时间复杂度也为O(logn)。

  红黑树,二叉排序树的另外一种平衡算法。

七、多路查找树(B树)

  目的:为了降低对外存设备的访问次数。

  定义:多路查找书,其每一个结点的孩子树可以多于两个,且每一个结点处可以存储多个元素。

  堵路查找树的形式:

    2-3树

    2-3-4树

    B树       平衡的多路查找树

    B+树    为了解决所有元素遍历的问题

  结点最大的孩子数目称为B树的阶,因此,2-3树是3阶B数。

八、散列表查找(哈希表)

时间: 2024-08-27 20:12:27

数据结构复习之查找算法的总结回顾的相关文章

数据结构复习之排序算法的总结回顾

根据排序过程中借助的主要操作,我们将内排序分为四类: 插入排序类 直接插入排序 希尔排序 选择排序类 简单选择排序 堆排序 交换排序类 冒泡排序 快速排序 归并排序类 归并排序 从算法的简单性来看,我们将7种算法分为两类: 简单算法:冒泡排序.简单选择排序.直接插入排序 改进算法:希尔排序.堆排序.归并排序.快速排序 对7中算法的各种指标进行对比: 平均情况看:显然最后三种算法要胜过希尔算法,并远远超过前3种简单算法. 最好情况看:反而冒泡和直接插入排序要更胜一筹,也就是说,如果待排序序列总是基

Java数据结构 遍历 排序 查找 算法实现

1. 遍历算法(遍历二叉树6种方法) 1.1. 概述 遍历算法针对二叉树而言的,主要有先序.中序.后序三种遍历顺序,三种顺序又分别有递归和常规算法,二叉树遍历的主要思想是:遍历左子树,遍历右子树,访问根节点,由这三者的遍历顺序来确定是先序.中序还是后序.下面只要求掌握递归遍历算法,常规遍历算法见附录一. 1.2. 先序遍历算法 遍历顺序:访问根节点,遍历左子树,遍历右子树.代码如下: void preOrder(BinaryTreeNode bt) { if (bt == null)// 如果当

常用的查找算法

顺序查找 二分法查找 分块查找 散列表查找(哈希表) 顺序查找的基本思想: 从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功:若扫描结束后,仍未找到关键字等于a的结点,则查找失败. 说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败.很明显的缺点就是查找效率低. 适用于线性表的顺序存储结构和链式存储结构. 计算平均查找长度. 例如上表,查找1,需要1次,查找2需要2次,依次往下推,可知查找16需要16次, 可以看

什么是数据结构?什么是算法?

理解 数据结构是指一组数据的存储结构(它是静态的,是组织数据的一种方式).算法就是操作数据的一组方法.如果不在存储结构的基础上操作和构建算法,孤立存在的数据结构就是没用的. 数据结构和算法是相辅相成的.数据结构是为算法服务的,算法要作用在特定的数据结构之上,因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构.譬如:数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据.但是如果我们选择链表这种数据结构,二分查找算法就无法工作,因为链表不支持随机访问. 作用: 提高效率.节省存

《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Alpha-Beta剪枝

2014.07.08 22:43 简介: “搜索”与“剪枝”几乎是如影随形的.此处的“搜索”指的是带有回溯算法的深度优先搜索. 在之前的“Minimax策略”中我们给出了一个三连棋的程序,运行后你就知道计算一步棋要花多少时间. 为了计算最优的一步棋,我们可能需要递归9万多次.如果毫无疑问这种阶乘式的穷举过程必须通过剪枝来加速. 本篇介绍一种用于Minimax策略的剪枝思路——α-β剪枝. 剪枝的英语是pruning,所以不要想当然说成trimming. 图示: 在上一篇讲解Minimax策略的博

c数据结构的字符串查找的Brute-Force算法

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,

浅谈算法和数据结构: 九 平衡查找树之红黑树

原文:浅谈算法和数据结构: 九 平衡查找树之红黑树 前面一篇文章介绍了2-3查找树,可以看到,2-3查找树能保证在插入元素之后能保持树的平衡状态,最坏情况下即所有的子节点都是2-node,树的高度为lgN,从而保证了最坏情况下的时间复杂度.但是2-3树实现起来比较复杂,本文介绍一种简单实现2-3树的数据结构,即红黑树(Red-Black Tree) 定义 红黑树的主要是像是对2-3查找树进行编码,尤其是对2-3查找树中的3-nodes节点添加额外的信息.红黑树中将节点之间的链接分为两种不同类型,

浅谈算法和数据结构: 十 平衡查找树之B树

转载自 http://www.cnblogs.com/yangecnu/p/3632027.html 浅谈算法和数据结构: 十 平衡查找树之B树 前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据.对其进行排序并允许以O(log n)的时间复杂度运行进行查找.顺序读取.插入和删除的数据结构.B树,概括来说是一个节点可以拥

数据结构之查找算法

查找算法    一.查找的基本概念 查找,也可称检索,是在大量的数据元素中找到某个特定的数据元素而进行的工作.查找是一种操作. 二.顺序查找 针对无序序列的一种最简单的查找方式. 时间复杂度为O(n). 三.二分查找(折半查找) 针对已排序序列的一种查找方式.并且只适用于顺序存储结构的序列.要求序列中的元素基本不变,在需要做删除和插入操作的时候,会影响检索效率. 时间复杂度为O(logN). 四.B树查找 B树又称二叉排序树(Binary Sort Tree). 1.概念:   它或者是一棵空树