常用的数据结构及算法

一、数据结构

(一)线性结构:一对一。

1.可以使用数组、链表来表示。数组又分为静态数组和动态数组两种。链表常用的是单链表。

2.两种特殊的线性结构:队列和栈。其中队列是先进先出(排队),栈是后进先出(类似弹夹)

(二)树形结构:一对多。

拓扑结构上是一对多的情况,逻辑存储上还是通过数组、链表(不是单链表了,因为不是一对一了)实现。

1.有双亲表示法、孩子表示法、孩子兄弟表示法。

1)双亲表示法:通过静态数组的方式,存储当前结点的数据、双亲的位置(根节点的双亲结点设置为-1)。该方法的优点是容易找到结点的双亲结点,但是找结点的孩子结点就需要遍历。

优化方式:除双亲的位置外,再增加一个长子域(最左孩子的位置),如结点无孩子结点,长子域设置为-1。

2)孩子表示法:链表形式,通过指针域指向各个孩子结点(一般的树,设置的指针域的个数为树的度;二叉树,就是两个指向孩子结点的指针域)。

优化方式一:因为每个结点的度不同,按树的度来设置指针域的话,容易造成资源浪费。

所以,可以增加当前结点的度,然后根据每个结点的度来设置指针域的个数。但该方法不同的结点度不同,而且还要维护度数据,维护复杂。

优化方式二:将每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为,空。然后n个头指针又组成一个线性表,采用顺序存储结构,存在一维数组中。

图中,child中的数据域,是表头中该元素的下标值。 

firstchild是指向子节点的头指针。

但该方法,寻找双亲结点又需要遍历,下图就是将双亲表示法和孩子表示法结合。

3)孩子兄弟表示法:任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,可以设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。

上图调整了下形状,就是二叉树

2.常用的是二叉树。

每个阶段都是两种结果,比如开和关、0和1、真和假、上和下等等,都适合用二叉树结构来建模。

树2是左斜树,树5是右斜树,是线性结构,所以说线性结构是一种特殊的树形结构。 

满二叉树

完全二叉树 

3.二叉树的性质

1) 在二叉树的第i层上至多有个结点(i>=1)

2)深度为k的二叉树至多有个结点(k>=1)

3)对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1(青出于蓝而胜于蓝)

4)具有n个结点的完全二叉树的深度为表示不大于x的最大整数

5)如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第)对任意结点i有:

4.二叉树的存储结构

1)顺序存储:一般只用于完全二叉树,否则会浪费存储空间(如下图所示,会造成空间的浪费)

2)二叉链表(一般用这种形式)

当前结点数据及左右孩子指针

线索二叉树:指向前驱和后继(前驱和后继是按照遍历的方式的定的,不是根据双亲和子结点)的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树 称为线索二叉树。

 

3.二叉树三种遍历方式:前序、中序、后序

(三)图结构:多对多。

二、算法

(一)查找

1.顺序查找:

优化方式:设置哨兵位置。

2.插值查找

3.

4.

5.

6.

7.哈希查找:上述的查找方式是通过将要查找的关键字与记录中的中关键字进行比较;

哈希查找则是通过构建哈希函数,将查找记录的关键词与存储的位置绑定,

(二)排序

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

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

相关文章

SpringBoot3 集成Springdoc 实现Swagger3功能

说明: 只通过引用org.springdoc 的两个包就可以使用Swagger3 功能(步骤1);如想更美观及实现动态认证的开启与关闭,及Swagger3登录认证等功能,需实现(步骤1、2、3)的配置; 1、 引包…

chrome浏览器查看css样式

样式的查看 1.匹配器为灰色文本: 表示非当前选择器 2.样式有划线标识:CSS属性无效或未知 / 属性值无效 / 被其他属性覆盖的属性 3.属性以浅色文本显示且有感叹号提示:属性虽然有效,但由于CSS逻辑而没有任何影响 转自:…

2024HW --->蓝队面试题

这段时间在写横向移动,搞得鸽了很久(内网真的很玄学) 还没写完。。。 但是这不是准备HW了吗。小编也来整理一下自己收集到的题目吧!!! (仅为个人见解,不代表最终答案)&…

react中useState的值没有改变,而是旧的数值

问题背景 想实现点击按钮就改变数据的效果,但是在控制台的打印结果,总是上一次的修改情况,并不是最新的修改后的数据 代码: import { useState, useRef } from "react";// 实现sonA的数据传递给sonB const SonA () …

C语言联合体详解

下午好诶,今天小眼神给大家带来一篇C语言联合体详解的文章~ 目录 联合体 1. 联合体类型的声明 2. 联合体的特点 代码一: 代码二: 3. 相同成员的结构体和联合体对比 ​编辑4. 联合体大小的计算 5. 联合体的优点 联合体 1. 联合体…

第62天:服务攻防-框架安全CVE 复现SpringStrutsLaravelThinkPHP

目录 思维导图 常见语言开发框架: 案例一:PHP-开发框架安全-Thinkphp&Laravel Thinkphp3.2.x日志泄露 自动化脚本检测 如何getshell 手工注入 ​ThinkPHP5 5.0.23 手工注入 工具检测 laravel-cve_2021_3129 案例二:JAVAWEB-开…

pytorch与深度学习

ChatGPT PyTorch是一个由Facebook AI Research Team开发的开源深度学习库,它提供了一个灵活的环境和丰富的API,用于快速且方便地构建、训练和部署深度学习模型。PyTorch在科学界和工业界都收到了广泛的使用,其中包括了学术研究、小型项目和大…

Chrome修改主题颜色

注意:自定义Chrome按钮只在搜索引擎为Google的时候出现。

如何30天快速掌握键盘盲打

失业后在家备考公务员,发现了自己不正确的打字方式,决定每天抽出一点时间练习打字。在抖音上看到一些高手的飞速盲打键盘后,觉得使用正确的指法打字是很必要的。 练习打字,掌握正确的键盘指法十分关键。 练习打字的第一步是找到…

关于电商独立站搭建中电商API数据采集接口的应用

搭建供应链系统时,您可能需要与电商平台进行集成,以实现订单管理、库存同步、物流跟踪等功能。以下是一些常见的电商接口,可以帮助您构建供应链系统: 1. **淘宝开放平台接口**:淘宝开放平台提供了丰富的接口&#xff…

AI System AI系统对大模型的影响有多深?

AI System AI系统对大模型的影响有多深?要回答这个问题之前,不妨从下面这个问题开始入手思考。 大模型进入了爆发期后,在 LLM 进化树中,BERT(Encoder-Only)、T5(Encoder-Decoder)、…

社交创新的标杆:解读Facebook的社交模式

引言 在当今数字化时代,社交媒体已成为人们日常生活和沟通的重要工具。作为全球最大的社交媒体平台,Facebook不仅改变了我们的社交模式,而且对全球的社交文化、商业活动和公共事务产生了深远的影响。本文将深入探讨Facebook的社交模式&#…

C++:面向对象三大特性之一:继承

继承 1.继承理解2.继承方式引起访问变化表格表格理解 3.赋值转换1.普通对象赋值2.继承对象赋值:赋值转换注意 4.继承的作用域5.派生类默认成员函数1.构造函数2.析构函数3.拷贝构造4.赋值重载 6.继承与友元7.继承与静态成员 1.继承理解 继承机制是面向对象程序设计使…

求a+aa+aaa+……(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a 0;int n 0;int i 0;int result 0;int tn 0;//提示用户&am…

spring事务@Transactional

定义一个项目测试 spring 的事务支持情况 项目准备 创建一个名为 mybatis-transaction 的 spring boot 2.x 项目&#xff0c;引入 mybatis 的依赖&#xff0c;如下 使用 spring 官网的脚手架生成项目 https://start.spring.io/ 下载完毕后 pom.xml 如下 <?xml version&quo…

【GPTs分享】GPTs分享之 AskYourPDF Research Assistant​

一、简介 AskYourPDF Research Assistant 是一款高级人工智能研究助手&#xff0c;专门设计用于帮助用户高效从PDF文件和文章中提取信息。它结合了深度学习技术和自然语言处理能力&#xff0c;以便用户能够快速地查询、总结及处理文档内容&#xff0c;并能够生成与文章内容相关…

Redux入门:使用@reduxjs/toolkit构建React应用程序状态管理

随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,但传统的Redux设置和使用过程比较繁琐。幸运的是,Redux官方团队推出了r…

Nginx防盗链:资源保护新利器,拒绝盗链行为!

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ Nginx防盗链是一种安全机制&#xff0c;用于防止其他网站直接链接到你的网站上的资源&#xff08;如图片、视频、文件等&#xff09;&#xff0c;从而避免不必要的带宽消耗…

P1278 单词游戏 简单搜索+玄学优化

单词游戏 传送门 题目描述 Io 和 Ao 在玩一个单词游戏。 他们轮流说出一个仅包含元音字母的单词&#xff0c;并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。 游戏可以从任何一个单词开始。 任何单词禁止说两遍&#xff0c;游戏中只能使用给定词典中含有…

Linux 操作系统指令和Vscdoe安装

1、Linux系统介绍 Linux系统的背景介绍我就不介绍了&#xff0c;有兴趣的可以去看看其发展史。 1.1 Linux操作系统的主要特点 Linux操作系统的重要思想&#xff1a;一切皆文件 Linux操作系统的特性&#xff1a; 完全免费 支持多平台 支持多用户、多任务 有良好的界面 完美兼容…