0
点赞
收藏
分享

微信扫一扫

【数据结构与算法】数据结构

毅会 2022-01-04 阅读 122

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理

文章目录


前言

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!

本文先对数据结构做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章


提示:以下是本篇文章正文内容

一、变量(value)

(1)整型(int)

(2)浮点型(float\double)

(3)字符型(char)

(4)字符串型(string)

(5)布尔型(bool)

.
.

二、散列表/哈希表/键值对(Hash table)

(1)散列表的定义

哈希表也叫散列表,是根据**键码值(Key value)**而直接进行访问的数据结构,存放记录的数组叫做哈希表
映射函数叫做散列函数,有各种类型和功能的映射函数实现哈希表的

.

(2)散列表的结构

散列表由键值对组成,是最有用的基本数据结构之一,一般来说,键是字符串,值是一个整形或者浮点型的数字,通俗来说,散列表“将输入映射到数字”,既可以将不同的输入映射到不同数字,也可以将不同的输入映射到相同的数字,做到**“提供键,返回值”**的功能

.

(3)散列表的功能

(1)给参数的值找参数的位置
(2)它通过把关键码至映射到表中的一个位置来访问记录,以加快查找的速度

.

(4)散列表的使用步骤

(1)创建映射
(2)实现查找
.

(5)散列表的特征

(1)散列表的查找、插入和删除的速度都非常快
(2)散列表的数据结构并不需要自己去实现,编程语言已经提供了数据结构的实现了

(6)散列表的实际应用

(1)用于查找【时间复杂度是常数,比简单查找和快速查找都要快】
(2)用于网站查找IP地址
(3)用于投票站
(4)用于缓存,避免了查询,调用变量的开销

.
.

三、数组(array)

(1)数组的特征

(1)数组是内存的连续空间
(2)数组具有查找快、但插入/删除结点慢的特点
(3)数组的元素必须是同一类型
(4)创建一个数组的时候,要考虑数组的大小,因为数组插入/删除结点比较复杂,警惕越界错误,导致 Stack Over Flow
.

(2)数组的时间复杂度

(1)支持 O(1) 的随机访问操作
(2)平均为 O(n) 的插入和删除操作
在这里插入图片描述
.

(3)数组的实现

在这里插入图片描述
语言里面提供了语法创建

.

(4)数组的实际应用

非常多的,学习变成语言入门的时候就是从最简单的变量、数组入门的

.
.

四、集合(Set)

(1)集合的特征

没有重复的元素的数据结构

(2)集合的实际应用

(1)把数组中重复的元素删除

(2)集合运算:交集、并集、非集的逻辑运算,用于数据处理

.
.

五、栈(Stack)【试卷】

(1)栈的结构

在这里插入图片描述
堆栈类似于一叠便条,插入待办事项的便条放在最前面;读取待办事项时,你只需要读取最上面的便条,并将其删除,待办事项只有两种操作:压入(插入)和弹出(删除)
.

(2)栈的特征

数据先进后出,后入先出【LIFO】
.

(3)栈的实现

编程语言有API进行实现
.

(4)栈的实际应用

(1)浏览器的前进与后退
(2)括号匹配
(3)表达式计算
.
.

六、队列(Queue)【排队】

(1)队列类型

1)普通队列

(1)队列的结构
在这里插入图片描述
(2)特征
数据先进先出,后进后出(FIFO)

.

2)双端队列

(1)双端队列的结构
在这里插入图片描述
(2)双端队列的特征
结合了堆栈和队列,入口和出口都可以进队和出队,既可以先入先出,又可以先入后出

(3)双端队列的实现
有API进行实现

.

3)优先级队列

根据优先级来出队
.

(2)队列的操作

(1)入队操作

(2)出队操作

不允许的操作:插队和删除是不被允许的

(3)队列的实际应用

我用过的列表应用是路径规划中,把全局路径划分为一小段一小段的局部路径进行存储,所有的局部路径依次储存再队列list中,从而组成一个全局路径

.
.

七、链表(list)【渔网】

(1)链表的特征

(1)链表是内存的离散空间
(2)链表具有查找慢,插入/删除结点快的特点
(3)创建一个链表的时候不需要考虑链表的大小,因为链表节点的增加于删除非常快,也非常方便

.

(2)链表的原理

链表的每一个元素都储存了下一个元素的地址,从而使一系列随机的内存地址串联在一起,好像一个寻宝游戏当你前往第一个地址的时候,还会获得第二个地址的位置
.

(3)链表的类型

1)单链表

(1)单链表的结构
在这里插入图片描述
(2)单链表特征

(1)不支持随机访问,需要遍历去访问结点
(2)插入和删除只需要移动指针,时间复杂度为 O(1)
(3)每个结点需要额外的空间存储指针,需要的内存比数组大

(3)通常用class实现
.

2)双链表

在单链表的基础上,除头结点外,每个结点多了一个存放前驱结点内存地址的指针
.

3)循环链表

尾节点指针指向头结点
.

4)静态链表

借助数组,伴随指向后继结点的指针
.

5)跳表(面试不会让你手写)

(1)跳表的结构
在这里插入图片描述
(2)跳表的特征

(1)跳表查询的速度非常快,但是增加和删除元素非常慢
(2)跳表并不常用,因为逻辑十分复杂,维护十分困难,但是要掌握这种思想

(3)跳表的核心思想

(1)升维的方法:以空间复杂度换取时间复杂度
(2)计算机迭代次数少了,但是消耗的内存较多
(3)计算机的数据结构没有十全十美的,只有适用不同类型的数据类型

(4)链表增加\删除节点操作

1)增加节点操作

在这里插入图片描述

2)删除节点操作

在这里插入图片描述

3)操作复杂度为O(1)

在这里插入图片描述
.

(5)链表的实际应用

.
.

八、树(tree)【针对数据库存储问题】

(1)泛型树的结构

在这里插入图片描述
.

(2)二叉树

(1)二叉树结构
在这里插入图片描述
(2)二叉树的特征

二叉树的每个分支只有两个

.

(3)二叉搜索树

(1)二叉搜索树结构
在这里插入图片描述
(2)二叉搜索树特征

(1)每个分支中,右分支节点的值总比左分支节点的值要大
(2)二叉搜索树存的是值,这样的结构有利于值的查找
(3)二叉搜索树不允许随机访问

(3)二叉搜索树的遍历

(1)递归遍历
(2)查询
(3)增加
(4)删除

(4)平衡二叉树

平衡二叉树的作用

为了提高树的执行效率,树的左右两边的高度要平衡,才能保证树不会退化成一个链表
.

1)AVL 树(面试一般不考察)

(1)判断树左右子树的高度是否在(-1~1)之间,若不在 ,使用旋转的方式整理该树,使之平衡

(2)记录左右子树的高度方法
在这里插入图片描述

(3)旋转操作方法
(1)左旋
在这里插入图片描述
(2)右旋
在这里插入图片描述

(3)左右旋
在这里插入图片描述
(4)右左旋
在这里插入图片描述

(4)注意
(1)AVL 树的代码实现十分复杂,面试的时候不会考察的,懂得理论和应用场景就行了
(2)每个结点需要存储额外的信息,且调整次数频繁
.
.

2)红黑树

1)红黑树定义
红黑树时一种近似平衡的二叉搜索树,它能够确保任何一个节点的左右子树的高度差小于两倍,具体来说,红黑树时满足 如下条件的二叉搜索树
1)每个节点要么是红色,要么是黑色
2)根节点是黑色
3)每个叶节点是黑色
4)不能有相邻的两个红色节点
5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点

2)红黑树图例
在这里插入图片描述
.
.

(5)字典树(Trie)

1)字典树的定义

字典树又称单词查找树获键树,是一种树型结构,典型的应用是用于统计和排序大量的字符串,所以经常被搜索引擎系统用于文本词频的统计
.

2)字典树的数据结构

在这里插入图片描述
.

3)字典树的核心思想

(1)字典树是一个以(内存)空间换(CPU运算)时间的方法
(2)利用字符串的公共前缀来降低查询四件的开销以达到提高效率的目的

.

4)字典树的基本性质

(1)结点本身不存完整的单词
(2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
(3)每个节点的所有子节点路径代表的字符都不相同

.

5)字典树的优缺点

优点:最小限度的减少无所谓的字符串比较,查询效率比哈希表高
缺点:需要较大的存储空间
.

(6)树的实际应用

(1)数据库的运维

.
.

九、图(graph)【针对优化问题】

(1)图的作用

用于模拟一系列的连接关系,建立复杂模型

.

(2)图的结构

图由节点(node)和边(edge)组成,类似于每个分支能形成一个循环的树,一个节点可能于众多的节点直接相连,这些节点成为该节点的邻居节点
.

(3)图的特征

遍历时需要记录已经访问过的结点
.

(4)图的实际应用

(1)建立复杂模型
(2)用于KNN搜索算法和简单的机器学习方法
(3)图优化基础

.
.


总结

这是基础,不用自己实现的,编程语言已经提供了数据结构的实现了,我们仅仅需要理解和选择合适的数据结构调用就行

要实现功能,用熟几个九很好

举报

相关推荐

0 条评论