数据结构的查找

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

实战避坑:示波器测量非隔离开关电源的炸机风险与隔离方案

本文详细分析了使用示波器测量非隔离开关电源时的炸机风险,揭示了地线环路导致的短路问题,并对比了四种防炸机解决方案,包括示波器隔离供电、拔掉电源地线、使用差分探头和被测板隔离供电。重点推荐使用隔离变压器方案,确保测量安全与精度,同时提供了实操建议与经验分享,帮助工程师避免常见测量事故。

weixin_29224309的博客 561

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

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

&volume的博客 5716

FLUKA软件在Ubuntu的安装指南(亲测有效)

FLUKA其强大的蒙特卡洛模拟能力使得用户能够模拟复杂的辐射相互作用过程

chencheng1127的博客 2887

【虚幻引擎】UE4初学者系列教程基础篇-全中文新手入门教程(UE5系列继续更新)

菜单栏菜单栏当中有文件、编辑、窗口帮助。文件当中可以进行一个关卡的新建、关卡的打开、关卡的保存还有就是打包项目,(项目大于关卡,项目里面可能有几百个关卡),这是比较常用的几个,这里可以看到打包当中有安卓端HTML5端,IOS端linux,还有就是TVOS(苹果电视)、windows的一些端口的一些设置。还可以打开最近打开的项目。关卡编辑器:工具栏3.3 “模式”面板保存所有:ctrl+shift+s(有的软件截屏也是这个按键需要注意)3.4 “内容浏览器”面板缩放:ctr+鼠标滚轮3.5.视口面板。

qq_45206556的博客 2万+

数据结构—查找

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

wujiao__11的博客 1784

Hyper-V创建Ubuntu虚拟机设置固定IP

本文记录使用hyper-v创建ubuntu虚拟机,为虚拟设置固定IP且通过物理机可访问。

2623

数据结构之顺序查找

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

qinjiawei_156558的博客 5174

怎样自己亲手搭建一个四比特加法器

如何用三极管搭建一个四比特加法器 一、前言 作为大一上学期第一个大作业,最终还是拖到了冬学期的第八周,从第七周的周六开始,一直到第八周周五上午课上展示,中间连续熬了好几天的夜,另外,白天凡是有时间都用在研究它了,最终大约是用了30个小时,完成了这个四比特加法器的“从零到一”。 最终,小组得分92,个人分数100(贡献比35%),也不枉自己投入的心血 二、器材 电阻 1 包(10kΩ×100,1kΩ×50) 三极管 1 包(9013×100,LED×6) 跳线 3 短 1.5 长 电源 1 个 USB 线

qq_34771124的博客 1万+

CNC数控机床数据采集,CNC数据采集 设备联网 车间数字化

cnc数据采集 cnc机床数据采集 免受权采集 设备联网

weixin_38175277的博客 2776

数据结构之查找

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

老刘的博客 1456

基于sklearn实现LDA主题模型(附实战案例)

目录LDA主题模型1.LDA主题模型原理2.LDA主题模型推演过程3.sklearn实现LDA主题模型(实战)3.1数据集介绍3.2导入数据3.3分词处理 3.4文本向量化3.5构建LDA模型3.6LDA模型可视化 3.7困惑度 其实说到LDA能想到的有两个含义,一种是线性判别分析(Linear Discriminant Analysis),一种说的是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA)。 现在讨论的是主题模型

m0_64336780的博客 2万+
上一篇: 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、付费专栏及课程。

余额充值