从淘宝推荐到微信搜索:查找算法如何支撑亿级用户——动画可视化 - 教程

news/2025/11/13 15:38:40/文章来源:https://www.cnblogs.com/yangykaifa/p/19218348

 本篇技术博文摘要

  • 本文通过动画可视化深入解析数据结构中的核心查找算法,从基础概念到高阶应用,全面覆盖顺序查找、折半查找、分块查找、B树/B+树及散列查找的核心原理与实现细节。文章以动态演示为核心工具,直观展现算法执行过程与数据结构演化,帮助读者突破抽象理论难点。

  • 内容核心

    • 基础算法

      • 顺序查找:从暴力遍历到哨兵优化,结合判定树分析ASL(平均查找长度),探讨有序表场景下的效率提升策略。

      • 折半查找:通过二分思想与判定树模型,解析有序数据的高效检索逻辑,并给出代码实现与时间复杂度推导。

    • 进阶索引结构

      • 分块查找:融合顺序与折半查找优势,分析块划分对效率的影响。

      • B树与B+树:从多叉查找树的平衡规则出发,动态演示插入、删除操作如何维持树结构稳定;对比B+树的特性(如叶子节点链表),阐释其在数据库索引中的核心地位。

    • 散列查找与冲突解决

      • 详解哈希函数设计原则(如除留余数法),通过动画模拟拉链法、开放定址法、再散列法的冲突处理过程,揭示哈希表动态扩容与数据分布规律。

引言

  • 在这个变幻莫测、快速发展的技术时代,与时俱进是每个IT工程师的必修课。
  • 我是盛透侧视攻城狮,一名什么都会一丢丢的网络安全工程师,也是众多技术社区的活跃成员以及多家大厂官方认可人员,希望能够与各位在此共同成长。

上节回顾

目录

本篇技术博文摘要

引言

上节回顾

7.2数据结构与算法之查找算法题目

7.2.1题:

代码算法实现思路:

核心代码实现:

7.2.2题:​

代码算法实现思路:

核心代码实现:

注意:

7.2.3题:​

代码算法实现思路:

核心代码实现:

 7.3​.数据结构与算法之树形查找算法题

7.3.1题:​

代码算法实现思路:

核心代码实现:

 7.3.2题:​

代码算法实现思路:

核心代码实现:

 7.3.3题:​

代码算法实现思路:

核心代码实现:

 7.3.4题:​

代码算法实现思路:

核心代码实现:

 7.3.5题:​

代码算法实现思路:

核心代码实现:

补充:

 7.3.6题:​

代码算法实现思路:

核心代码实现:

补充:

欢迎各位彦祖与热巴畅游本人专栏与技术博客

你的三连是我最大的动力

点击➡️指向的专栏名即可闪现


7.2数据结构与算法之查找算法题目

7.2.1题:

  •  出折半查找的递归算法。初始调用时,low为1,high为ST.length。 

代码算法实现思路:

  • 根据查找的起始位置和终止位置,将查找序列一分为二,判断所查找的关键字在哪一部分,然后用新的序列的起始位置和终止位置递归求解。

核心代码实现:

typedef struct{            //查找表的数据结构ElemType   *elem;      //存储空间基址,建表时按实际长度分配,0号留空int        length;     //表的长度
} SSTable;
int BinSearchRec(SSTable ST, ElemType key, int low, int high){if(low>high)return 0;mid=(low+high)/2;              //取中间位置if(key>ST.elem[mid])           //向后半部分查找BinSearchRec(ST,key,mid+1,high);else if(key

7.2.2题:​

  •  线性表中各结点的检索概率不等时,可用如下策略提高顺序检索的效率:
  • 若找到指定的结点,则将该结点和其前驱结点(若存在)交换,使得经常被检索的结点尽量位于表的前端。
  • 试设计在顺序结构和链式结构的线性表上实现上述策略的顺序检索算法。

代码算法实现思路:

  • 检索时可先从表头开始向后顺序扫描,若找到指定的结点,则将该结点和其前趋结点(若存在)交换。

核心代码实现:

int SeqSrch(RcdType R[], ElemType k) {//顺序查找线性表,找到后和其前面的元素交换int i=0;while ((R[i].key !=k) && (i0) {                   //若找到,则交换temp=R[i]; R[i]=R[i-1]; R[i-1]=temp;return --i;                   //交换成功,返回交换后的位置}else return -1;                   //交换失败
}

注意:

  • 链表方式实现的基本思想与上述思想相似,但要注意用链表实现时,在交换两个结点之前需要保存指向前一结点的指针。

7.2.3题:​

代码算法实现思路:

  • 从矩阵A的右上角(最右列)开始比较,若当前元素小于目标值,则向下寻找下一个更大的元素;
  • 若当前元素大于目标值,则从右往左依次比较,若目标值存在,则只可能在该行中。

核心代码实现:

bool findkey(int A[][], int n, int k) {int i=0, j=n-1;while (i=0) {                //离开边界时查找结束if (A[i][j]==k) return true;  //查找成功else if (A[i][j]>k) j--;      //向左移动,在该行内寻找目标值else i++;                      //向下移动,查找下一个更大的元素}return false;                      //查找失败
}
  • 比较次数不超过2n次,时间复杂度为O(n);空间复杂度为O(1)。

 7.3​.数据结构与算法之树形查找算法题

7.3.1题:​

  • 试编写一个算法,判断给定的二叉树是否是二叉排序树。

代码算法实现思路:

  • 对二叉排序树来说,其中序遍历序列为一个递增有序序列。
  • 因此,对给定的二叉树进行中序遍历,若始终能保持前一个值比后一个值小,则说明该二叉树是一棵二叉排序树。

核心代码实现:

KeyType predt=-32767;              //predt 为全局变量,保存当前结点中序前驱的值,初值为-∞
int JudgeBST(BiTree bt) {int b1,b2;if(bt==NULL)                     //空树return 1;else{b1=JudgeBST(bt->lchild);     //判断左子树是否是二叉排序树if(b1==0||predt>=bt->data)  //若左子树返回值为 0 或前驱大于或等于当前结点return 0;                //则不是二叉排序树predt=bt->data;              //保存当前结点的关键字b2=JudgeBST(bt->rchild);     //判断右子树return b2;                   //返回右子树的结果}
}

 7.3.2题:​

  •  设计一个算法,求出指定结点在给定二叉排序树中的层次。

代码算法实现思路:

  • 设二叉树采用二叉链表存储结构。
  • 在二叉排序树中,查找一次就下降一层。
  • 因此,查找该结点所用的次数就是该结点在二叉排序树中的层次。
  • 采用二叉排序树非递归查找算法,用n保存查找层次,每查找一次,n就加1,直到找到相应的结点。

核心代码实现:

int level(BiTree bt,BSTNode *p){int n=0;                          //统计查找次数BiTree t=bt;if(bt!=NULL){n++;}while (t->data!=p->data) {if (p->datadata)         //在左子树中查找t=t->lchild;elset=t->rchild;             //在右子树中查找n++;                         //层次加 1}return n;
}

 7.3.3题:​

  • 用二叉树遍历的思想编写一个判断二叉树是否是平衡二叉树的算法。 

代码算法实现思路:

  • 设置二叉树的平衡标记balance,以标记返回二叉树bt是否为平衡二叉树,若为平衡二叉树,则返回1,否则返回0;h为二叉树 bt 的高度。采用后序遍历的递归算法:
    • 1)若 bt为空,则高度为0,balance=1。
    • 2)若 bt仅有根结点,则高度为1,balance=1。
    • 3)否则,对bt的左、右子树执行递归运算,返回左、右子树的高度和平衡标记,bt 的高度为最高子树的高度加1。若左、右子树的高度差大于1,则balance=0;若左、右子树的高度差小于或等于1,且左、右子树都平衡时,balance=1,否则 balance=0。

核心代码实现:

void Judge_AVL(BiTree bt, int &balance, int &h) {int bl=0, br=0, hl=0, hr=0;             //左、右子树的平衡标记和高度if (bt==NULL) {                          //空树,高度为 0h=0;balance=1;}else if (bt->lchild==NULL&&bt->rchild==NULL) { //仅有根结点,则高度为 1h=1;balance=1;}else {Judge_AVL(bt->lchild, bl, hl);      //递归判断左子树Judge_AVL(bt->rchild, br, hr);      //递归判断右子树h=(hl>hr?hl:hr)+1;if (abs(hl-hr)<2)  //若子树高度差的绝对值<2,则看左、右子树是否都平衡balance=bl&&br; //&&为逻辑与,即左、右子树都平衡时,二叉树平衡elsebalance=0;}
}

 7.3.4题:​

  •  设计一个算法,求出给定二叉排序树中最小和最大的关键字。

代码算法实现思路:

  • 一棵二叉排序树中,最左下结点即为关键字最小的结点,最右下结点即为关键字最大的结点,本算法只要找出这两个结点即可,而不需要比较关键字。

核心代码实现:

KeyType MinKey(BSTNode *bt) {while (bt->lchild!=NULL)bt=bt->lchild;return bt->data;
}
KeyType MaxKey(BSTNode *bt) {//求出二叉排序树中最大关键字结点while (bt->rchild!=NULL)bt=bt->rchild;return bt->data;
}

 7.3.5题:​

  •  设计一个算法,从大到小输出二叉排序树中所有值不小于k的关键字。

代码算法实现思路:

  • 由二叉排序树的性质可知,右子树中所有的结点值均大于根结点值,左子树中所有的结点值均小于根结点值。
  • 为了从大到小输出,先遍历右子树,再访问根结点,后遍历左子树。

核心代码实现:

void Output(BSTNode *bt, KeyType k) {//本算法从大到小输出二叉排序树中所有值不小于k的关键字if (bt==NULL)return;if (bt->rchild!=NULL)Output(bt->rchild, k);      //递归输出右子树结点if (bt->data>=k)printf("%d", bt->data);     //只输出大于或等于k的结点值if (bt->lchild!=NULL)Output(bt->lchild, k);      //递归输出左子树的结点
}

补充:

  • 本题也可采用中序遍历加辅助栈的方法实现。

 7.3.6题:​

代码算法实现思路:

  • 所以我们可以对左右子树的搜索采用相同的规则,

核心代码实现:

BSTNode *Search_Small(BSTNode*t, int k) {//在以t为根的子树上寻找第k小的元素,返回其所在结点的指针。k从1开始计算//在树结点中增加一个count数据成员,存储以该结点为根的子树的结点个数if(k<1||k>t->count) return NULL;if(t->lchild==NULL) {if(k==1) return t;else return Search_Small(t->rchild,k-1);}else{if(t->lchild->count==k-1) return t;if(t->lchild->count>k-1) return Search_Small(t->lchild,k);if(t->lchild->countrchild, k-(t->lchild->count+1));}
}

补充:

  • 最大查找长度取决于树的高度。
  • 由于二叉排序树是随机生成的,其高度应是O(log2n),算法的时间复杂度为O(log2n)。

欢迎各位彦祖与热巴畅游本人专栏与技术博客

你的三连是我最大的动力

点击➡️指向的专栏名即可闪现

➡️渗透终极之红队攻击行动 

➡️动画可视化数据结构与算法

➡️ 永恒之心蓝队联纵合横防御

➡️华为高级网络工程师

➡️华为高级防火墙防御集成部署

 ➡️ 未授权访问漏洞横向渗透利用

 ➡️逆向软件破解工程

➡️MYSQL REDIS 进阶实操

➡️红帽高级工程师

➡️红帽系统管理员

➡️HVV 全国各地面试题汇总

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/964390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM系列——垃圾收集(1)

https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.htmlhttps://www.bilibili.com/video/BV1US4y1m7if/?spm_id_from=333.337.search-card.all.click&vd_source=99ec55b57f4eeedd9ed62c43e87cb6f…

2025年上海统招专升本平台权威推荐榜单:上海专升本/上海全日制专升/上海专升本培训平台精选

在学历提升需求持续增长的背景下,上海统招专升本已成为专科生获得本科学历的重要途径,选择优质的教育服务平台对考生备考至关重要。 近年来,上海地区统招专升本报考人数呈现稳步增长趋势。据教育统计数据显示,2024…

bug的类型

代码错误、界面优化、设计缺陷、配置相关、安装部署、性能问题、标准规范、测试脚本等

Codeforces 1120D Power Tree 题解 [ 蓝 ] [ 树形 DP ] [ 记忆化搜索 ] [ 图论建模 ] [ 最小生成树 ] [ 差分 ]

Power Tree 简单题,场上大概写了 50min。 Sol.1 树形 DP 对所有数变 \(0\) 的条件进行刻画,把子树的条件画在序列上。具体而言,我们求出树的中序遍历,选择一个节点等价于将其子树的区间 \([l, r]\) 分离出来,即在…

软件开发公司的隐形资产:为什么设计思维比代码量更值钱?

软件开发公司的隐形资产:为什么设计思维比代码量更值钱?代码量陷阱:软件开发的认知误区 在软件开发行业,“代码量”曾长期被当作衡量开发能力与项目价值的硬指标。不少企业将日均代码行数、功能模块数量作为考核标…

mybatis 打印执行SQL

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; import lombok.extern.slf4j.Slf4j; imp…

10年湛江老导游私藏路线!除了生蚝,这座海滨之城还有多少惊喜等你发现

各位旅友,大家好! 我是导游小胡,在湛江这座美丽的海滨城市已经做了整整10年导游。今天,我想带大家看看,除了远近闻名的湛江生蚝,这座城市还有哪些让人流连忘返的风景。 湖光岩:世界地质奇观的秘密 作为世界第二…

ld.lld: error: undefined symbol: _impure_ptr 出现该问题解决办法

ld.lld: error: undefined symbol: _impure_ptr 出现该问题解决办法 解决方案命令 方法1:显式链接newlib gcc -specs=nosys.specs your_source.c -o output方法2:使用完整newlib gcc --specs=rdimon.specs -lrdimon …

5、MySQL 常用值

MySQL 常用值清单,涵盖了实际开发中最频繁使用的默认值、函数和属性。 一、自动编号与唯一标识 值/属性说明使用场景示例AUTO_INCREMENT 自动生成唯一递增整数 id INT AUTO_INCREMENT PRIMARY KEYUUID() 生成全局唯一…

2025年平移门行业十大服务商权威推荐榜单:专业选择指南

文章摘要 随着智能出入管理需求的持续增长,2025年平移门行业迎来新一轮技术革新与市场洗牌。本文基于行业数据与用户口碑,深度解析当前市场上十大平移门服务商的综合实力,为企事业单位提供权威参考。文末附专业选购…

2025年平移门服务商综合实力排行榜:十大优质企业深度解析

摘要 随着智能建筑和安防需求的不断提升,平移门行业在2025年迎来了新一轮发展机遇。本文基于市场调研数据、用户口碑评价和技术实力分析,为您呈现当前国内平移门服务商的综合排名。本排名旨在为有平移门采购需求的用…

气象数值预报高性能计算

气象数值预报高性能计算 参考:https://www.pianshen.com/article/55351864263/

北京婚姻诉讼律师精选推荐

面对婚姻诉讼,选择一位专业资深的律师是保障自身权益的关键一步。 当婚姻走向终点,复杂的法律程序、财产分割和子女抚养问题往往让人倍感压力。在北京这样的大都市,婚姻案件不仅数量庞大,而且涉及高净值财产、跨境…

使用性能监视器,收集硬件使用记录、自定义CPU 内存 网卡等使用历史记录

使用性能监视器 这是Windows自带的、最强大的性能历史记录工具。 1. 创建数据收集器集(用于记录历史数据)按 Win + R,输入 perfmon 并回车,打开“性能监视器”。在左侧窗格中,展开 “数据收集器集” -> “用户…

基于ComfyUI的Wan2.2文生视频显卡性能实测

我们就基于ComfyUI的预置工作流模板来测试Wan2.2的模型在3090和4090两张显卡下文生视频的效率。 我们写一个Python脚本来调用ComfyUI的API,通过工作流自动生成视频,并通过多次调用取平均的方式来统计比较3090和4090执…

2025年不锈钢列管式冷凝器源头厂家权威推荐榜单:化工冷凝器/新型风冷冷凝器/不锈钢冷凝器源头厂家精选

在化工流程工业持续升级的背景下,不锈钢列管式冷凝器以其优异的耐腐蚀性能和稳定的换热效率,正成为众多企业工艺升级的首选设备。 不锈钢列管式冷凝器作为化工生产中的关键换热设备,其市场需求与化工行业固定资产投…

10年恩施老导游小胡吐血整理!这5个景点不去等于白来,内含独家避坑指南

各位旅友,大家好! 我是小胡,在恩施这片美丽的土地上做了整整10年导游。今天想和大家聊聊,除了网红打卡点,恩施还有哪些值得细细品味的地方。恩施大峡谷:地球的年轮书第一次来大峡谷的游客,总会对着"一炷香…

一阶矩估计

一阶矩估计(First Moment Estimation)在统计学和机器学习中通常指的是使用样本的一阶原点矩(即样本均值)来估计总体的一阶原点矩(即总体均值或其他依赖于它的参数)。 这是一种基于**矩估计方法(Method of Momen…

P13544 [OOI 2022] Serious Business

P13544 [OOI 2022] Serious Business 题目 Dima 参加了好友 Peter 举办的节目《Peter 帮兄弟找工作》。在这个节目中,Dima 需要穿越一个 \(3 \times n\) 的矩形场地,场地共有 \(3\) 行 \(n\) 列。每行的格子从左到右…

区间与除法-线段树

P5629-区间与除法-线段树 题意 给定 \(n\) 个数,如果可以通过除以给定的 \(d\) 得到 \(m\) 个原数中的一个,则称为可消除的,每次询问区间 \(l\) , \(r\) 中消除所有可消除的数所需的最少原数个数。写题ing 要不是…