一、概述
1.相关术语
A 数据
计算机内的所有的信息。mysql表中的所有记录组成数据。
B 数据元素
具有具体值的对象值。mysql表中的一条具体记录。
C 数据项
对象的属性值。mysql表中某一列的值。
D 数据对象
同一类型的所有对象集合。mysql中某一张表中所有记录。
E 数据结构
各个数据元素抽象出它们之间的关系,一对一?一对多?组成线性、树形等。然后进行操作。
F 数据类型:原子类型(bool、int),结构类型(struct)
抽象数据类型(ADT):属性集合的类类型(属性 + 操作)。
2.数据结构的三要素(重点)
a.逻辑结构:集合,线性结构,树形结构,图形结构。
b.物理结构:顺序存储,链式存储,索引存储,散列存储(哈希存储)。
c.数据的运算:针对不同的存储结构,运算的实现的具体步骤也不同。
线性表属于逻辑结构,顺序表和链表属于物理结构。
对顺序表和链表相关操作具体步骤的实现是算法。
给出名称知道属于逻辑结构还是物理结构。
二、算法
程序 = 数据结构 + 算法
1.什么是算法
算法是解决问题的具体步骤,是有限的确切的计算序列。
2.算法的五个特性
a.有穷性:算法执行有穷步之后结束。不存在死循环。算法有穷,程序无穷(不关机就始终运行)
b.确定性:函数相同的输入一定得到相同的输出。每一步骤必须有确定的含义。
c.可行性:能够通过已实现的基本操作进行运算,如加减乘除。用纸笔经过有限次算也能算出,不一定非得代码。
d.输入:有0个或多个输入,
e.输出:一个或多个输出 x -> f -> y
3.好的算法的特质
正确性:能够正确地执行预先规定的功能和性能要求。最基本的标准。
可读:算法易于人的理解;
健壮:有很好的容错性,输入非法数据处理。
高效率(快)和低存储(使用内存少):时间复杂度和空间复杂度分析。
三、衡量算法的效率
1.时间复杂度(重点)
A 如何评估算法的时间开销?
事前预估算法的时间开销T(n)与问题规模n的关系。 T(n) = O(n) 大O表示法
算法的时间复杂度取决于问题的规模,及待处理数据的初态。
B 如何计算算法的时间复杂度?
加法规则:取阶数最高的那个
乘法规则:嵌套循环 外层循环几次 内层循环几次
O(1) 常数阶 < O(logn) 对数阶 < O(n) 线性阶 < O(nlogn) < O(n^2) 平方阶 < O(n^3) < { O(2^n) < O(n!) <O(n^n) }
输出不同的问题规模,最好时间复杂度 最坏时间复杂度 平均复杂度:出现在任意位置的概率
循环主体中的变量参与循环条件的判断,则变量的改变影响着循环次数。
设循环次数为t,当循环次数为t时,循环主体中的变量与问题规模的关系 为 循环条件。
可得循环次数 与 问题规模的关系。求出 t = T(n) = ? ; 用大O表示
循环主体中的变量与循环条件无关
直接累计循环次数,对非递归程序,如双层循环,直接累计循环次数。
对递归程序,数学归纳法统计,每层递归参数的层级变化。如 n -> n-1 或者 n-> n/2(重点)
2.空间复杂度
程序代码本身占用的空间大小固定,与问题规模无关。算法运行所需的内存空间是固定的常量,S(n) = O(1),该算法可以原地工作。
算法所需的空间与问题规模大小有关。定义的变量与问题规模有关,
如传入的参数为n,为对应数组的下标,算法的空间复杂度为O(n)。二维数组[n][n],算法的空间复杂度为O(n方)。
函数调用导致内存空间增加,关于递归调用,调用的次数与传参有关,等于递归调用的深度。
递归调用内开辟空间。
问题规模与函数调用影响空间复杂度。
https://blog.csdn.net/qq_15237565/article/details/77885311
3.sizeof与typedef
sizeof 运算符 返回数据类型 变量 所占内存字节数
sizeof(变量) sizeof 变量; sizeof(类型)
typedef 给已存在的数据类型起别名
typedef unsigned int u32;
typedef struct _PERSON {
char name[64];
int age;
} Person;