COMP352_01 算法分析

image
COMP352 Data Structures and Algorithms[数据结构与算法]是计算机专业的一门核心课程,3学分,前置课程为COMP232和COMP249。

本门课程讲授了一些基本的数据结构,如:栈,队列,链表,哈希表,对,二叉树,AVL树,图等。难度比国内大学简单得多。本专栏旨在对课程内容进行梳理与回顾。

如何评估效率?

方法的正确性仅仅取决于算法是否执行它应该做的事情。显然,效率不同于正确性。

效率可以用多种方式衡量,如:

  • 内存利用率更低
  • 更快的执行时间
  • 更快地释放分配的资源等

如何衡量效率?

  • 测量应独立于使用的软件(编译器/语言等)和硬件(CPU速度/内存大小等)
  • 特别地,在程序运行时运行时分析可能有严重的弱点

实验研究

1) 编写一个实现该算法的程序;
2) 将不同数量的数据输入运行程序;
3) 使用类似System.currentTimeMills()的方法准确测量实际运行情况时间;
4) 将结果描点作图进行分析。
image.png

实验的局限性

1) 有必要实现该算法,这可能困难/昂贵;
2) 结果可能不表示实验中未包含的其他输入上的运行时间;
3) 为了比较两种算法,必须使用相同的硬件和软件环境;
4) 在一些多道程序设计环境中,例如Windows,很难确定一个任务需要多长时间。

如何评估效率?

效率在很大程度上取决于方法被如何定义。而对方法定义的的抽象分析是一种可以直接执行的研究一种,因此成为首选。

忽略各种限制,如:

  • CPU速度
  • 内存限制;例如,允许int变量取任何允许的整数值,并允许数组取任意长度等。

因为现在的方法与特定的计算机环境无关,我们称之为算法

估计运行时间

如何根据算法的定义估计其运行/执行时间?

我们可以考虑在算法中执行的语句数作为运行时间的度量。这个度量可以表示为问题规模的函数。算法的运行时间通常随着问题规模的增大而增大。

我们一般关注最坏的情况,这对游戏、金融、机器人技术等应用程序至关重要。

给出一个规模为n的,找出worstTime(n),它是一次执行中执行语句的最大数目。我们要考虑所有可能的参数/输入值。
image.png

例 - 1:假设有一个数组a[0 ... n],考虑以下程序:

for (int i= 0; ia[i +1])
        System.out.println (i);

worstTime(n)是多少?

image.png
所以,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

image.png

你可能感兴趣的:(java)