常用的数据结构及算法

一、数据结构

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

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.hqwc.cn/news/636224.html

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

相关文章

Delphi Firemonkey使用TVertScrollbox自定义列表数据

界面布局设置如下 创建一个过程添加新项目 procedure TForm1.AddItem(name: string; age: Integer); varlayout: TLayout; begin// 设置姓名标签的文本Label3.Text : name;// 设置年龄标签的文本Label4.Text : IntToStr(age);// 克隆 Layout1,并将克隆得到的对象赋值…

删除链表的中间节点

题目链接 删除链表的中间节点 题目描述 注意点 链表中节点的数目在范围 [1, 100000] 内 解答思路 快慢指针找到链表中间节点的前一个节点,慢指针每次跳一格,快指针每次跳两格,当快指针跳到链表末尾时,此时慢指针刚好到链表的…

在PostgreSQL中如何有效地批量导入大量数据,并确保数据加载过程中的性能和稳定性?

文章目录 解决方案1. 使用COPY命令2. 调整配置参数3. 禁用索引和约束4. 使用事务5. 并发导入 总结 在PostgreSQL中,批量导入大量数据是一个常见的需求,特别是在数据迁移、数据仓库填充或大数据分析等场景中。为了确保数据加载过程中的性能和稳定性&#…

【java解决线程间变量不可见性的方案】

解决线程间变量不可见性的方案 一、 背景 所有的实例变量和类变量都存储在主内存,但每个线程都有自己的工作内存,保留了主内存的共享变量的副本,线程修改的是共享变量,但是每个线程每次只能读取工作内存里的值,所以会…

WAF攻防-信息收集识别被动探针代理池仿指纹白名单

知识点 0、WAF介绍&模式&识别&防护等 1、信息收集-被动扫描&第三方接口 2、信息收集-基于爬虫&文件目录探针 3、信息收集-基于用户&代理池&白名单章节点 WAF绕过主要集中在信息收集,漏洞发现,漏洞利用,权限控制…

图像处理的魔法师:Pillow 库探秘

文章目录 图像处理的魔法师:Pillow 库探秘第一部分:背景介绍第二部分:库是什么?第三部分:如何安装这个库?第四部分:库函数使用方法第五部分:场景应用第六部分:常见Bug及解…

【Day 3】Ajax + Vue 项目、路由 + Nginx

1 Ajax Asynchronous JavaScript And XML 异步的 JavaScript 和 XML 作用: 数据交换 通过 Ajax 可以给服务器发送请求,并获取服务器响应的数据 异步交互 可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术&#xf…

代码随想录 797. 所有可能的路径

题目 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一…

【R语言】混合图:小提琴图+箱线图

{ggstatsplot} 是 {ggplot2} 包的扩展,用于创建图形,其中包含信息丰富的绘图本身中包含的统计测试的详细信息。在典型的探索性数据分析工作流程中,数据可视化和统计建模是两个不同的阶段:可视化通知建模,而建模又可以建…

结构体输出字符串末尾有奇怪字符

今天打开之前的陈年老题,发现一个思路全对,但是答案错误的简单结构体的题,发现这个字符串输出末尾有奇怪字符,后来经过一番搜索发现,是因为给字符串定义的时候分配的空间不够,所以多分配一些就好啦 修改后&…

使用prompt_toolkit构建交互式命令行工具

prompt_toolkit是一个python库,用于构建命令行工具和终端应用。其官网介绍如下, prompt_toolkit is a library for building powerful interactive command line and terminal applications in Python. 安装命令如下, pip install prompt_to…

AJAX——图书管理案例

1.渲染列表 自己的图书数据:给自己起个外号,并告诉服务器,默认会有三本书,基于这三本书做数据的增删改查。 // 目标1:渲染图书列表 // 1.1 获取数据 // 1.2 渲染数据const creator 哈哈 // 封装-获取并渲染图书列表函…