MIT算法导论——第一讲.Analysis of algorithm

     学习笔记和心得来自网易MIT公开课算法导论Introduction to Algorithms中Charles E.Leiserson和Erik Demaine老师的讲解,以及网上一些大牛的博客。

    参考一:网易MIT公开课算法导论
    参考二:插入排序
    参考三:算法的时间复杂度和空间复杂度-总结
    参考四:MIT算法导论——第一讲.Analysis of algorithm

一、基本概念

1.算法分析:关于计算机程序在效率和资源利用方面的理论研究,总之算法是一门关于性能的科学。

2.计算机进入用户友好时代即“用户体验”。

3.性能与用户体验的关系:性能是确保用户体验的前提。

二、算法古老问题:排序

1.伪代码

(1)目的:是使被描述的算法可以容易地以任何一种编程语言实现,可以将整个算法运行过程的结构用接近自然语言的形式描述出来。

(2)缩进:表示每一条语句的结束,用来代替分隔符。有的语言也用来表示嵌套。

2.运行时间(Running Time)

(1)输入本身。对于插入排序算法来说,一个已经排好序的序列更容易排序;

(2)输入规模。很显然,短的序列要比长序列更容易排序;

(3)运行时间上界(upper bonds):运行时间不超过某个特定量(用户承诺),往往是那些最坏的情况。

2.几种分析运行时间的方法(kinds of analysis)

(1)Worst-case:(usually) —— 用T(n)来表示算法在输入规模为n时且输入情况最差的最大运行时间。即表示算法在最坏的情况下的运行时间也不会超过T(n)。

(2)Average-case:(sometimes)—— 前提是假设输入的统计概率分布(Need assumption of statistics distribution)每种输入情况的运行时间*每种输入情况的出现概率的和(加权平均),它所有的排列方式出现的概率是相等的。

(3)Best-case:(bogus)——而如果你想骗人,用一组极好的数据在一个效率极低的算法上跑,我们称之为算法的运行时间的最好情况,这是不够说服人的。

3.Big Idea(Huge Idea)——渐近分析(asymptotic analysis)

(1)渐近符号(asymptotic notation):Θ;

(2)算法复杂度符号(Landau notation):O;算法复杂度时一般只用到大O符号,Landau符号体系中的小o符号、Θ符号等等比较不常用。

(3)渐近分析的思想:

a.忽略掉那些依赖机器的常量。

b.不检查实际的运行时间,而关注运行时间的增长(随着运行时间的增长,高速算法必将打败(beats)低速算法),无论在什么计算机平台,即便是relative speed(同一平台),或absolute speed(不同平台)

(4)公式中的渐近分析:

a.取其低阶项。

b.忽略常数因子

c.As n→∞ EX:O(2n^2+n+1)=Θ(2n^2+n+1)=O(n^2)=Θ(n^2)

(4)渐近分析中:Θ(1)、O(1);的疑问?

a. Temp=i; i=j; j=temp;

b.以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关(不影响问题规模)的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)=Θ(1)

c.注意:如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)

4.插入排序(Insertion sort)

(1)插入排序的思想就是,对于每一个A[i],考虑A[1…i-1]中它的合适的插入位置k,然后将A[k…i-1]依次后移一个位置,把A[i]插入到A[k]的位置即可

MIT算法导论——第一讲.Analysis of algorithm_第1张图片

(2)插入排序的渐近分析(Insertion sort analysis),如下图所示:下面一系列分析过程说明了插入排序的渐近时间复杂度是n^2级别。

MIT算法导论——第一讲.Analysis of algorithm_第2张图片

(3)对插入排序渐近分析的个人理解

a.由插入排序的第一幅图可知:插入排序的内部操作最坏情况为j-1次=Θ(j)。

b.这里写图片描述As 2→n,T(n)=Θ(2)+Θ(3)+……Θ(n) 是算术级数(arithmetic series)(也叫等差级数)。根据等差的求和公式这里写图片描述 T(n)=Θ(n*(n+2)/2)=Θ(n^2)。

4.归并排序(merge sort)

举个例子,归并排序递归处理的两个表已经有序了,为{2, 7, 13, 20}和{1, 9, 11, 12}。

我们如何合并这两个表呢?这两个表已经是有序的了,我们要找出当前表中剩下的最小元素,这个最小元素一定是在表1的头部或表2的头部,然后取出来,放入总的表中,此时我们取出了1这个元素。那么表2中还剩下3个元素,然后再接着比较表1和表2,找出最小的元素,为2,这样我们依次找下去,便可以将两个有序表合并成一个有序表。如下图所示:

MIT算法导论——第一讲.Analysis of algorithm_第3张图片

(2)下图是归并排序的伪代码以及算法渐近分析:

MIT算法导论——第一讲.Analysis of algorithm_第4张图片

(3)下面我们用递归树的方法来分析这个算法的运行时间,首先写出运行时间的递归表达式:如果我们考虑n>1的情况,T(n) = 2T(n/2) + Cn,其中C为一个常数。画成递归树的形式如下图所示:

MIT算法导论——第一讲.Analysis of algorithm_第5张图片

(4)对归并排序渐近分析的个人理解

a.2T(n/2)是两组已排好序数组的最大运行时间,老师说第二讲会讲。

b.树高、层、行的计算:h=lgn;

    lg在一些学科中可以表示以2、10、e等等为底的对数。

    通过观察递归树图三可知:

    ①Cn的除数以指数级数增长:2^0,2^1,2^2,2^3……。指数项x以算术级数(等差级数)增长:

    0,1,2,3……。可写为指数方程:y=2^x (x>=0)。(当递归值n为最大值时Cn/2^x=Θ(1),此时Cn=2^x)

    ②层数(树高)h以算数级增长:1,2,3,4……。可写为线性方程:y=x (x>=1)。

    ③层数(树高)h和指数项x的关系:树高=指数项+1。(因为x的起始值不同)

    ④根据①②③可知Cn=2^(x)时,树高h达到最大,用指数项对数表达:lg(cn)=x=h(x>=1)

    ⑤通过对层数x(x>=1)和除数2^(x)=y观察,指数y=2^(x)和对数lg(cn)=x,关于y=x对称,且互为反函数

MIT算法导论——第一讲.Analysis of algorithm_第6张图片

c.叶子节点个数总和为(leaves):2^(lgn)=n,叶子节点个数为指数级数,指数项为树高h=lgn,底为2。原因:归并排序每次比较(节点)有2种可能(2各分叉)

d.归并排序分治法基本思想。总时间=分解时间+解决问题时间+合并时间。分解时间就是把一个待排序序列分解成两序列,时间为一常数,时间复杂度o(1).解决问题时间是两个递归式,把一个规模为n的问题分成两个规模分别为n/2的子问题,时间为2T(n/2).合并时间复杂度为o(n)。总时间T(n)=2T(n/2)+o(n).这个递归式可以用递归树来解,其解是o(nlogn).此外在最坏、最佳、平均情况下归并排序时间复杂度均为o(nlogn).从合并过程中可以看出合并排序稳定。

你可能感兴趣的:(algorithm)