Data Structure
1
算法和时间复杂度
01.什么是数据结构?
程序设计 = 数据结构 + 算法
数据结构是关系,是数据元素相互之间存在的一种或多种特定关系的集合。
数据结构和算法凌驾于任何一种编程语言之上。
02.逻辑结构和物理结构
数据结构分为逻辑结构和物理结构。
逻辑结构是指数据对象中数据元素之间的逻辑关系,也是今后需要关注和讨论的问题。
四大逻辑结构:
集合——数据元素除了同属于一个集合之外,没有其他关系。
线性——数据元素具有一对一的关系。
树形——数据元素之间存在一对多的层次关系。
图形——数据元素之间存在多对多的关系。
物理结构一般指数据元素在计算机中的存储方法。
数据元素的存储结构形式有两种:顺序存储和链式存储。
顺序存储:把数据元素放在地址连续的存储单元中,其数据间的逻辑关系和物理关系是一致的,例如数组结构。
链式结构:把数据元素放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。此时存储关系不能反映逻辑关系,因此需要用指针存放数据元素的地址。
03.算法
算法:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个操作。
算法的五个基本特征:输入、输出、有穷性、确定性、可行性
算法效率的度量方法:
算法采用的策略、方案
编译产生的代码质量
问题的输入规模
机器执行指令的速度
04.算法的时间复杂度
定义:在进行算法分析的时候,语句总的执行次数T(n)是关于问题规模 n 的函数,进而分析T(n)随 n 的变化情况并确定T(n)的数量级。
算法的时间复杂度,也就是算法的时间度量,记作:
T(n)= O(f(n))。
它表示随问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)表示问题规模 n 的某个函数。
一般情况下,随着输入规模 n 的增大,T(n)增长最慢的是最优算法。
大O记法:用O( )来体现算法时间复杂度的记法。
推导大O阶的算法:
用常数1取代运行时间中的所有加法常数。
在修改后的运行次数函数中,只保留最高阶项。
如果最高阶项存在且不为1,则去除这个项的系数。
线性阶——一般含有非嵌套循环。线性阶就是随着问题规模 n 的扩大,对应计算次数呈直线增长。
平方阶——嵌套循环,包括不严格的嵌套循环。循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数。
对数阶——需要应用数列知识。
常用的时间复杂度所耗的时间从小到大依次是:
O(1)< O(logn)< O(n)< O(nlogn)< O(n^2)< O(n^3)< O(2^n)< O(n!)< O(n^n)
最坏情况:查找一个有n个随机数字数组中的某个数字,最好的情况是第一个数字就是,那么算法的时间复杂度是O(1);但也有可能这个数字在最后位置,此时的时间复杂度是O(n)。
平均运行时间——期望运行的时间。
05.算法的空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现。
算法空间复杂度的计算公式记作:
S(n)= O(f(n))
其中,n为问题规模,f(n)为语句关于n所占存储空间的函数。
通常,我们都是用 “ 时间复杂度 ” 来指运行的时间需求,用 “ 空间复杂度 ” 指空间需求。
关于上面的总结,如果有错误之处,或者疑问,欢迎点击下面【写留言】进行讨论。
【写留言】
---扫码点关注哦---