《算法导论》学习笔记一:课程简介及算法分析

MIT的算法导论公开课,很多年前就看到了,一直没有坚持去看,最近找暑假实习,面试基本都是算法,只好抽时间去狂刷leetcode,也借着这个机会希望把这个视频看完,把算法的基本功打扎实,这个公开课讲得还是挺不错的。

之前学习其他东西的时候,记了很多笔记,最后都丢了,想再翻看的时候已经找不到,于是想到把学习笔记放到博客上,这样方便以后自己查询。

公开课视频地址:http://open.163.com/special/opencourse/algorithms.html

第一节:课程简介及算法分析

第一集视频一半的时间都是给学生讲课程要求和作业情况的,剩下的才讲了点干货,以Insertion Sort和Merge Sort为切入点,讲解算法分析。

Insertion Sort:

Pseudocode

Insertion (A, n) // Sorts A[1, ... , n]
for j ← 2 to n
    do key ← A[j]
        i ← j - 1
        while i > 0 and A[i] > key
            do A[i+1] ← A[i]
            i ← i - 1
        A[i+1] ← key

Example:

8 2 4 9 3 6

2 8 4 9 3 6

2 4 8 9 3 6

2 4 8 9 3 6

2 3 4 8 9 6

2 3 4 6 8 9

Running Time:

  • Depends on input (eg. already sorted or not)
  • Depends on input size (-parameterize in input size)
  • Want upper bounds

Kinds of analysis

Worst-case (usually)

  T(n) = max time on any input of size n

Average-case (sometimes)

  T(n) = expected time over all input of size n

  (Need assumption of statistic distribution)

Best-case (bogus)

  Cheat

What is insertion sort‘s worst time?

  Depends on compater

    ——relative speed (on same machine)

    ——absolute speed (on different machine)

BIG IDEA!   —— asymptotic analysis

  1. Ignore machine-dependent constants
  2. Look at growth of the running time. T(n) as n → ∞

Asymptotic notation

θ - notation    Drop low-order terms and ignore leading constants

Ex. 3n3+90n2-5n+6046 = θ(n3)

As n → ∞, θ(n2) algorithm always beats a θ(n3) algorithm.

Sometimes, n0 may be too big so that a low-speed algorithm would be better.

Insertion Sort Analysis

Worst-case: input reverse sorted

T(n) = =θ(n2)

Is insertion Sort fast?

  • Moderately so, for small n
  • NOT at all for large n

Merge Sort Analysis

Merge sort A[1, ..., n]

1. If n = 1, done.       -------------------------- T(n)

2. Recursively sort      -------------------------- θ(1)

  A[1, ..., n/2] and A[n/2 + 1, ..., n]   ----- 2T(n/2)

3. Merge 2 sorted list              ----------------- θ(n)

Key subroutine: Merge

For example, two sorted list:

2 7 13 20

1 9 11 12

compare 2 and 1, choose 1      [1]
comapre 2 and 9, choose 2      [1, 2]
comapre 7 and 9, choose 7      [1, 2, 7]
comapre 13 and 9, choose 9      [1, 2, 7, 9]
comapre 13 and 11, choose 11      [1, 2, 7, 9, 11]
comapre 13 and 12, choose 12      [1, 2, 7, 9, 11, 12]
put 13 and 20 to the end        [1, 2, 7, 9, 11, 12, 13, 20]

Time = θ(n) on n totoal elements

Recurrence

T(n) = θ(1), if n = 1    (usually omit it)

T(n) = 2T(n/2) + θ(n)

Recursive tree for T(n) = 2T(n/2) + cn

The height of this tree is lgn, the number of leavers is n, the subtotal of each depth is cn, So the total time is (cn)lgn+θ(n)

Omit the constant c and low-order θ(n), T(n) = θ(nlgn).

时间: 2024-11-11 15:38:05

《算法导论》学习笔记一:课程简介及算法分析的相关文章

【算法导论学习笔记】第3章:函数的增长

????原创博客,转载请注明:http://www.cnblogs.com/wuwenyan/ ? 当算法的输入n非常大的时候,对于算法复杂度的分析就显得尤为重要,虽然有时我们能通过一定的方法得到较为精确的运行时间,但是很多时候,或者说绝大多数时候,我们并不值得去花精力求得多余的精度,因为精确运行时间中的倍增常量和低阶项已经被输入规模本身的影响所支配.我们需要关心的是输入规模无限增加,在极限中,运行时间是如何随着输入规模增大而增加的,通常来说,在极限情况下渐进地更优的算法在除很小的输入外的所有情

算法导论学习笔记 -(1)

一个ACM若菜,趁着ACM淡季,开始学习算法导论了,经过一年的ACM学习,逐渐的发现,学东西,深入才是王道,以前学习一个算法,总是看懂了就开始做题,到后来才发现很多题目,会算法,却不知道是用这个算法,这就是算法理解的不到位的后果,从今天开始,定下目标: 1.深入系统的学习算法, 2.学会纸上写伪代码,每章的代码自己先在纸上写一遍, 3.每节的学习笔记和算法都要写在博客上. 在博客上记录自己的学习笔记,方便以后温习.   欢迎各路大神路过指正错误之处. 现在,先写写书上的第一个算法,插入排序. 算

算法导论学习笔记(2)-归并排序

今天学习了算法导论上的归并排序算法,并且完成了在纸上写出伪代码,以前就学过归并但是理解的不够透彻,以 前还一直困惑:为什么明明归并排序比快排的时间复杂度更稳定,为什么库函数不用归并而用快排,现在知道原因了,因为归并排序必须开额外的空间,而且空间开销还比较大,下面介绍算法: 首先,归并排序用到了分治的思想,把大数据分成若干个小数据,然后再分别对小数据进行处理,最后把小数据 合并成大数据. 其次,归并排序用到了一个最重要的特点,就是把两组已经排序的数据合并成一组有序数据,并且该过程的时间复 杂度为O

算法导论学习笔记 (页码:9 ~ 16)

前面算法在生活中不谈,算法的重要性不谈,直接说算法. 第2章 算法基础 2.1 插入排序 书中主要介绍了插入排序的思想,即对于数组A[0 ~ N - 1],长度为N.那么,升序的插入排序的过程即是从A[1]开始,先和A[0]比较,如果比A[0]小,那么将A[0]的元素顺序后移放置在A[1]中,将原本A[1]的元素插入在A[0]的位置上,同理再拿A[5]举例,如果比A[4]小,那么A[4]后移,继续比较A[3],如果还是小,A[3]后移,直到找到合适的位置进行插入,原书中提供的伪代码,我这里提供对

算法导论学习笔记(3)-习题2.3-7-排序+二分

question(题意): Describe a O(n lg(n))-time algorithm that, given a set S of n integers and another integer x, determines whether or not there exist two elements in S whose sum is exactly x. 设计一个O(n lg(n))时间复杂度的算法,给定一个n个数字的集合,和一个数字x, 问,是否能在这个集合中找到两个数字,他

算法导论学习笔记——第12章 二叉查找树

二叉查找树性质 设x是二叉查找树中的一个结点,如果y是x的左子树中的一个结点,则k[y]<=key[x]:如果y是右子树中的一个结点,则k[y]>=k[x] 1 //中序遍历算法,输出二叉查找树T中的全部元素 2 INORDER-TREE-WALK(x) 3 if x!=nil 4 then INORDER-TREE-WALK(left[x]) 5 print key[x] 6 INORDER-TREE-WALK(right[x]) 查找 1 //递归版本 2 TREE-SEARCH(x,k)

算法导论学习笔记——第1章

所谓算法,就是定义良好的计算过程,它取一个或一组值作为输入,并产生出一个或一组值作为输出.亦即,算法是一系列的计算过程,将输入值转换成输出值. 一些常见的算法运行时间量级比较:对数级<多项式级<指数级<阶乘级 1 lgn < n 1/2 < n < nlgn < n 2 < n 3 < 2 n < n!

【算法导论-学习笔记】以线性时间增长的排序——计数排序

计数排序是一种能够达到运行时间能够线性时间θ(n)的排序算法.在排序算法里算是最快的算法之一,当然,他有很强烈的前提.下面开始介绍一下技术排序(Counting Sort). 算法思想 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数,此处k为某个整数.这样可以用一个数组C[0..k]来记录待排序数组里元素的数量.当k=O(n)时,计数排序的运行时间为θ(n). 注:关于C[0..k],用键值对描述的话,待排序元素是键,相同元素的个数是值.例:待排序数组<2,3 , 6,4 , 1 ,

算法导论学习笔记——第8章 线性时间排序

任意一种比较排序算法,在最坏情况下的运行时间下限是Ω(nlgn) 计数排序 假设n个输入元素中的每一个都是介于0到k之间的整数,k为某个整数,当k=O(n)时,计数排序的运行时间为Θ(n) 1 //输入数组A[1..n],存放排序结果数组B[1..n],临时存储区C[0..k] 2 COUNTING-SORT(A,B,k) 3 for i←0 to k 4 do C[i]←0 5 for j←1 to length[A] 6 do C[A[j]]←C[A[j]]+1 7 for i←1 to k

算法导论学习笔记 第7章 快速排序

对于包含n个数的输入数组来说,快速排序是一种时间复杂度为O(n^2)的排序算法.虽然最环情况的复杂度高,但是快速排序通常是实际应用排序中最好的选择,因为快排的平均性能非常好:它的期望复杂度是O(nlgn),而且O(nlgn)中的常数因子非常小.另外,快速排序还可以实现原址排序,甚至在虚拟环境中也能很好的工作. 1 快速排序的描述 与归并排序一样,快速排序也使用了分治法的思想,下面是对一个典型的子数组A[p.. r]进行快速排序的分治过长: 分解:数组A[p.. r]被划分为两个(可能为空)子数组