家族成员1-数据结构
数据结构是指相互之间存在的一种或多种特定关系的数据元素集合。
数据类型按结构特征划分:
- 集合结构:数据元素之间没有任何关系,统一放在被称为“集合”的容器中。
- 线性结构:数据元素之间的关系是一对一的且是一种先后的次序。
- 树形结构:数据元素之间的关系是一对多。
- 图结构:数据元素关系是多对多。
家族成员2-算法
五大特性:
- 有穷性:经过一定的循环之后可以自行结束。
- 确定性:相同的输入只能有一个唯一的输出结果。
- 可行性:指算法的每一步都必须可行。
- 输入:有零-多个输入参数。
- 输出:至少有一个输出。
关系
数据结构是有限的,只有寥寥数种,而算法则是琳琅满目的。数据结构就仿佛一个苹果,算法则是你选择吃苹果的方式。
时间复杂度
function sum(n) {
let total = 0;
for(let i = 0;i < n;i ++){
total += i;
}
return total;
}
上面是一个累加求和的方法,假设每条语句执行的时间为time,这个方法对于n来说执行的使时间是多少?
解析:
- 第2行执行一次,时间为time;
- 第3,4行执行n次,时间为timen2;
- 第6行执行一次,时间为time;
- 总的执行时间为 time+ time+ timen2;
- 使用f(n)表示代码的执行次数和数据规模的关系,即:f(n) = 2n+2;
- 当n无穷大时,f(n) = n,使用大O表示法得O(n)
空间复杂度-运行占地面积
- 定义:空间复杂度是对一个算法在运行过程中零时占用存储空间大小的度量,记作S(n) = O(f(n))
- 固定部分:代码占用的空间,定义的变量所占据的空间。
- 可变部分:动态分配的空间,递归栈所需的空间。
- 示例:
function factorial (num) {
if(num <= 0) {
return 1;
} else {
return num*factorial(num-1);
}
}
分析:
固定部分:factorial此函数所占据的空间大小。
可变部分:输入输出数据所占用的空间(num)、函数运行期间为每个递归分配的空间,即调用栈。
空间复杂度可理解为:函数空间 + num空间 + 调用栈空间。