目录
一、绪论
考点主要集中于T(n)和S(n)的计算
1.数据结构
2.算法
(1)T(n)
描述算法规模的大小
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(2^n)<(n!)<(n^n)
(2)S(n)
描述算法所需辅助空间大小
(3)主要求解步骤
step1:找主要的代码
step2:分析执行次数
(4)eg
1)while循环
int fun(int n){
int x = 1;
while(x < n){
x*=2;
}
}
step1:主要代码为while循环
step2:设执行次数为k,执行k次后:x * 2^k > n时截至
-> k = log2n +1 -> O(logn)
2)递归
int fun(int n){
if(n<=1) return 1;
return n * fun(n-1);
}
step1:主要代码为return n * fun(n-1) 递归
step2:设执行次数为k,执行k次后 n - k <=1
k = n -> O(n)
3)规模理解
int fun(int n){
int sum = 0;
for (int i = 1; i < n; i*=2) {
for (int j = 0; j < i; j++) {
sum++;
}
}
}
step1:主要代码为2层for循环
step2:设执行k次
分析:sum是结果,不控制for循环结束;i、j控制,下面i为多少时,j执行多少次
i 1 2 4 8 …… 2^(k-1)
j 1 2 4 8 …… 2^(k-1)
so all_j = 1+2+4+……+2^(k-1) = 2^k -1 < n
根据T(n)定义,此时2^k-1为问题规模,而不是k,因为k为次数,但是all_k为整体的问题规模
so -> O(n)
二、线性表
1.定义(informal)
同类型的有限个有序的线性集合
2.基本操作
创建销毁,判空、判长、打印输出
attn:①函数的命名,大驼峰②&使用场景:当在函数修改了值,要带回main()
3.顺序表
(1)存储结构
逻辑上相邻物理位置上也相邻
(2)实现方法
1)静态分配
2)动态分配
(3)特点
1)随机访问
直接取下边 O(1)
2)存储密度高
一个挨着一个
3)拓展容器不方便
得拷贝原小表到新的大表中 O(n)
4)插入、删除元素不方便
得移动前面or后面的其他元素 O(n)
(4)基本操作
a)插入
b)删除
4.单链表
(1)定义(informal)
自身data+指向下一个结点的pointer
(2)基本操作
见博客: