王彪20162321 2017-2018程序设计与数据结构-第二学期-第一周学习总结

第十二章-算法分析

1.1基础总结

  • 算法分析是计算机科学的基础课题。
  • 增长函数显示了与问题大小相关的时间或空间利用率。
  • 算法的阶有算法增长函数的主项决定。
  • 算法的阶给出乐算法增长函数的上界。
  • 更快的处理器不能弥补当问题的大小增长时算法的的效率。
  • 分析算大的复杂度时经常需要分析循环的执行情况。
  • 嵌套循环的分析必须要考虑内层和外层循环的执行情况。

1.2到底啥子是算法?

  1. 简单来说,算法就是一系列被控制的步骤,你通过按序执行这些步骤可以实现一些目标或者产生一些输出。
  2. 就好比在Windows上打开一个软件的方法步骤(这应该可以算作一个算法吧...)
puclic void 开软件1(){
    "
    1.找到桌面快捷方式
    2.双击鼠标左键
    "
}
public void 开软件2(){
    "
    1.打开我的电脑
    2.在电脑硬盘中找到安装目录
    3.在安装路径中找的软件的主程序模块
    4.单击鼠标右键
    5.在弹出的菜单中选择"打开"
    
    "
  
}

3.就犹如你可以有很多种打开一个软件的方式一样,你可以用多种不同的算法来解决同一个问题。打开方式的麻烦程度就好比解决这问题的效率。有的解决办法效率更高,比其他方法需要更少的时间和空间。问题是如何分析那个算法效率高。

2.1算法分析

  • 算法是解决问题的方法,一个问题可以有多种解决方法,不同的算法之间就有了优劣之分。如何对算法进行比较呢?算法可以比较的方面很多,如易读性、健壮性、可扩展性等,但不是最关键的方面,算法的核心和灵魂是效率,也就是解决问题的速度。试想,一个需要运行很多年才能给出正确结果的算法,就是其他方面的性能再好,也是一个不实用的算法。(引用网络)

## 2.2时间复杂度

- 算法的时间复杂度被设计来评价其语句执行次数。但它又不是语句执行次数,而是次数的同数量级函数。

- 一个算法执行所耗费的时间,从理论上是不能算出来的,一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。

- 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。时间频度不同,但时间复杂度可能相同。如:T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。(引用网络)

- ### 大O符号
   O(g(n))={ f(n): 存在正常数c和n0,使所有n>n0,有0≦f(n)≦c*g(n)} 
   上面的定义说明了O(g(n))是一个函数集合,集合里面的函数满足g(n)的常数倍是函数f(n)的一个上界,即f(n)有上界。
   
- ### Ω记号
   Ω(g(n))={ f(n):存在正常数c和n0,使所有n>n0,有0≦ c*g(n)≦f(n)} 
   上面的定义说明集合里面的函数满足g(n)的常数倍是函数f(n)的一个下界,即f(n)有下界。

- ### Θ记号
   Θ(g(n)),当且仅的,f(n)属于O(g(n))和Ω(g(n))。 
   可见Θ是更强的形式。Θ蕴含大O和Ω。

# 第十二章-算法分析

## 1.1基础总结

> - 算法分析是计算机科学的基础课题。
> - 增长函数显示了与问题大小相关的时间或空间利用率。
> - 算法的阶有算法增长函数的主项决定。
> - 算法的阶给出乐算法增长函数的上界。
> - 更快的处理器不能弥补当问题的大小增长时算法的的效率。
> - 分析算大的复杂度时经常需要分析循环的执行情况。
> - 嵌套循环的分析必须要考虑内层和外层循环的执行情况。

## 1.2到底啥子是算法

> 1. 简单来说,算法就是一系列被控制的步骤,你通过按序执行这些步骤可以实现一些目标或者产生一些输出。
> 2. 就好比在Windows上打开一个软件的方法步骤(这应该可以算作一个算发吧...)

puclic void 开软件1(){
"
1.找到桌面快捷方式
2.双击鼠标左键
"
}
public void 开软件2(){
"
1.打开我的电脑
2.在电脑硬盘中找到安装目录
3.在安装路径中找的软件的主程序模块
4.单击鼠标右键
5.在弹出的菜单中选择"打开"

"

}
```

3.就犹如你可以有很多种打开一个软件的方式一样,你可以用多种不同的算法来解决同一个问题。打开方式的麻烦程度就好比解决这问题的效率。有的解决办法效率更高,比其他方法需要更少的时间和空间。问题是如何分析那个算法效率高。

2.1算法分析

  • 算法是解决问题的方法,一个问题可以有多种解决方法,不同的算法之间就有了优劣之分。如何对算法进行比较呢?算法可以比较的方面很多,如易读性、健壮性、可扩展性等,但不是最关键的方面,算法的核心和灵魂是效率,也就是解决问题的速度。试想,一个需要运行很多年才能给出正确结果的算法,就是其他方面的性能再好,也是一个不实用的算法。

## 2.2时间复杂度

- 算法的时间复杂度被设计来评价其语句执行次数。但它又不是语句执行次数,而是次数的同数量级函数。

- 一个算法执行所耗费的时间,从理论上是不能算出来的,一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。

- 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。时间频度不同,但时间复杂度可能相同。如:T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

- ### 大O符号
   O(g(n))={ f(n): 存在正常数c和n0,使所有n>n0,有0≦f(n)≦c*g(n)} 
   上面的定义说明了O(g(n))是一个函数集合,集合里面的函数满足g(n)的常数倍是函数f(n)的一个上界,即f(n)有上界。
   
- ### Ω记号
   Ω(g(n))={ f(n):存在正常数c和n0,使所有n>n0,有0≦ c*g(n)≦f(n)} 
   上面的定义说明集合里面的函数满足g(n)的常数倍是函数f(n)的一个下界,即f(n)有下界。

- ### Θ记号
   Θ(g(n)),当且仅的,f(n)属于O(g(n))和Ω(g(n))。 
   可见Θ是更强的形式。Θ蕴含大O和Ω。

![](http://images2017.cnblogs.com/blog/1065456/201709/1065456-20170910231909772-54901087.jpg)


   
## 3.1课本习题

for(int count=0;count<n;count++){
for(int count2=0;count2 <n ; count2=count2+2){
System.out.println(count,count2);
}
}

public class lxr {
public static void main(String[] args) {
int n = 8;
int count=0;
int count2=0;
for (count=0; count < n; count++) {
for ( count2=0; count2 < n; count2=count2+2)
{
System.out.println(count+","+count2);
}
}
System.out.println(count==n);
int num=n%2;
if (num==1){
System.out.println(count2==n+1);
System.out.println("ji");
}
else {
System.out.println(count2==n);
System.out.println("ou");
}
// count = f(n)= n;

    //  count2 = g(n) =  { n 为奇数,g(n) = n+1; n为偶数,g(n) = n}

    //  so O(n)


}

}



    
## 3.1书本习题
for(int count=0;count<n;count++){
for(int count2=0;count2 <n ; count2=count2+2){
    System.out.println(count,count2);
}
}

public class lxr {
public static void main(String[] args) {
int n = 8;
int count=0;
int count2=0;
for (count=0; count < n; count++) {
for ( count2=0; count2 < n; count2=count2+2)
{
System.out.println(count+","+count2);
}
}
System.out.println(count==n);
int num=n%2;
if (num==1){
System.out.println(count2==n+1);
System.out.println("ji");
}
else {
System.out.println(count2==n);
System.out.println("ou");
}
// count = f(n)= n;

    //  count2 = g(n) =  { n 为奇数,g(n) = n+1; n为偶数,g(n) = n}

    //  so O(n)


}

}

```

3.2结对对象

  • 我的结对对象 20162320刘先润

  • 新学期都加油吧,大二了,你的才华撑不下你的野心的时候静下来读书吧!

  • 这章的学习看似很简单但实际是基础。从网上找到很多关于算法的帖子,博客里也有不少引用,但真正对算法的分析与比较还需要大量的练习。这里有一部分习题,接下来一段时间将会不断练习。但好像有点看不懂啊.......

  • 代码托管

4.1网络学习材料链接

转载于:https://www.cnblogs.com/wbiao21/p/7500995.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值