数据结构
什么是数据结构
在计算机科学中,数据结构是⼀种数据组织、管理和存储的格式。它是相互之间存在⼀种或多种特定关系的数据元素的集合。
说点通俗易懂的话,数据结构就是数据的组织形式,研究的就是把数据按照何种形式存储在计算机中
为什么会有数据结构
- 随着计算机的发展和应⽤范围的拓展,计算机需要处理的数据量越来越⼤,数据类型越来越多,数据之间的关系也越来越复杂。
- 这就要求⼈们对计算机加⼯处理的数据进⾏系统的研究,即研究数据的特性、数据之间存在的关系,以及如何有效的组织、管理存储数据,从⽽提⾼计算机处理数据的效率。
- 数据结构这⻔学科就是在此背景上逐渐形成和发展起来的。
对数据结构更深层次的理解:数据结构研究的是数据本⾝的特性、数据与数据之间的关系,以及如何在计算机中存储数据,从⽽⾼效的处理这些数据。
数据结构的三要素
逻辑结构
逻辑结构:数据中各元素之间的逻辑关系。
它只关⼼数据中各个元素之间的关系,并不关⼼数据是怎么在内存中存储的
常⻅的逻辑结构
- 集合
所有的数据只是在⼀个集合中,彼此之间再没有其他的联系 - 线性结构
数据之间只存在⼀对⼀的关系 - 树形结构
数据之间是⼀对多的关系 - 图结构
数据之间存在多对多的关系
存储结构
存储结构⼜称物理结构,但是存储⼆字更能体现本意,后续我们统称存储结构。
存储结构顾名思义,就是数据在计算机中是如何存储的。
⽤⼤⽩话就是,怎么把这个数据结构存到计算机中。
数据的存储结构主要有顺序存储以及链式存储。
- 顺序存储
把逻辑上相邻的元素存储在物理上也相邻的存储单元中。-数组
在程序中典型处理⽅式即数组。即数据不仅在逻辑上是连续的,物理上也是连续的 - 链式结构
通过指针来存储前⼀个或下⼀个数据元素的地址,从⽽实现元素和元素之间的关系
数据的运算
数据的运算(针对数据的各种操作),包括数据结构的实现,以及基于数据结构上的各种操作
- 创建数据结构;
- 增加数据;
- 删除数据;
- 查找数据;
- 修改数据;
- 排序数据;
- 输出数据;
算法
什么是算法
算法(Algorithm)是指解题⽅案的准确⽽完整的描述,是⼀系列解决问题的清晰指令,算法代表着⽤系统的⽅法描述解决问题的策略机制。也就是说,能够对⼀定规范的输⼊,在有限时间内获得所要求的输出。
- 算法是可以没有输⼊的,⼀定要有输出的。没有输出的算法是没有意义的。
简单来说算法就是⼀系列的步骤,⽤来将输⼊数据转化成输出结果
算法好坏的度量
【事前分析法】
算法设计好后,根据算法的设计原理,只要问题规模确定,算法中基本语句执⾏次数和需求资源个数基本也就确定了
算法执⾏所需资源的个数与问题规模n有关。因此可以根据算法执⾏过程中对空间的消耗来衡量算法的好坏,这就是空间复杂度
算法中基本语句总的执⾏次数与问题规模n有关。因此可以根据算法执⾏过程中,所有语句被执⾏的次数之和来衡量算法的好坏,这就是时间复杂度。
综上所述,时间和空间的消耗情况就是我们度量⼀个算法好坏的标准,也就是时间复杂度和空间复杂度
时间复杂度
在计算机科学中,算法的时间复杂度是⼀个函数式T(N)T(N)T(N) ,它定量描述了该算法的运⾏时间。这个函数式T(N)T(N)T(N)计算了程序中语句的执⾏次数
计算⼀下fun中++count语句总共执⾏了多少次
void fun(int N)
{
int count = 0;
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
++count; // 执⾏次数是 n*n,也就是 n^2
}
}
for(int k = 0; k < 2 * N; k++)
{
++count; // 执⾏次数是 2*n
}
int M = 10;
while(M--)
{
++count; // 执⾏次数 10
}
}
fun 函数 ++count 语句的总执⾏次数:
T (N) = N^2 + 2 × N + 10
- 当N = 10 时,T (N) = 100 + 20 + 10 = 130
- 当N = 100 时,T (N) = 10000 + 200 + 10 = 10210
- 当N = 1000 时,T (N) = 1000000 + 2000 + 10 = 1002010
- 当N = 10000 时,T (N) = 100000000 + 20000 + 10 = 100020010
⼤O表⽰法
在上述案例中,对N取值进⾏分析,随着N的增⼤,对结果影响最⼤的⼀项是N^2 ,2xN和10可以忽略不计,算法执⾏时间的增⻓率与T(N)T(N)T(N)中的N^2的增⻓率基本⼀致。
因此,在计算时间复杂度的时候,⼀般会把T(N)T(N)T(N)中对结果影响不⼤的项忽略掉,该种表⽰时间复杂度的⽅式称为⼤O渐进时间复杂度-粗略的估计⽅式,只看影响时间开销最⼤的⼀项。
所以对于上述fun函数,其时间复杂度为O(T(N))=O(N2+2N+10)O(T(N))=O(N^2+2N+10)O(T(N))=O(N2+2N+10),取最⾼阶项最终为:O(N2)O(N^2)O(N2)
推导⼤O渐进时间复杂度的规则
- 时间复杂度函数式T (N)中,只保留最⾼阶项,去掉那些低阶项;
- 如果最⾼阶项存在且不是1 ,则去除这个项⽬的常数系数;
- T (N) 中如果没有N 相关的项⽬,只有常数项,⽤常数1 取代所有加法常数。
最优、平均和最差时间复杂度
在n 个整形元素数组中,检测x 是否存在,若存在返回其在数组中的下标,否则返回-1
int find (int a[], int n, int x)
{
for (int i = 0; i < n; i++)
{
if (a[i] == x)
return i;
}
return -1;
}
![![[Pasted image 20250315162034.png]]](https://i-blog.csdnimg.cn/direct/be6cbe55e6184813a5f0ee19695d9388.png)
| 21 | 15 | 66 | 34 | 82 | 95 | 53 | 78 | 46 | 17 |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
在查找过程中,需⽤x 与数组中元素依次⽐较,因此总的⽐较次数就是该算法的时间复杂度。则:
- 若待查找元素x 为21 ,只需要⽐较1 次,为算法的最优(好)情况。
- 若带查找元素x 为17 ,或者是不存在的元素,需要⽐较n 次,为算法的最坏(差)情况。
- 所有情况的⽐较次数之和,除以总情况,为算法的平均情况。
查找第⼀个元素需⽐较1次,查找第2个元素需⽐较2次,…,查找第n个元素需⽐较n次,假设每个元素查找的概率相同,则平均⽐较次数为
f(n)=1+2+3+⋯+nn=(1+n)×n2n=1+nn f(n)=\frac{1+2+3+\dots+n}{n}=\frac{(1+n)\times n}{2n}=\frac{1+n}{n}

最低0.47元/天 解锁文章
518

被折叠的 条评论
为什么被折叠?



