数据结构的查找

AVL树插入、删除的分析与实现 AVL树基本概念 首先,AVL树也是一种 阅读详情


1.  查找分类

        1.1  比较式查找法

                    1.1.1  线性表查找法

                                    1.1.1.1  顺序查找法

                                    1.1.1.2  折半查找法

                                    1.1.1.3  分块查找法

                    1.1.2  基于树的查找法

                                    1.1.2.1  二叉排序树

                                    1.1.2.2  平衡二叉树

        1.2  计算式查找法

                    1.2.1  哈希查找法


2. 算法实例

         2.1  顺序查找法

                思想:在表的一端设置监视哨(存放要查找的关键字),在表的另一段开始查找

                代码实现 sequence.c(完整代码)

/* 查找 key 键 */
int seq_search (RecordList l, int key) 
{
    /* 将键值设置在链的末端 */
    l.r[l.length].key = key;
    int     i;
    
    /* 顺序查找 */
    for (i = 0; l.r[i].key != key; i++) ;
    return i;
}
              平均查找长度:ASL = (n+1)/2

        2.2  折半查找法(序列必须排序)

                思想:比较中间键值,如果小于则把左边当作新序列比较中间键值,如果大于则把右边当作新序列比较中间键值。

                代码实现 binary.c(完整代码)

/* 查找 key 键, l 中的 r 数组必须按照key值的字典顺序排序 */
int binary_search (RecordList l, int key) 
{
    int     low = 0;
    int     high = l.length-1;

    while (low < high) {
        int     mid = (low + high)/2;
        if (key == l.r[mid].key) 
            return mid;
        else if (key < l.r[mid].key) 
            high = mid - 1;
        else 
            low = mid + 1;
    }
    
    return l.length;
}

              平均查找长度:ASL = log 2 (n+1) - 1



        2.3  分块查找法

                思想:首先将列表分成若干个块(子列表,块间有序,快内无序),构造一个索引表,索引表按键值有序排列

                代码实现 block.c(完整代码)

int block_search (RecordList l, int key)
{
    BlockList (BLOCK_SIZE, l.length, 1); 

    int     i; 
    for (i = 0; i < block_list1.length; i++) {
        block_list1.r[i].addr = i * block_list1.block_length;
        block_list1.r[i].max_key = l.r[i*5].key;
    }

    for (i = 0; i < l.length; i++) 
        if (block_list1.r[i/5].max_key < l.r[i].key)
            block_list1.r[i/5].max_key = l.r[i].key;
    
    for (i = 0; i < block_list1.length; i++) {
        if (key < block_list1.r[i].max_key) {
            l.list_s = block_list1.r[i].addr;
            l.list_e = (i == block_list1.length-1 ? 
                        l.length : block_list1.r[i+1].addr-1);
            return seq_search (l, key);
        }
    }

    return l.length;
}
              平均查找长度:ASL = log 2 (n/s+1) + s/2             n 表示表的长度,s表示每块中的

        2.4  二叉排序树的查找法

                思想:key 和跟结点 t.key 比较 ,如果相等则返回根,小于进一步查左子树,大于进一步查右子树

                代码实现 binary_tree.c(完整代码)

/* 二叉排序树的查找 */
BSTree BST_search (const BSTree root, int key) 
{
    if (!root) return NULL; 
    else if (root->data.key == key) 
        return root; 
    else if (key < root->data.key) 
        return BST_search (root->LChild, key); 
    else 
        return BST_search (root->RChild, key); 
} 


        2.5  平衡二叉树(AVL树)

               思想:对失衡节点进行顺时针或逆时针旋转

                           有四种形式:LL、LR、RR、RL

                                                   假设失衡节点为 A、它的孩子节点中的某个为B 、他的孩子的孩子节点中的某个节点为C,

                                                   则:LL:(B为A的左孩子)对A做一次顺时针旋转

                                                           RR:(B为A的右孩子)对A做一次顺时针旋转

                                                           LR:(B为A的左孩子,C为B的右孩子)对B做一次逆时针旋转,对A做一次顺时针旋转

                                                           RL:(B为A的右孩子,C为B的左孩子)对B做一次顺时针旋转,对A做一次、逆时针旋转

                代码实现 AVLTree.c(完整代码)

/* 平衡二叉树插入节点 */
void ins_AVLTree (AVLTree *avlt, int key)
{
    /* 初始化一个新节点 */
    AVLTNode    *S = (AVLTree)malloc (sizeof (AVLTNode));
    S->data.key = key;
    S->LChild = S->RChild = NULL;
    S->bf = 0;

    /* 插入 */
    if (!*avlt) 
        *avlt = S;
    else {
        /* 首先查找S的插入位置fp,同时记录距S的插入位置最近且
         * 平衡因子不等于0(等于-1或1)的节点A, A可能为失衡节点 */
        AVLTNode *A = *avlt, *FA = NULL;
        AVLTNode *p = *avlt, *fp = NULL;

        while (p) {
            if (p->bf) {
                A = p; 
                FA = fp;
            }
            fp = p;

            if (key < p->data.key) 
                p = p->LChild;
            else 
                p = p->RChild;
        }

        /* 插入S */
        if (key < fp->data.key) 
            fp->LChild = S; 
        else if (key > fp->data.key)
            fp->RChild = S; 
        else {
            free (S);
            return;
        }

        /* 确定节点B,并修改A的平衡因子 */ 
        AVLTNode    *B; 
        if (key < A->data.key) { 
            B = A->LChild; 
            A->bf += 1; 
        }else { 
            B = A->RChild; 
            A->bf -= 1; 
        }

        /* 修改B到S路径上各节点的平衡因子 */
        p = B; 
        while (p != S) { 
            if (key < p->data.key) { 
                p->bf = 1; 
                p = p->LChild; 
            }else { 
                p->bf = -1; 
                p = p->RChild; 
            }
        } 

        /* 判断失衡类型并做相应处理 */
        /* LL型 */
        if (2 == A->bf && 1 == B->bf) {
            /* A做一次顺时针旋转 */
            B = A->LChild;
            A->LChild = B->RChild;
            B->RChild = A;
            A->bf = B->bf = 0; 

            if (!FA) 
                *avlt = B;
            else if (A == FA->LChild)
                FA->LChild = B;
            else 
                FA->RChild = B;
        } /* LR型 */
        else if (2 == A->bf && -1 == B->bf) {
            AVLTNode *C;
            /* 先对B做一次逆时针旋转,再对A做一次顺时针旋转 */
            B = A->LChild;
            C = B->RChild;
            B->RChild = C->LChild;
            A->LChild = C->RChild;
            C->LChild = B;
            C->RChild = A;

            if (S->data.key < C->data.key) {
                A->bf = -1; B->bf = C->bf = 0;
            }else if (S->data.key > C->data.key) {
                B->bf = 1; A->bf = C->bf = 0;
            }else 
                A->bf = B->bf = 0; 

            if (!FA) 
                *avlt = S;
            else if (A == FA->LChild) 
                FA->LChild = C;
            else 
                FA->RChild = C;
        } /* RL型 */
        else if (-2 == A->bf && 1 == B->bf) {
            AVLTNode *C;
            /* 先对B做一次顺时针旋转,再对A做一次逆时针旋转 */ 
            B = A->RChild;
            C = B->LChild;
            B->LChild = C->RChild;
            A->RChild = C->LChild;
            C->LChild = A;
            C->RChild = B;

            if (S->data.key < C->data.key) {
                B->bf = -1; A->bf = C->bf = 0;
            }else if (S->data.key > C->data.key) {
                A->bf = 1; B->bf = C->bf = 0;
            }else 
                A->bf = B->bf = 0;

            if (!FA) 
                *avlt = S;
            else if (A == FA->LChild) 
                FA->LChild = C;
            else 
                FA->RChild = C;
        } /* RR 型 */
        else if (-2 == A->bf && -1 == B->bf) {
            /* 对A做一次逆时针旋转 */
            B = A->RChild;
            A->RChild = B->LChild;
            B->LChild = A;
            A->bf = B->bf = 0;

            if (!FA) 
                *avlt = B;
            else if (A == FA->LChild) 
                FA->LChild = B;
            else 
                FA->RChild = B;
        }
    }
}
              时间复杂度:O(log 2 n)




数据结构——查找 7.查找 1)查找的基本概念 2)顺序表的查找 3)二叉排序树(或称二叉查找树)和平衡二叉排序树 4)Hash表及其查找 5)查找算法的应用 阅读详情

相关推荐

数据结构 -- 顺序查找和折半查找

查找表(查找结构):用于朝朝的数据集合称为查找表,它由同一类型的数据结构元素(或记录)组成。+n+n)/n+1 = n/2+n/(n+1)若查找到某个元素大于查找目标,则可判定为查找失败(后面的元素都大于查找目标)该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。若查找表是“动态查找表”,更好的实现方式 – 使用链式存储。查找成功:ASL=(n+1)/2 时间复杂度:O(n)?,逐步缩小查找区间,直到找到目标元素或查找区间为空。共有14个元素可能被查找,各自被查找的概率为1/14。

2202_75324779的博客 1788

二叉平衡树算法c语言,算法9-9~9-12:平衡二叉树的基本操作 (C语言代码)

参考代码:#include#include#defineTrue1#defineFalse0#defineEH0#defineLH1#defineRH-1typedefintElemType;typedefstructBSTNode{ElemTypedata;intbf;structBSTNode*lchild,*rchild;}BSTNode,*BSTr...

weixin_34547317的博客 214

【数据结构】顺序查找和折半查找

数据结构之查找算法 摘要:在本篇文章中,主要讲述了在数据结构中所涉及的几大查找算法,包括:顺序查找、折半查找、分块查找和散列表查找。这些查找方式都是数据结构中最基本的查找方式,并且在数据结构中运用广泛。在查找算法中,最为重要的便是算法的平均查找长度, ...

小白_xm 1万+

数据结构中的各种查找---总结篇

一、基本概念: 1、  列表:待搜索的数据集合。 2、  关键字:要查找的那个数据。 3、  查找:一种算法过程。 二、基于线性表的查找: 1、  顺序查找: (1)思想:逐个比较,直到找到或者查找失败。 (2)时间复杂度:T(n) = O(n)。 (3)空间复杂度:S(n) = O(n)。 (4)程序:  Int SeqSearch(RecordList l, KeyType

Angiexia的专栏 1万+

【数据结构】顺序查找

主要内容 基本概念 顺序查找(Sequential Search) 基本概念 在介绍查找算法前我们先重温几个重要概念: 1)数据:客观事物的符号表示,是所有能输入到计算机中,并能被计算机程序处理的符号的总称。如数学计算中用到的整数和实数,文本编辑中用到的字符串,多媒体程序处理的图形、图像、声音及动画等通过特殊编码定义后的数据。 2)数据元素:数据的基本单位,在计算机中通常作为一个整...

春雪阁 2288

数据结构表的三种查找方法

数据结构表的,顺序查找,监视哨查找法,折半查找法。三种查找的方法。

数据结构 --- c语言实现AVL平衡二叉搜索树

构建数据类型 #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct { int key; //键 char info[20]; //数据类型--->字符串类型 }DATA,*LPDATA; 辅助宏 - - -> 宏函数,获取当前节点p节点的高度 #define HEIGHT(p) ((p==NULL)?-1:(p->hei...

weixin_60569662的博客 1212

了解随机振动疲劳分析中 Ansys nCode DesignLife 的平均应力校正

通过选择静态环境,我们可以将其结果视为疲劳计算的平均应力,如图 3 所示,因此从静态偏移载荷工况中提取的平均应力用于转移预测雨流计数中所有循环的平均值。您可以通过观看下面的教学视频获得宝贵的见解,该视频将指导您完成利用 Ansys nCode DesignLife 分析平均应力对随机振动载荷下结构的影响的过程。它基于 R 比率或平均应力水平。另一方面,平均应力校正可以帮助消除平均应力的负面影响,提高结果的保真度。Ansys nCode 提供先进的平均应力校正技术,使工程师能够考虑平均应力对疲劳寿命的影响。

jkh920184196的博客 1519

数据结构之索引查找(分块查找)

索引查找也称为分块查找,也是顺序查找的一种改进方法,在索引查找法中,除表本身之外还需要建立一个索引表。由分块查找可知,它要分开进行,块内元素之间无大小关系,块与块之间有大小关系(比如说:第二块中的元素肯定要比第一块中大,第三块中元素肯定要比前两块中的元素大)所以索引表是有序的,可以进行二分查找进行查找由于要有索引所以要用到结构体。......

&volume的博客 5716

别再为数据发愁:5分钟理解事件相机原理,并自己动手生成事件图像

本文深入浅出地解析了事件相机的工作原理,并提供了从静态图像生成事件数据的实用方法。通过Python代码示例,读者可以快速掌握如何模拟事件相机的输出,应用于机器人导航、自动驾驶等领域,解决数据获取难题。

weixin_31458015的博客 300

学习笔记|多样本单因素方差分析|事后比较|方差齐性|F检验|韦尔奇检验|两独立样本T检验|两样本方差分析|规范表达|《小白爱上SPSS》课程:SPSS第七讲 | 单因素方差分析怎么做?

学习笔记|多样本单因素方差分析|事后比较|方差齐性|F检验|韦尔奇检验|两独立样本T检验|两样本方差分析|规范表达|《小白爱上SPSS》课程:SPSS第七讲 | 单因素方差分析怎么做?

Medlar_CN的博客 9516

数据结构—查找

平均查找长度(ASL)是指在查找过程中,成功查找和不成功查找的平均比较次数。成功查找的ASL(ASL_success):在查找过程中找到目标元素所需的平均比较次数。不成功查找的ASL(ASL_failure):在查找过程中未找到目标元素所需的平均比较次数。可以让各个结点包含更复杂的信息,需确定好各个结点之间比较大小的规则,上面这是一种非递归的实现在插入操作中,只要将最小不平衡子树调整平衡,则其他祖先结点都会恢复平衡二叉排序树、平衡二叉树、红黑树都是适合于查找的二叉树。

wujiao__11的博客 1784

Android开发实战:5分钟搞定全屏沉浸式状态栏(附完整代码示例)

本文提供了Android开发中实现全屏沉浸式状态栏的完整实战指南。通过对比主题配置、动态代码设置和Window标志位三种方法,详细讲解了如何隐藏状态栏并处理布局适配。文章还涵盖了刘海屏、手势导航等高级适配场景,并附有可直接使用的工具类代码,帮助开发者快速提升应用视觉体验。

weixin_29197699的博客 359

数据结构之顺序查找

接下来的几篇博客都是关于查找的;主要有顺序查找;折半查找(应用于有序表);二叉排序树查找;哈希查找; 排序直接的数据结构介绍; 顺序查找和折半查找是顺序表存储;二叉排序树是二叉树存储;哈希查抄是类图(和图的邻接表存储相似); 头文件(Search.h); # ifndef _SORT_ typedef int KeyType; typedef struct { ...

qinjiawei_156558的博客 5174

HarmonyOS开发第一步:Dev Eco Studio4.0保姆级安装配置指南(含Node.js环境)

本文提供HarmonyOS开发环境搭建的保姆级教程,重点详解Dev Eco Studio 4.0的安装与配置,并攻克Node.js环境与Ohpm包管理器的关键设置难点。通过清晰的步骤指引,帮助开发者从零开始,高效完成开发环境部署,顺利迈出鸿蒙应用开发的第一步。

lake5的博客 570

YOLOv8科研探索:HAttention激活更多特征点,真心助你提升细粒度检测精度

如果你在集成中遇到问题,不妨从特征点激活阈值、多尺度融合的逻辑入手,一点点打磨——科研的突破,往往就藏在这些细致的尝试里。想象一下,普通模型可能只关注目标的“大块区域”,而HAttention能让模型同时捕捉到目标的“边缘”“纹理”等细粒度特征点,就像给模型装上了“显微镜”,再小的细节也逃不过它的“眼睛”。比如,小目标的细粒度特征点(如昆虫的触角)和大目标的整体特征点(如昆虫的身体)会被同时考虑,通过注意力权重的分配,让小细节融入全局理解,避免模型“只见树木不见森林”。HAttention通过。

FJN110的博客 80

数据结构之查找

文章目录数据结构 查找顺序查找老刘完蛋玩意折半查找分块查找 数据结构 查找 1.查找表:由同一类型的数据元素(或记录)构成的集合。 2.关键字:数据元素(或记录)中某个数据项的值,用以标识一个数据元素(或记录)。 3.查找:在查找表中确定一个其关键字等于给定值的记录或数据元素。 4.动态查找表:在查找的同时对表做修改操作(插入和删除),否则为静态查找表。 5.平均查找长度:ASL=求和Pi*Ci(Pi为查找表中第i个记录的概率,Ci为和给定值进行过的关键字个数) 顺序查找 老刘完蛋玩意 折半查找 分块查找

老刘的博客 1456

Android开发工程师(IOT)面试指南与参考答案

【摘要】绿联科技招聘Android开发工程师(IOT方向),要求5年以上Android开发经验,精通Kotlin/Java,熟悉IOT设备交互及跨平台开发。岗位职责包括客户端开发维护、技术调研及性能优化等。核心考察点包括:Kotlin协程在IOT低功耗场景的应用、多协议设备连接层设计、音视频性能优化及离线架构实现。重点技术涉及蓝牙Mesh群控、BLE功耗优化及ReactNative混合开发。需具备GooglePlay合规经验,熟悉Android13+权限管理,并能提供量化性能优化案例。

郑伟强dev的专栏 723
上一篇: c/c++ 的零碎知识
下一篇: gdb基本命令
lq.kr
博客等级 码龄14年 9粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值