本文主要是介绍2021-11-15 数据结构与算法简介,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
数据结构与算法简介,Leetcode入门及攻略
- 1. 数据结构与算法
- 1.1 相关定义
- 1.2 为什么要学习算法和数据结构
- 1.3 数据结构
- 1.3.1 数据的逻辑结构
- 1.3.2 数据的物理结构
- 1.4 算法
- 1.4.1 算法的基本特性
- 1.4.2 算法追求的目标
- 2. 算法复杂度
- 2.1 时间复杂度
- 2.1.1 渐进符号
- 2.1.2 时间复杂度的计算
- 2.1.3 最佳, 最坏,平均时间复杂度
- 2.2 空间复杂度
1. 数据结构与算法
数据结构是程序的骨架,而算法则是程序的灵魂
1.1 相关定义
- 算法(Algorithm): 解决问题的方法或过程
- 数据结构(Data Structure): 数据的计算机表示和相应的一组操作
- 程序(Program): 算法和数据结构的具体实现
以做菜举例: 把程序设计比作做菜,那么数据结构就是食材和调料,算法则是不同的烹饪方式,有着不同的组合
1.2 为什么要学习算法和数据结构
在程序设计中,对于待解决的问题,我们追求的是:选择更合适的数据结构,使用花费时间更少,占用空间更小的算法
1.3 数据结构
数据结构(Data Structure): 数据的组织结构,用来组织, 存储数据
- 研究内容:数据结构研究的是数据的逻辑结构,物理结构以及它们之间的相互关系,并对这种结构定义相应的运算,设计出相应的算法,并确保经过这些运算之后所得到的数据结构仍保持原来的数据类型
- 作用:提高计算机硬件的利用率
1.3.1 数据的逻辑结构
逻辑结构(Logical Structure):数据元素之间的相互关系
- 集合结构:数据元素同属于一个集合,除此之外无其他关系
- 线性结构:数据元素之间是一对一的关系
- 树形结构:数据元素之间是一对多的层次关系
- 图形结构:数据元素之间是多对多的关系
1.3.2 数据的物理结构
物理结构(Physical Structure):数据的逻辑结构在计算机中的存储方式
- 顺序存储结构(Sequential Storage Structure):将数据元素存放在一片地址连续的存储单元里,数据元素之间的逻辑关系通过数据元素的存储地址来直接反映
**注意:在顺序存储结构中,逻辑上相邻的数据元素在物理地址上也必然相邻 **
- 优点:简单, 易理解,实际上占用最少的存储空间
- 需要占用一片地址连续的存储单元;存储分配要事先进行;对于一些操作的时间效率较低
- 链式存储结构(Linked Storage Structure):将数据元素存放在任意的存储单元里,存储单元可不连续
注意:链式存储需要指针
- 优点:存储空间不必事先分配,在需要存储空间的时候可以临时申请,不会造成空间的浪费;一些操作的时间效率远比顺序存储结构高
- 缺点:不仅数据元素本身的数据信息要占用存储空间,指针也需要占用存储空间,链式存储结构比顺序存储结构的空间开销大。
1.4 算法
算法(Algorithm):解决特定问题求解步骤的准确而完整的描述,在计算机中表现为一系列指令的集合,算法代表着用系统的方法描述解决问题的策略机制
算法,就是指解决问题的方法
1.4.1 算法的基本特性
- 输入:对于待解决的问题,都要以某种方式交给对应的算法。在算法开始之前最初赋给算法的参数称为输入。
- 输出:算法是为了解决问题存在的,最终总需要返回一个结果。所以至少需要一个或多个参数作为算法的输出。
- 有穷性:算法必须在有限的步骤内结束,并且应该在一个可接受的时间内完成。
- 确定性:组成算法的每一条指令必须有着清晰明确的含义,不能令读者在理解时产生二义性或者多义性。就是说,算法的每一个步骤都必须准确定义而无歧义。
- 可行性:算法的每一步操作必须具有可执行性,在当前环境条件下可以通过有限次运算实现。也就是说,每一步都能通过执行有限次数完成,并且可以转换为程序在计算机上运行并得到正确的结果。
1.4.2 算法追求的目标
总体目标
- 所需运行时间更少 (时间复杂度更低)
- 占用内存空间更小 (空间复杂度更低)
但在实际中,兼顾时间复杂度和空间复杂度的算法是不存在的,这时我们需要结合自己具体的情况,采取以空间换时间或者以时间换空间的策略
但一个好的算法还应该追求以下目标:
- 正确性:算法能够满足具体问题的需求,程序运行正常,无语法错误,能够通过典型的软件测试,达到预期的需求。
- 可读性:算法遵循标识符命名规则,简洁易懂,注释语句恰当,方便自己和他人阅读,便于后期修改和调试
- 健壮性: 算法对非法数据以及操作有较好的反应和处理
2. 算法复杂度
算法复杂度(Algorithm complexity): 在问题的输入规模为 n 的条件下,程序的时间使用情况和空间使用情况
比较算法优劣的两种方法:
- 事后统计:将两个算法各编写一个可执行程序,交给计算机执行,记录下各自的运行时间和占用存储空间的实际大小,从中挑选出最好的算法
- 预先估算:在在算法设计出来之后,根据算法中包含的步骤,估算出算法的运行时间和占用空间。比较两个算法的估算值,从中挑选出最好的算法
一般选择第二种方式,第一种方式的工作量太大
在第二种方式下, 我们只关心随着问题规模 n 扩大时,时间开销、空间开销的增长情况。
问题规模n:算法问题输入的数据量大小.对于不同的算法,定义也不相同
- 排序算法中:n 表示需要排序的元素数量。
- 查找算法中:n 表示查找范围内的元素总数:比如数组大小、二维矩阵大小、字符串长度、二叉树节点数、图的节点数、图的边界点等。
- 二进制计算相关算法中:n 表示二进制的展开宽度。
2.1 时间复杂度
时间复杂度(Time Complexity):在问题的输入规模为n的情况下,算法运行所需要花费的时间,可以记作T(n)
度量标准:基本操作次数
基本操作:算法执行中的每一条语句
2.1.1 渐进符号
渐进符号实际上是专门用来刻画函数的增长速度的。
只保留最高次幂(在问题规模很大时,其余部分并不会造成太大影响)
最常用的为下面这种
2.1.2 时间复杂度的计算
- 找出算法中的基本操作(基本语句):算法中执行次数最多的语句就是基本语句,通常是最内层循环的循环体部分。
- 计算基本语句执行次数的数量级:只需要计算基本语句执行次数的数量级,即保证函数中的最高次幂正确即可。
- 用大O表示法表示时间复杂度:将上一步中计算的数量级放入 O 渐进上界符号中。
- 加法原则:总的时间复杂度等于量级最大的基本语句的时间复杂度
- 乘法原则:循环嵌套代码的复杂度等于嵌套内外基本语句的时间复杂度的乘积
2.1.3 最佳, 最坏,平均时间复杂度
- 最佳时间复杂度:每个输入规模下用时最短的输入对应的时间复杂度
- 最坏时间复杂度:每个输入规模下用时最长的输入对应的时间复杂度
- 平均时间复杂度:每个输入规模下所有可能输入对应用时平均值的复杂度(随机输入下期望用时的复杂度)。
2.2 空间复杂度
空间复杂度(Space Complexity):在问题的输入规模为n的条件下,算法所占用的空间大小,可以记作为 S(n)。一般将算法的辅助空间 作为衡量空间复杂度的标准
空间复杂度与时间复杂度有许多共通之处,就不再过多赘述.
算法所需空间主要有两个方面:
- 局部变量(算法范围内定义的变量)所占用的存储空间
- 系统为实现递归(如果算法是递归的话)所使用的堆栈空间
链接: DataWhale算法通关手册.
这篇关于2021-11-15 数据结构与算法简介的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!