名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波·莫听穿林打叶声》
本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
目录
- 0、思维导图
- 1、数据结构
- 1)数据结构是什么?
- 2)算法是什么?
- 2、数据结构三要素
- 1)逻辑结构
- 2)存储(物理)结构
- 3、算法与评价
- 1)算法的特性
- 2)算法效率如何评价?
0、思维导图
1、数据结构
1)数据结构是什么?
1️⃣数据结构
数据结构是指一组数据元素的组织方式。数据结构为计算机提供了一种高效、有序且灵活的方式来组织和处理数据。
2️⃣数据结构的作用
决定了数据元素之间的逻辑关系和物理存储结构。
- 合适的数据结构可以大幅提高数据处理的效率。例如,哈希表可以实现快速的数据查找,而平衡树结构如红黑树可以高效地维护有序数据。
- 许多高级算法(如图算法、排序算法)都依赖于特定的数据结构,以确保算法的高效执行。
2)算法是什么?
1️⃣算法
算法是指解决特定问题的一系列有限的步骤。
2️⃣算法的作用
算法指导如何有效地在数据结构上执行操作和处理数据,确保高效、优化的数据管理和问题解决。
3)数据结构与算法之间的关系
可以从以下两个角度来理解:
① 数据结构是要处理的信息,而算法则是处理信息的步骤。
② 数据结构是算法的基础,算法是数据结构的实际应用。
2、数据结构三要素
1)逻辑结构
逻辑结构:数据对象中数据元素之间的逻辑关系
1️⃣线性结构(“一对一关系”)
①顺序表/链表
由零个或多个数据元素组成的有限序列。序列中第一个元素没有前驱,最后一个元素没有后继,其余每个元素有且只有一个前驱和一个后继。
②栈
仅在表尾进行插入或删除操作的线性表。
特性:后进先出(Last In First Out,LIFO)。
③队列
只允许在一端进行插入操作,在另一端进行删除操作的线性表。
特性:先进先出(First In First Out,FIFO)。
④串
由零个或多个字符组成的有限序列,通常用于表示文本。
2️⃣非线性结构(“一对多或多对多”)
①集合
集合是一组不重复元素的结构。它不关心元素的顺序,只关心是否存在某个元素。集合通常用于表示一组唯一项,如字典中的单词或数据库中的用户ID。
②树形结构(“一对多”)
树形结构是一种分层数据结构,其中每个元素称为节点。在树形结构中,除了顶部的节点(根节点)外,每个节点都有一个父节点,并可能有多个子节点。
-
树
一种基本的树形结构,其中每个节点可以有任意数量的子节点。树通常用于表示层次结构,如文件系统中的文件和目录。
-
二叉树
一种特殊类型的树,其中每个节点最多有两个子节点,通常称为左子树和右子树。二叉树广泛应用,特别是在搜索和排序算法中。
③图形结构(“多对多”)
-
有向图
边是有方向的(也有称为"弧"的),从一个节点指向另一个节点。关系是单向的。用于表示具有方向性的关系,如城市之间的行驶路线。
-
无向图
边没有方向,即关系是双向的或无向的。无向图用于表示双向或无特定方向的关系,如社交关系中的朋友关系。
2)存储(物理)结构
指的是数据元素在存储空间中的存储方式。
-
①顺序存储
-
常适用于线性结构
- 数组、线性表、栈、队列
-
优缺点
-
a.优点
-
可以随机访问,访问速度快
-
存储密度大
-
-
b.缺点
-
内存空间的利用率比较低
-
插入和删除要移动大量元素,效率低
-
-
-
-
②链式存储
-
适用于线性和非线性结构
-
线性:链表、栈、队列
-
非线性:树、图
-
-
优缺点
-
a.优点
-
内存空间利用率高
-
插入或删除方便,效率高
-
-
b.缺点
-
不能随机访问任意元素
-
不支持下标访问元素
-
需要用额外的空间来表达数据之间的逻辑关系
-
访问元素需从头结点开始遍历整个链表,访问速度较慢。
-
-
-
-
③索引存储
-
适用于线性和非线性
-
线性:顺序表、串
-
非线性:树、图
-
-
优缺点
-
a.优点
-
可以快速查找数据元素
-
检索速度快
-
-
b.缺点
-
存储空间的开销大
-
在插入和删除数据时要修改索引表,花费时间较多
-
-
-
-
④散列存储
-
适用于线性结构和非线性结构
-
线性:散列表、集合
-
非线性:树、图
-
-
优缺点
-
a.优点
- 查找、插入、删除操作都很快
-
b.缺点
-
不支持排序,一般比用线性表存储需要更多的空间
-
记录的关键字不能重复
-
可能产生散列冲突
-
-
-
3、算法与评价
1)算法的特性
① 有穷性(Finiteness):
- 定义:算法必须在执行有限步骤后终止,不能无限循环,并且每一步骤都必须在有限时间内完成。
- 作用:保证了算法最终会得到结果,不会陷入永无止境的执行过程中。
② 确定性(Definiteness):
- 定义:算法的每一步骤都具有确切的定义,不会出现任何模糊或二义性,同一输入条件下,算法的执行过程和结果都是可预测的。
- 作用:确保了算法的行为是可以预测的,每次执行都会产生相同的结果。
③ 可行性(Effectiveness):
- 定义:算法中的每一步都必须是基本操作,即它们都可以在有限时间内精确地完成。
- 作用:确保了算法的每一步都是实际可执行的,而不是抽象或理论上的。
④ 输入(Input):
- 定义:一个算法有零个或多个输入,这些输入取自于特定的对象集合。
- 作用:输入提供了算法处理的数据,它是算法开始执行的前提。
⑤ 输出(Output):
- 定义:算法有一个或多个输出,这些输出是与输入明显区分的特定数量的数据。
- 作用:输出是算法处理后的结果,它是衡量算法有效性的关键指标。
这些特性共同定义了算法的本质,保证了算法能够有效、可靠地解决问题。
2)算法效率如何评价?
①时间复杂度O(n)
时间复杂度(Time Complexity)是一个算法在处理数据时所消耗时间的量度。它通常表示为算法执行步骤数量与输入数据大小之间的关系。
时间复杂度通常用大写字母 “O” 表示。例如:
- O ( 1 ) O(1) O(1):常数时间复杂度,表示算法执行时间不随输入数据大小变化。
- O ( n ) O(n) O(n):线性时间复杂度,算法执行时间与输入数据大小成正比。
- O ( n 2 ) O(n^2) O(n2):二次时间复杂度,执行时间与输入数据大小的平方成正比。
- O ( log n ) O(\log n) O(logn):对数时间复杂度,执行时间与输入数据大小的对数成正比。
- O ( n log n ) O(n\log n) O(nlogn):线性对数时间复杂度,常见于某些高效的排序算法。
例如,一个简单的循环从1遍历到n(n是输入大小)的算法具有 O ( n ) O(n) O(n) 的时间复杂度,而一个嵌套循环(每个循环都从1遍历到n)的算法具有 O ( n 2 ) O(n^2) O(n2) 的时间复杂度。
遇到一些循环时,求解时间复杂度的思路:
-
单层循环求解方案:设执行次数为 t 去求解
-
多层循环求解方案:分析循环之间的关系,之后用求和公式求解
②空间复杂度
空间复杂度(Space Complexity)是衡量算法执行过程中所需内存大小的一个指标。与时间复杂度类似,它描述的是算法对存储空间需求与输入数据大小之间的关系。
空间复杂度可以帮助我们理解一个算法在执行过程中需要占用多少内存资源。
上述内容笔记部分图片来源网络,侵删。
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
点赞加关注,收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!