第一章 概述
1.1软件质量:
高质量软件的几个特征:
javascript
第二章 算法分析
2.1算法效率分析
算法效率一般用CPU使用时间来表示
算法分析是从效率的角度对算法进行分析
算法分析是计算机科学的基础
2.2增加函数与大O记法
增加函数:表示问题(n)大小与咱们但愿最优化的值之间的关系该函数表示了该算法的时间复杂度(CPU的使用时间)和空间复杂度(内存空间)
算法的渐进复杂度(随着n增加时增加函数的通常性质)
主要关注函数的主项(即增加速度最快的的那一项)
渐进复杂度称为算法的阶次
增加函数的项之间的比较php
盘子的数量 | 15n² | 15n | 15n²+45n |
---|---|---|---|
1 | 15 | 45 | 60 |
2 | 60 | 90 | 150 |
5 | 375 | 225 | 600 |
10 | 1500 | 450 | 1950 |
100 | 150 000 | 4500 | 154500 |
1000 | 15 000 000 | 45000 | 15045000 |
10 000 | 1 500 000 000 000 | 450 000 | 1 5000 450 000 |
100 000 | 150 000 000 000 | 4 500 000 | 150 004 500 000 |
1 000 000 | 15 000 000 000 000 | 15 000 000 | 15 000 045 000 000 |
10 000 000 | 1 500 000 000 000 000 | 450 000 000 | 1 500 000 450 000 000 |
一些增加函数及其渐进复杂度html
增加函数 | 阶次 | 标记 |
---|---|---|
t(n)=17 | O(1) | 常量型 |
t(n)=3log n | O(log n) | 对数型 |
t(n)=20n-4 | O(n) | 线性 |
t(n)=12n log n+100n | O(n log n) | n log n |
t(n)=3n²+5n-2 | O(n²) | 平方型 |
t(n)= 8n^3+3n² | O(n^3) | 立方型 |
t(n)=2^n+18n²+3n | O(2^n) | O(2^n) |
若是两个算法完成相同任务具备不一样的增加函数,好比都是O(n²),那么从运行效率上来讲,二者大致上是相等的。java
2.3增加函数的比较
2.4 时间复杂度分析c++
2.4.1 循环运行的复杂度分析
要肯定某个算法的阶次,经常须要肯定某个特定语句或某个语句集运行的次数。要肯定该循环的阶数n,而后要运行的次数乘以它。程序员
count = 1 while (count <n) { count *=2 /*复杂度为O(1)的步骤系列*/ }
2.4.2 嵌套循环的复杂度分析
用内层循环的复杂度乘之外层循环的复杂度。例如,下面嵌套循环web
for(int count =0; count<n; count++) { for(int count2 = 0: count2 < n; count2++:) { /*复杂度为O(1)的步骤系列*/ } }
其复杂程度为O(n²),内层循环体的复杂度为O(1),而且该内层循环将运行n次。这意味着内层循环的复杂度为O(n).算法
2.4.3 方法调用的复杂度分析
要肯定循环体的阶要先肯定调用方法的阶编程
问题一:为何java拥有良好的可移植性
1.java做为一种编程语言:源代码可移植性
做为一种编程语言java提供了一种最简单同时也是人们最熟悉的的可移植性--源代码可移植。这就意味着任何一个java程序,不论它运行在何种cpu、操做系统或者java编译器器上都产生同样的结果。这是否是一个新概念,人们使用c或者c++也产生一样的效果,可是使用c或者c++的人们有太多的选择,在许多细节上它都没有严格的定义。这样就致使了同一段程序在不一样的环境下会产生不一样意外的结果。而java就不一样了,因为严密的语义结构,而使编译器不承担这一职责。数据结构
2.java做为一个虚拟机:cpu可移植性
大多数编译器产生的目标代码只能运行在一种cpu(如Intel的x86系列),即便那种支持多种编译器的目标代码,也不能产生适合多种cpu的目标代码。 而java不同,java编译器产生的目标代码针对的是一种并不存在的cpu--java虚拟机,而不是一种具体的cpu。java虚拟机能掩盖不一样cpu之间的差异,从而使java-code运行在安装有虚拟机的机器上。
3.java做为一种虚拟的操做系统和图形用户界面:操做系统的可移植。
即便通过从新编译,大多数的用C和C++编写的Windows程序也不能在Unix或Macintosh系统上运行。这是为何呢?由于程序员在编写Windows程序时使用了大量的WindowsAPI和中断调用,而Windows程序对系统功能的调用与Unix和Macintosh程序有很大的差异,因此除非将全套WindowsAPI移植到其它操做系统上,不然重编译的程序仍不能运行。
JAVA采用了提供一套与平台无关的库函数(包括AWT、UTIL、LANG等等)的方法来解决这个问题。就象JVM提供了一个虚拟的CPU同样,JAVA库函数提供了一个虚拟的GUI环境。
练习题
EX2.1 下列增加函数的阶次是多少
a.10n² + 100n + 1000
解答:易知最高次项为10n²故阶次表示为O(n²)
b.10n^3 - 7
解答:易知最高次项为n^3故阶次表示为O(n^3)
c.2^n + 100n^3
解答:易知最高次项为2^n因此阶次表示为O(2^n)
d.n²logn
解答:易知阶次为O(n²logn)
EX2.4
请肯定下面代码段的增加函数和阶次
for (int count = 0: count < n: count ++) for (int count = 0;count2 < n; count2 < n: count2 = count2 +2) { System.out.println(count, count2); } }
解答:由于内循环进行的次数是n/2,外循环进行的次数是n,故增加函数f(n)=n²/2,阶次为O(n)= n²。
EX2.5
请肯定下面代码段的增加函数和阶次
for (int count = 0: count < n: count ++) for (int count = 1;count2 < n; count2 < n: count2 = count2 * 2) { System.out.println(count, count2); } }
解答:由于内循环进行的次数是log 2 n(以二为底n的对数),外循环进行的次数是n次,故增加函数为f(n)= nlog 2 n,阶次为O(n)= nlog 2 n。
20172301 郭恺
博客中的问题和值得学习的地方:
郭恺同窗的博客中体现了本身的思考,对不少问题进行了解答。充分体现了其认真的态度以及严谨的学习做风。
20172328 李馨雨
博客中的问题和值得学习的地方。李馨雨同窗充分的归纳了教材的知识,整个界面简洁大方而不散乱,布局层次分明。各个环节设计充分。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 30/30 | 1/1 | 10/10 |
新学期又开始了又见到了阔别已久的同窗,又有了新的助教,感受这又会是一个不平凡的新学期,又是一个在未知的道路上探索的过程,又要去体会无知---抓狂----懵懂------抓狂--------懵懂的过程但愿在新的学期能更好地提高本身。