数据结构(面试)

目录

    • 线索二叉树
    • 哈夫曼树
    • 并查集
    • 最小生成树
    • 最短路径
    • 拓扑排序
    • 二叉排序树
    • 平衡二叉树
    • 红黑树
    • 折半查找
    • 散列表
    • 堆排序
    • 归并排序

线索二叉树

原理:利用树节点的n+1个左右空指针指向其遍历序列的前驱和后继(线索)
优点:简化遍历,不需要额外的栈空间,快速访问前驱的后继
在这里插入图片描述

哈夫曼树

哈夫曼树定义:在含有n个带权叶节点的二叉树中,其中带权路径(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树
带权路径长度:叶子节点×路径长度 的总和
构建方法:每次选取根节点最小的集合进行两两组合
在这里插入图片描述

并查集

用法:判断图中是否有环,判断是否在一个集合中
思想:使用一个parent[]数组存储集合关系,对集合进行并查操作
:找x所属集合(返回x所属根节点)
:将两个集合合并为一个
在这里插入图片描述
在这里插入图片描述
为了优化,出现最坏的情况,在合并集合的时候可以按秩合并

if(rank[x_root]>rank[y_root]){//将x作为根节点合并parent[y_root]=x_root;
}else{//将y作为根节点合并 rank[x_root]=y_root;if(rank[x_root]==rank[y_root]){//当秩相等时 rank[y_root]++;} 
} 

进一步优化,路径压缩,查找过程中将一个集合路径下的所有节点都挂到集合根节点下面

int find(int x){//找根节点if(x==parent[x])return x;//返回根节点 return parent[x]=find(parent[x]);//路径压缩 
} 

并查集模板代码:

#include<bits/stdc++.h>
using namespace std;
int parent[10005],rank[10005];
//找根节点 
int find(int x){if(x==parent[x])return x;//返回根节点 return parent[x]=find(parent[x]);//路径压缩 
}
//集合合并
void unionset(int x,int y){int x_root=find(x);int y_root=find(y);if(x_root==y_root)return;//在同一个集合中//按秩合并 if(rank[x_root]>rank[y_root]){parent[y_root]=x_root;	}else{parent[x_root]=y_root;if(rank[x_root]=rank[y_root]){rank[y_root]++;}}
}
//打印关系函数
void selectdots(){for(int i=1;i<=5;i++){printf("%d的根节点=%d\n",i,parent[i]);}
}int main(){//初始化 for(int i=0;i<100;i++){parent[i]=i;rank[i]=0;}//初始化两个集合 A{1 ←2 ←3}  B{4 ←5} ;int con[3][2]={{2,1},{3,2},{5,4}};for(int i=0;i<3;i++){unionset(con[i][0],con[i][1]);//建立集合 } printf("A{1 ←2 ←3}  B{4 ←5}两个集合没有合并:\n"); selectdots();printf("2和4点是否有关系:");if(find(2)==find(4)){cout<<true<<endl;;}else{cout<<false<<endl;}printf("\n\n增加3 ←5关系:\n");unionset(5,3);selectdots();printf("2和4点是否有关系:");if(find(2)==find(4)){cout<<true<<endl;;}else{cout<<false<<endl;}printf("\n\n查询一次5的根节点:\n");find(5);selectdots(); return 0;
}

最小生成树

生成树:包含图中全部顶点的一个极小联通子图
在这里插入图片描述
最小生成树:边权值之和最小的生成树
在这里插入图片描述
普利姆算法(选点,适合边稠密):
在这里插入图片描述
克鲁斯卡尔(选边,适合边稀疏):
在这里插入图片描述

最短路径

在这里插入图片描述
Dijkstra算法(带权图,无权图,不适用有负权值的图)
时间复杂度:O(|V|^2)
思想:
1.每次从未标记节点中选择距离出发点最近的节点,标记,收录到最优路径集合中。
2.计算刚加入节点A的邻近节点B的距离(不包含标记的节点),若(节点A的距离+节点A到节点B的边长)<节点B的距离,就进行松弛操作,更新节点B的距离

if((dis[A]+e[A][B])<dis[B]) dis[B] = dis[A] + e[A][B];

Floyd算法(带权图,无权图,负权图,不能解决负权回路的图)
时间复杂度:O(|V|^3)
算法思想:最开始允许经过1号中转,求任意两点最短距离中转,接下来只允许经过2号顶点中转…允许经过1~n号顶点中转
一句话概括:从i号顶点到j号顶点只经过前k号顶点的最短路径

for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(e[i][k]+e[k][j]<e[i][j]){e[i][j]=e[i][k]+e[k][j];}}}} 

拓扑排序

思想,每次选择入度为0的顶点,加入排序序列,并删除所有出边
下面拓扑排序为:1,2,3,4,5
在这里插入图片描述

二叉排序树

定义:左子树节点值<根节点<右子树节点值
查找效率:最好O(logn) 最坏O(n)
在这里插入图片描述

在这里插入图片描述

平衡二叉树

定义:二叉排序树上任一节点的左子树和右子树的高度之差不超过1
缺点:插入/删除 很容易破坏“平衡”特性,需要频繁调整树的形态。如:插入操作导致不平衡,则需要先计算平衡因子,找到最小不平衡子树(时间开销大),再进行LL/RR/LR/RL调整
在这里插入图片描述

红黑树

在这里插入图片描述
**红黑树**:插入/删除 很多时候不会破坏“红黑特性”,无需频繁调整树的形态。即便需要调整,一般可以在常量级时间内完成

在这里插入图片描述
平衡二叉树:适用于以查为主,很少插入/删除的场景
红黑树:适用于频繁插入、删除的场景,实用性更强

折半查找

折半查找时间复杂度:O(log2n)
又称二分查找,仅适用于有序的顺序表,链表不具备随机访问特性,不能使用二分查找

大部分情况下折半查找更优,但是有的情况顺序查找更优(比如待查找元素在第一个位置)
思想:
1.使用双指针lowhigh分别指向有序表头和尾
2.计算 mid = (low+high)/2 将有序表一分为二,判断mid位置元素和待查找元素temp的大小关系,通过移动lowhigh保留temp可能的区间
3.重复第二步,直到low=high且此时指针指向的值等于temp查找成功(当low>high查找失败)
在这里插入图片描述

散列表

定义:一直数据结构,特点是数据元素的关键字与其存储地址直接相关,通过散列函数(哈希函数):Addr=H(key)建立关键字与存储地址的联系
散列查找是一种空间换时间的方法
增删改时间复杂度:O(1)

散列函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
处理冲突的方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

堆排序

空间复杂度:O(1)
时间复杂度:O(nlogn)
物理结构:使用顺序存储
逻辑结构:大根堆根节点大于左子树和右子树,小根堆根节点小于左子树和右子树
在这里插入图片描述
1.建立大根堆:
**思路:**把所有非终端节点都检查一遍,是否满足大根堆的要求,如果不满足,则进行调整
调整方式:检查当前节点是否满足 根>=左、右 若不满足,将当前节点与更大的一个孩子互换,若元素互换破坏了下一级的堆,则采用相同的方法继续向下调整(小元素不断“下坠”)

2.基于大根堆排序
方法:每一趟将堆顶元素加入有序子序列(与待排序序列中的最后一个元素交换),并将待排序元素序列再次调整为大根堆(小元素不断下坠)

归并排序

在这里插入图片描述

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

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

相关文章

7.2 单变量(多->多),attention/informer

继续上文书写&#xff1a; 1 GRU Attention 收敛速度稳定的很多&#xff0c;你看这些模型是不是很容易搭&#xff0c;像积木一样&#xff1b; def create_model(input_shape, output_length,lr1e-3, warehouse"None"):input Input(shapeinput_shape)conv1 Conv…

【C++标准模版库】模拟实现vector+迭代器失效问题

模拟实现vector 一.vector成员变量二.构造函数1.无参&#xff08;默认&#xff09;构造2.有参构造3.拷贝构造1.传统写法2.现代写法 三.vector对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 四.vector对象的访问及遍历操作1.operator[]2.实现迭代器&#xff1…

免费【2024】springboot 大学生志愿者管理系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

windows下设置java环境变量

1.打开window的环境变量设置 右键开始菜单选择系统 选择高级系统设置&#xff1a; 点击环境变量 2.在系统变量 新增 JAVA_HOME&#xff1b;该变量的值 选择jdk所在的目录即可。 JAVA_HOME: D:\Program Files\Java\jdk1.8.0_131 3. 在系统变量新增 classpath; 该变量的值设置…

GoLang 安装

golang学习笔记 goland 安装 To use Go programming language in Visual Studio Code (VSCode), you can follow these steps: 1. Install Go: Download and install the latest version of Go from the official Go website (https://golang.org/dl/). 2. Install VSCode:…

llama-3.1下载部署

llama-3.1 下载部署 下载 huggingface 详情页填写申请后等待审核 点击 头像->setting->access token 创建token 配置环境变量 下载模型 pip install -U huggingface_hubhuggingface-cli download --resume-download meta-llama/Meta-Llama-3.1-8B-Instruct --loca…

IDEA的疑难杂症

注意idea版本是否与maven版本兼容 2019idea与maven3.6以上不兼容 IDEA无法启动 打开idea下载安装的目录:如:Idea\IntelliJ IDEA 2024.1\bin 在bin下面找到 打开在最后一行添加暂停 pause 之后双击运行idea.bat 提示找不到一个jar包,切记不要有中文目录 IDEA缓存 …

Java与Python谁更适合后端开发?

在软件开发的世界里&#xff0c;选择合适的编程语言就像为建筑选择合适的材料一样重要。 对于后端开发而言&#xff0c;Java和Python都是流行的选择&#xff0c;但它们各自拥有独特的优势和劣势&#xff0c;“谁更适合”就成为一个被议论的话题。 事实上&#xff0c;并不存在…

每日学术速递8.2

1.A Scalable Quantum Non-local Neural Network for Image Classification 标题&#xff1a; 用于图像分类的可扩展量子非局部神经网络 作者&#xff1a; Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接&#xff1a;https://arxiv.org/abs/2407.18906 摘要&#x…

[BJDCTF2020]Easy MD51

抓包看一下信息&#xff0c;发现有sql注入字段 输入 注入发现 查看源码 然后get传参?aQNKCDZO&bs214587387a 最后 MD5函数的弱类型比较 发现PHP代码&#xff0c;分析仍为 PHP md5绕过。 使用数组绕过POST传入param1[]1&param2[]2&#xff0c;得到flag。

RIP综合练习

要求&#xff1a; 1.合理使用IP地址划分网络&#xff0c;各自创建循环接口 2.R1创建环回172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&#xff0c;R1,R2之间增加路由传递安全性 5.R5创建一个环回模拟运营商&#xff0c;不能…

打卡第31天------贪心算法

每天抓紧时间刷题,争取尽快上岸,不能再耽误一分一秒了,2024年已经过去大半年了。这个算法编程题是我的痛点。要尽快弥补。 卡尔在讲算法题的时候,思路比较清晰,通俗易懂,以前看见算法题就害怕,因为啥都不会,看懵了,跟了一个月了,每天坚持刷题,偶尔会回顾思路,也会…

开源Spring Boot版本WebSSH:轻松在浏览器中管理SSH和FTP

介绍 WebSSH 是一个轻量级的开源ssh工具&#xff0c;只需安装在服务端&#xff0c;就可以通过浏览器访问SSH和FTP。它支持文件和日志高亮显示&#xff0c;Vim 和 Top 命令&#xff0c;实时查看日志&#xff0c;并且操作体验与标准的 Shell 基本相同。WebSSH 支持多会话、文件上…

【Git】git 从入门到实战系列(二)—— git 介绍以及安装方法 (文末附带视频录制操作步骤)

文章目录 一、前言二、git 是什么三、版本控制系统是什么四、本地 vs 集中式 vs 分布式本地版本控制系统集中式版本控制系统分布式版本控制系统 五、安装 git 一、前言 本系列上一篇文章【Git】git 从入门到实战系列&#xff08;一&#xff09;—— Git 的诞生&#xff0c;Lin…

【2024蓝桥杯/C++/B组/小球反弹】

题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; &#xff08;其中k1, k2为整数&#xff09; Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x)&#xff1b; 目标1&#xff1a;根据k1与k2的关系&#xff0c;找出一组最小整数组&#xff08;k1, k2&#xff09;&#xff…

NLP-使用Word2vec实现文本分类

Word2Vec模型通过学习大量文本数据&#xff0c;将每个单词表示为一个连续的向量&#xff0c;这些向量可以捕捉单词之间的语义和句法关系。本文做文本分类是结合Word2Vec文本内容text&#xff0c;预测其文本标签label。以下使用mock商品数据的代码实现过程过下&#xff1a; 1、…

PCL从理解到应用【08】 点云特征 | 法线估计 | 主曲率估计

前言 在PCL中&#xff0c;有多种方法和函数可以用来提取点云特征&#xff0c;本文介绍几何特征。 其中&#xff0c;几何特征主要包括法线估计和主曲率估计。 这些特征能够描述点云表面的几何形状&#xff0c;常用于进一步的点云处理和分析&#xff0c;如配准、分割和物体识别…

利用canvas 实现图片的标注,把标注像素点传入到后端

背景&#xff1a;我们有一个摄像的产品&#xff0c;拍照传统的水表盘面&#xff0c;我们需要框选水表读数&#xff0c;标注点传到后端&#xff0c;后端根据标注点自动去截取摄像表拍摄回来的图片&#xff0c;然后拿到大模型里面进行训练。由于同一只表拍摄的画面都是一样的&…

【时时三省】unity test 测试框架 使用 code blocks 移植

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 目录 1&#xff0c;使用 Code::Blocks 17.12 创建工程 2&#xff0c;移植文件至该工程下&#xff1a; 移入的文件为: 被移入的文件介绍&#xff1a; 更改代码&#xff1a; 向工程添加文…

k8s 部署RuoYi-Vue-Plus之ingress域名解析

可参看https://blog.csdn.net/weimeibuqieryu/article/details/140798925 搭建ingress 1.创建Ingress对象 ingress-ruoyi.yaml其中host替换为你对应域名&#xff0c;需要解析域名到服务器, 同时为后端服务添加了二级域名解析 api. 访问http://xxx.xyz/就能访问前端&#xff0…