1 什么是数据结构?为什么他们总是连在一起出现?
数据结构: 计算机中储存和组织数据的一种特点给机制,他将使得数据处理更加有效一个数据结构就是一种组织和存储数据的特定形式,数据结构可以带来更高的运行或者存储效率。
(2)什么是算法?
算法:他就是一要解决一系列问题写出的代码可以从空间复杂度和时间复杂度来判断算法的优略
(3)为什么他们总连接在一起
数据结构往往同高效的检索算法和索引技术有关。
2 如果学习数据结构与算法一定要学习算法复杂分析,这是可以自己最好最直接判断当前算法的优劣的方法。使用不通过的算法虽然都可以解决问题但是解决的效率占用的空间,速度有很大的不同。
(1)下面介绍算法复杂度分析方大O方法:例子
大O方法法代表的不是代码执行的真正的的执行时间,而是代表的的代码执行时间随着数据规模增长的变化趋势。
大O方法包括三个部分
1 执行常量次的代码 为O(1)
2 在大O方法中低阶,系数都是可以忽略的因为系数和低阶的并不呢个改变他的大致增长趋势。
3 记得一个最大量级 以上都是与循环次数有关的系数…如循环n次 n的系数,指数…。
例1:
int number{
int sum = 0;
For(int i = 0; i < n; i++){
sum = sum + i
}
Return sum;
}
根据大O表示法 O(n) = n;因为大O代表的增长趋势
例子2:
int my_cal(){
int a = 0;
int b = 0;
for(int i = 0; i<n; i++){
a = a+i;
}
Return a;
}
在列2中1-2行的代码都运行了一次所以O(1)2 第4-5行都运行了n次。
T(n) = O(n)+2O(1) 因为大O表示法系数,常可以忽略不记所以
T(n) = O(n)
下面进入第二中种形式方法的嵌套
例子3:
int my_cal1(){
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j++){
k = k+1;
}
}
}
分析依据 找到执行最多次数的语句第3行,第4行执行了nn次所以
T(n) =O( nn); n的平方
例子4
int my_cal2(){
int num = 0;
for(int i = 0; i < 10; i++){
for(int j = 0; j < n; j++){
num = num + j;
}
}
}
分析依据: 第2行执行了一次,第3,4行分别执行了n次,而第五行执行了nn;
T(n) = O(1)+O(nn); 因为大O表示法常量可以忽略所以
T(n)=O(n*n);
例子5:
int my_cal5(){
int sum = 0;
int sum2 = 0;
int sum 3 = 0
for(int i = 0; i < 5; i++){
sum = sum + i;
}
for(int j = 0; j < n; j++){
sum1 = sum1 +j;
}
for(int a = 0; a < n;a++){
for(int j =0; j < n; j++){
sum2 = sum2 + a;
}
}
}
这种方式的可以使用加法法则: 第一个for循环是常量级的执行次数所以为O(1)第二个for执行了n次O(n),第三个for循环执行了最多次为nn所以O(nn);
T(n1)=O(1);
T(n2)=O(n);
T(n3)=O(nn);
T(n) =T(n1)+T(n2)+T(n3);
常量级,我们只需要取得最大量级所以T(n)=T(n3)=O(nn);
在嵌套方法中使用乘法与加法类似
例子6:
Int my_cal6(){
Int sum1 = 0;
Int sum2 = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < 2/n; j++){
sum1 = sum1+j;
}
}
for(int a = 0; a < n; a++){
for(int j = 0; j < 5; j++){
Sum2 = sum2 + j;
}
}
}
分析: 第4行执行n次,第5,6行执行了nn次,第9行执行了n次,第10行执行了5次忽略不记。
T(n)= O(nn)+O(n);
根据大O表示法的规则取最大阶级:T(n) = O(n*n);
下面我们来看含有判断语句的算法
例子7
If(length == 0){ 常数
return false; 常数
}else{ (常数+常数)*n
For(int n = 0; n < length(); n++){
If(!list[n].equals(otherList[n])){
Return false;
}
}
}
PS:这里我理解的为什么为n因为此时n可以为任意数,它决定着执行的次数这时的length()是一个固定的数字
T(n) = O(1)+O(n) = O(n)
对数级时间复杂度:如果算法可以在常数时间吧问题解决的规模按照某分数(一般是二分之一分解),那么该算法的复杂度为O(log n)。
例子8: for(int i = 0; i <= n;){
i = i*2;
}
T(n) =O(log2)
分析: 没次循环i都是倍增的,起始为1,2,4,8,16 所以是一个以2为低的指数函数假设执行k次后等于n。
那么执行的次数为:logn
T(n) = O(logn)
下一篇是 分治法主定理
问题规模减小和递归求解主定理
问题规模减小和递归求解主定理的变型
平摊分析