20172327 2018-2019-1 《程序设计与数据结构》第一周学习总结

时间:2021-05-15 10:27:55

20172327 2018-2019-1 《程序设计与数据结构》第一周学习总结

教材学习内容总结

第一章 概述

软件质量


1.软件工程(Software Engineering):一门关于高质量软件的技术和理论的学科。

2.软件工程的目标:

  • 解决正确性问题
  • 按时且在预算之内给出解决方案
  • 给出高质量的解决方案。
  • 以合情合理的方式完成上面的事情


3.软件质量特征

质量特侦 描述
正确性 软件在多大程度上满足其特征需求
可靠性 软件故障发生的频率和危险程度
健壮性 出错情况下可以得到恰当处理的程度
可用性 用户学习和执行任务的难易程度
可维护性 对软件进行修改的难易程度
可重用性 软件组件可重用于其他软件系统的开发的难易程度
可移植性 软件组件可以在多个计算机环境下使用的难易程度
运行效率 在不浪费的情况下软件完成其目标的程度


4.运行效率:

  • 软件必须高效地使用诸如CPU时间和储存器之类的资源。
  • 软件系统应该有效地利用分配给它们的资源如内存和CPU时间。


5.质量问题:

  • 必须优先考虑质量特征,并尽最大努力实现。
  • 某些特征彼此之间有时是互斥的,我们必须认真地把某一特定项目的相关问题排列出一个优先次序,然后在这些范围内,尽可能地最大限度地满足所有质量特征。

数据结构


1.程序=数据结构+算法

2.软件=程序+软件算法

3.数据结构:计算机储存、组织数据的方式。

第二章 算法分析

算法效率分析


1.软件质量的分析特征是资源的使用效率。CPU的使用时间是最重要的资源之一。

2.算法分析是计算机科学的一个基础,并涉及多种技术和概念。

增长函数与大O记法


1.算法的效率可以根据该问题的大小和处理步奏数来定义。

2.增长函数表示与该问题大小相对应的时间或空间的使用。

3.增长函数(growth function)表示问题(n)大小与我们希望最优化的值之间的关系。该函数表示了该算法的时间复杂度(time complexity)或空间复杂度(space complexity)。

3.渐进复杂度称为算法的阶次(order)。

4.O()记法称为大O记法。

5.算法的阶次是忽略该算法的增长函数中的常量和其他次要项,只保留主项而得出的。

6.不管问题是大是小,运行赋值语句和if语句一次,其复杂度就为O(1)。

7.循环语句和方法调运语句可能会导致更高阶次的增长函数。

8.增长函数及其渐进复杂度
20172327 2018-2019-1 《程序设计与数据结构》第一周学习总结


9.算法的阶次为增长函数提供了一个上界。

10.所有具有相同阶次的算法,从运行效率的角度来说都认为是等价的。

增长函数的比较


1.处理器速度和储存器并不能弥补算法效率的差异。

2.如果算法的效率底,那么从长远来说,使用更快的处理器也无济于事。

3.在n很小时算法差别很小,但是当n很大时,增长函数之间的差别就很明显。
20172327 2018-2019-1 《程序设计与数据结构》第一周学习总结

20172327 2018-2019-1 《程序设计与数据结构》第一周学习总结

时间复杂度计算


循环运行的复杂度分析

1.要分析循环运行,首先要确定该循环体的阶次n,然后用该循环要运行的次数乘以它。

2.要分析算法的复杂度,通常需要分析循环的运行。

3.循环的时间复杂度等于循环的复杂度乘以该循环的次数。

嵌套循环的复杂度度分析

1.循环出现嵌套时,计算其复杂度需要考虑内层循环和外层循环的复杂度,需要用内层循环的复杂度乘以外层循环的复杂度。

方法调运的复杂度分析

1.循环体可能包含方法的调用

2.要确定循环体的阶,需要考虑调运方法的阶。
20172327 2018-2019-1 《程序设计与数据结构》第一周学习总结

教材学习中的问题和解决过程

  • 问题1:请问O(k^2*n^k/k!) 渐进性到O(n^k)的推导,是否是先取对数变为多项式log(k^2) + log(n^k) - log(k!),然后舍去log(k^2)和-log(k!)得出?
    20172327 2018-2019-1 《程序设计与数据结构》第一周学习总结

  • 分析:这个问题其实是用穷举法求解独立集问题。
    首先有C(n,k)种方法求图的k个点的方法数
    然后对于这k个点,有O(k^2)种方法判断是否右边关联
    所以根据乘法规则
    T(n)=O(k^2C(n,k))
    这里C(n,k)<=n^k/k!
    带入之后
    T(n)=O(k^2
    n^k/k!)
    由于k^2和k!相对n^k来说是低阶项,所以
    T(n)=O(n^k)

教材布置习题解答

  • EX2.1 下列增长函数的阶次是多少?

    a. 10n^2+100n+1000

    b. 10n^3-7

    c. 2^n+100n^3

    d. n^2*logn
解答:
a.平方型:因为渐进复杂度称为算法的阶次,因此该增长函数的阶次为:O(n^2)。
b.立方型:因为n^3增长速度快,因此该增长函数的阶次为:O(n^3)。
c.指数型:因为2^n增长速度比n^3要快,因此该增长函数的阶次为:O(2^n)。
d.复合型:因为是乘法,因此该增长函数的阶次为:O(n^2*log⁡)。
  • EX2.4 请确定下面代码段的增长函数和阶次:

    for(int count = 0 ; count < n ; count++)

    for(int count2 = 0 ; count2 < n ; count2 = count2 + 2)

    {

    System.out.println(count,count2);

    }

    }
解答:这个是嵌套循环,内层循环的循环次数是n/2,外层循环的循环次数是n,所以增长函数为:F(n)=(n^2)/2
      又因为阶数与增长函数的最高阶项有关,所以忽略次项与常数项。所以阶次为O(n^2)。
  • EX2.5 请确定下面代码段的增长函数和阶次:

    for(int count = 0 ; count < n ; count++)

    for(int count2 = 0 ; count2 < n ; count2 = count2 * 2)

    {

    System.out.println(count,count2);

    }

    }
解答:这个是嵌套循环,内层循环的循环次数是log2(n),外层循环的循环次数是n,所以增长函数为:F(n)=n·log2(n)
      又因为阶数与增长函数的最高阶项有关,所以忽略次项与常数项。所以阶次为O(n·log2(n))。

代码托管

本周不存在所要托管的代码

结对及互评

暂无

其他(感悟、思考等,可选)

概念很多,嘚仔细看,有很多细节,上课刚开始听突然有点懑,但是课后仔细将书读了一遍之后,发现并不难。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 8/8

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:10小时

  • 实际学习时间:8小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料