COMP352 Data Structures and Algorithms[数据结构与算法]是计算机专业的一门核心课程,3学分,前置课程为COMP232和COMP249。
本门课程讲授了一些基本的数据结构,如:栈,队列,链表,哈希表,对,二叉树,AVL树,图等。难度比国内大学简单得多。本专栏旨在对课程内容进行梳理与回顾。
如何评估效率?
方法的正确性仅仅取决于算法是否执行它应该做的事情。显然,效率不同于正确性。
效率可以用多种方式衡量,如:
- 内存利用率更低
- 更快的执行时间
- 更快地释放分配的资源等
如何衡量效率?
- 测量应独立于使用的软件(编译器/语言等)和硬件(CPU速度/内存大小等)
- 特别地,在程序运行时运行时分析可能有严重的弱点
实验研究
1) 编写一个实现该算法的程序;
2) 将不同数量的数据输入运行程序;
3) 使用类似System.currentTimeMills()
的方法准确测量实际运行情况时间;
4) 将结果描点作图进行分析。
实验的局限性
1) 有必要实现该算法,这可能困难/昂贵;
2) 结果可能不表示实验中未包含的其他输入上的运行时间;
3) 为了比较两种算法,必须使用相同的硬件和软件环境;
4) 在一些多道程序设计环境中,例如Windows,很难确定一个任务需要多长时间。
如何评估效率?
效率在很大程度上取决于方法被如何定义。而对方法定义的的抽象分析是一种可以直接执行的研究一种,因此成为首选。
忽略各种限制,如:
- CPU速度
- 内存限制;例如,允许int变量取任何允许的整数值,并允许数组取任意长度等。
因为现在的方法与特定的计算机环境无关,我们称之为算法。
估计运行时间
如何根据算法的定义估计其运行/执行时间?
我们可以考虑在算法中执行的语句数作为运行时间的度量。这个度量可以表示为问题规模的函数。算法的运行时间通常随着问题规模的增大而增大。
我们一般关注最坏的情况,这对游戏、金融、机器人技术等应用程序至关重要。
给出一个规模为n的,找出worstTime(n),它是一次执行中执行语句的最大数目。我们要考虑所有可能的参数/输入值。
例 - 1:假设有一个数组a[0 ... n],考虑以下程序:
for (int i= 0; i<n - 1; i++)
if (a[i] >a[i +1])
System.out.println (i);
worstTime(n)是多少?
所以,worstTime(n)是:4n-2.
伪代码
一种算法的高级描述,比英语散文更有条理,不如程序详细,是描述程序设计问题的算法的首选符号,隐藏程序设计的细节。
例 - 2:找出一个数组的最大元素
Algorithm arrayMax(A, n)
Input array A of n integers
Output maximun element of A
currentMax ← A[0]
for i ← 1 to n-1 do
if A[i]>currentMax then
currentMax ← A[i]
return currentMax
流程控制
if ... then ... [else ...]
while ... do ...
repeat ... until ...
for ... do ...
函数声明
Algorithm method (arg [,arg...]
Input ...
Output ...
函数调用
var.method(arg[,arg...])
返回值
return expression
表达式
← 赋值,相当于java中的 =
= 检测相等,相当于java中的 ==
7个重要的函数
在算法分析中经常出现的7个函数
常数函数 = 1
对数函数 = log n
线性函数 = n
N-Log-N函数 = nlog n
二次函数 = n^2
三次函数 = n^3
指数函数 = 2^n
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。