作者主页
失踪人口回归,陆续回三中。
开辟文章新专栏——数据结构,恳请各位大佬批评指正!
文章目录
- 作者主页
- 数据结构的基本知识
- 数据:
- 数据元素:
- 数据对象:
- 数据类型:
- 数据结构:
- 逻辑结构:元素之间的逻辑关系
- 存储结构:物理结构
- 数据运算
- 算法与其评价
- 算法的概念:
- 算法效率的评价:
- 时间复杂度
- 空间复杂度
数据结构的基本知识
数据:
数据是信息的载体
数据元素:
数据元素是数据的基本单位,数据项是构成元素不可分割的最小单位。
数据对象:
具有相同性质的数据元素的集合
数据类型:
- 原子类型
- 结构类型
- 抽象数据类型(ADT):描述了数据的逻辑运算和抽象运算,从而构成一个完整的数据结构定义
数据结构:
有一种或多种特定关系的数据元素的集合
逻辑结构:元素之间的逻辑关系
集合:元素同属于一个集合
线性结构:一对一,除了第一个元素,所有元素都有唯一先驱,除了最后一个元素,所有元素都有唯一后继
树形结构:一对多
网状结构:多对多
存储结构:物理结构
顺序存储:数据存储在相邻存储单元中,可以实现随机存储,但是外部碎片多
链式存储:利用存储地址的指针来表示元素之间的逻辑关系,不会出现碎片现象,但是要存储指针占用额外空间,只能实现顺序存取
索引存储:检索快,但索引表占用额外空间,增删数据时也要修改索引表,花费时间较多
散列存储:根据元素的关键字直接计算出该元素存储地址,也称哈希存储。快,但是如果散列函数不好,会导致冲突浪费时间
数据运算
算法与其评价
算法的概念:
是对特定问题求解步骤的一种描述。程序=数据结构+算法(步骤)
算法具有:有穷性,确定性,可行性,输入,输出
算法是有穷的,程序是无穷的
一个好的算法应该具备:正确性,可读性,健壮性,高效率与低存储量需求
算法效率的评价:
时间复杂度
-
定义:
衡量算法执行时间随输入规模增长的变化趋势,不关注具体执行时长,关注的是输入规模变大时,算法运行时间的增长快慢。
-
表述方法:
用大 O 符号(Big O notation)表示,如 O (1)、O (n)、O (n²) 等。通过分析算法中基本操作的执行次数与输入规模 n 的关系来确定,忽略低阶项和常数系数,保留最高阶项表示量级 。
-
计算规则:
- 只保留常数项
- 保留最高项
-
常用技巧
-
加法规则:当一个算法由多个部分组成时,这意味着在计算总时间复杂度时,取各部分时间复杂度中量级最大的那个。例如,算法一部分时间复杂度是(O(n)),另一部分是(O(n2)),整体时间复杂度就是(O(n2)) 。
void loveyou(int n){//1次int i = 1;//3001次while(i<=n){//3000*2次i++;printf("i love you ");} } int main(){loveyou(3000) } //T(n)=1+3001+3000*2 //T(n)=3n+3
-
乘法规则:如果一个算法是嵌套结构,外层操作数量级是(f(n)),内层是(g(n)),那么整体时间复杂度就是两者相乘 。比如外层循环n次,内层循环m次,整体时间复杂度就是(O(n×m)) 。
-
量级比较:“常对幂指阶” 是常见时间复杂度量级从小到大的排序,也是保留阶数最高的依据。
-
-
如何计算:
顺序执行的代码只会影响常数项,可以忽略
只需挑循环中的一个基本操作分析它的执行次数与n的关系即可
如果有多层嵌套循环,只需关注最深层循环几次就行了
-
三种复杂度:
最坏时间复杂度:考虑输入数据“最坏的情况”,执行次数最多的时候
平均时间复杂度:考虑所有输入数据都等概率出现的情况
最好时间复杂度:考虑输入数据的最好的情况,
空间复杂度
-
空间复杂度的定义:
空间复杂度(Space Complexity)是衡量算法在执行过程中临时占用存储空间大小的量度。
它反映了算法所需存储空间与输入数据大小之间的关系。
空间复杂度通常用大O表示法来表示。
2.2 空间复杂度的分析
同时间复杂度一样用大O表示法表示;也是表示一个数量级。记作:
-
2.3 常见的空间复杂度
常数阶:
如果算法的空间复杂度不随问题规模 n 的变化而变化,即算法所需的存储空间是一个常数,那么空间复杂度为 O(1)。
线性阶:
如果算法所需的存储空间与问题规模 n 成正比,即算法所需的存储空间随着 n 的增加而线性增加,那么空间复杂度为
O(n)。
多项式阶:
如果算法所需的存储空间与问题规模 n 的关系可以表示为多项式函数,即空间复杂度为 O(n^k),其中 k 是一个正整数。
对数阶:
如果算法所需的存储空间与问题规模 n 的关系可以表示为对数函数,即空间复杂度为 O(log n)。
指数阶:
如果算法所需的存储空间与问题规模 n 的关系可以表示为指数函数,即空间复杂度为 O(2^n)。
多项式函数,即空间复杂度为 O(n^k),其中 k 是一个正整数。
对数阶:
如果算法所需的存储空间与问题规模 n 的关系可以表示为对数函数,即空间复杂度为 O(log n)。
指数阶:
如果算法所需的存储空间与问题规模 n 的关系可以表示为指数函数,即空间复杂度为 O(2^n)。