持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
第一章 基本概念 1.1 数据关系 数据项→→数据元素→→数据对象→→数据
数据项:数据项组成数据元素,数据项是不可分割的最小单位 数据元素:组成数据的基本单位 数据对象:性质相同的数据元素的集合 数据:描述客观事物的符合
数据结构:相互之间存在一种或多种特定关系的数据元素的集合
1.2 逻辑结构和物理结构 逻辑结构:数据对象中数据元素的相互关系
逻辑结构包括:集合结构、线性结构、树形结构、图形结构 物理结构:数据的逻辑结构在计算机中的存储形式,也就是将数据元素存储到存储器
物理结构包括:顺序存储结构、链式存储结构
顺序存储结构:把数据元素存放在地址连续的存储单元,数据间逻辑关系和物理关系是一样的
链式存储结构:把数据元素存储到任意存储单元中,这些单元可以是连续的也可以是不连续的
链式存储很灵活,不用在意存储的位置,只要有一个存放地址的指针就好了。
第二章 算法 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,且每条指令表示一个或多个操作。
2.1 算法特性 输入、输出、有穷性、确定性、可行性
输入输出:算法具有输入和输出 有穷性:算法不会出现无限循环,并且每个步骤可在可接受时间内完成 确定性:每个步骤都有确定的含义 可行性:算法的每一步都是可行的,也就是每一步都能够通过执行的有限次完成 2.2 算法设计的要求: 正确性 可读性 健壮性 时间效率高、存储量低 2.3 算法时间复杂度 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况而确定T(n)的数量级。
时间复杂度,也就是算法的时间度量,表示岁问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
一般情况下,随着n的增大,T(n)增大最慢的方法是最优算法
用大写的O()来体现算法复杂度的记法,称为大O法。
如何推导时间复杂度:
1、常数阶:O(1)
2、线性阶:O(n)
关键在于分析循环结构内部情况,下面程序复杂度为O(n)
int i for (i=0;i<n;i++) { //时间复杂度为O(1)的程序 } 1 2 3 4 5 3、对数阶:O(log n)
int count=1; while(count<n) { count=count2 //时间复杂度为O(1)的程序 } 1 2 3 4 5 由于每次count2以后,就距离n更近了,也就是说有多少个2相乘后大于n,则会退出循环,2x=n−>x=log2n2x=n−>x=log2n,所以时间复杂度为O(log n)
4、平方阶:O(n^2)
int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { //时间复杂度为O(1)的程序 } } 1 2 3 4 5 6 7 8 相当于循环了n*n次,时间复杂度为O(n^2),如果外部循环m次,时间复杂度为O(n^m)
总结:时间复杂度为循环体的复杂度乘以该循环运行次数