算法导论学习笔记
文章平均质量分 73
记录自己学习算法导论的笔记,以自己的理解与实现代码为主
Bruce_Zeng
这个作者很懒,什么都没留下…
展开
-
算法导论学习笔记(十四):贪心算法(一):活动安排问题
对很多最优化问题来说,采用动态规划方法来解决就有点大材小用了。有时候我们可以采用贪心算法来取代。贪心算法是通过所做的局部最佳选择来产生一个全局最优解。而且和动态规划不同的是,它是通过自顶向下的方式来解决每一个子问题。而活动安排问题可以说是贪心算法的一个入门学习。当我看到这个问题时,首先就想到了自己大一做ACM时在杭电acm里遇到的一个题目:今年暑假不AC。可以说这个题目就是原创 2013-03-03 15:00:38 · 2800 阅读 · 0 评论 -
算法导论学习笔记(十三):动态规划(三):01背包问题
01背包问题有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v] = max{f[i-1][v],f[i-原创 2013-03-07 11:12:09 · 5443 阅读 · 0 评论 -
算法导论学习笔记(十二):动态规划(二):最长公共子序列(LCS)
LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了。公共部分必须是以相同的顺序出现,但是不必要是连续的。解法一:在没学动态规划之前,我能想到的方法就是枚举了。将S1的所有子序列全部检查是否是S2的子序列,从中选出最长公共子序列。对于长度为n的序列,其子序列共有2的n次方个,这样的话这种算法的时间复杂度就为指数级了,这显然不原创 2013-02-27 19:37:56 · 6648 阅读 · 0 评论 -
算法导论学习笔记(十一):动态规划(一)
装配线调度#includeusing namespace std;int a[3][7], t[3][7], e[3], x[3];int f[3][7], l[3][7];int n = 6;/***************************************************** l[i][j]存储经过装配站j-1所在装配线** f[1][0]和f[原创 2013-02-25 20:37:20 · 2082 阅读 · 0 评论 -
算法导论学习笔记(十):约瑟夫排列
约瑟夫问题的定义:假设n个人排成环形,且有一个正整数 m 就让其出列,且报数进行下去。这个过程一直进行到所有人都出列为止。每个人出列的次序定义了整数0,1,2,...n-1的(n, m)-约瑟夫排列。例如(7, 3)约瑟夫排列为。Code#includeusing namespace std;int main(){ int n, m; int a[100];原创 2013-01-26 14:52:04 · 2619 阅读 · 0 评论 -
算法导论学习笔记(八):二叉查找树
前言昨天复习完了二叉树,今天终于可以很好的展开对二叉查找树的学习了。言归正传,查找树是一种数据结构,支持多种动态集合操作,包括SEARCH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT以及DELETE。定义一颗二叉查找树是按二叉树结构来组织的。这样的树可以用链表结构来表示,其中每一个结点都是一个对象。结点中除了key域和卫原创 2013-01-09 10:54:48 · 3331 阅读 · 4 评论 -
算法导论学习笔记(七):二叉树
前言昨天看算法导论看到二叉查找树,虽然以前学数据结构的时候已经学过了二叉树,但感觉自己很多东西已经忘了,为了更好的学习二叉查找树以及后面所涉及到的二叉树方面的相关算法,故再一次复习了下二叉树。并在这写个复习笔记,便于以后的复习。定义学习二叉树之前,肯定得了解数据结构中的树。数据结构中的树和我们现实中的树还是有一点区别的。首先数据结构中的树与现实相比是倒立的。其次数据原创 2013-01-07 15:46:27 · 3129 阅读 · 0 评论 -
算法导论学习笔记(六):计数排序与基数排序
这里的两个排序的期望运行时间都是O(n),应该是到目前为止时间复杂度最低的了。计数排序计数排序假设n个输入元素的每一个都是介于0到K之间的整数,此处K为某个整数,在具体实现中,我们可以取K为n个元素中最大的那个。计数排序的基本思想:对每个输入元素x,确定小于x的元素个数。再根据这个信息,把x放到它最终输出数组中的位置上。例如,有20个元素小于x,则x就放到输出数组的第21个位置原创 2012-12-30 17:14:30 · 2665 阅读 · 0 评论 -
算法导论学习笔记(五):快速排序
快速排序是一种最坏情况运行时间为O(n*n),虽然这个最坏情况运行时间比较差,但快速排序通常都是用于排序的最佳的实用选择,这是因为其平均性能相当好:期望的运行时间为O(nlgn),且O(nlgn)记号中隐含的常数因子很小。另外,它还能够进行就地排序。快速排序和合并排序一样,采用的都是分治思想。快排中利用该思想解决步骤为:1、先从数组中取出一个数作为基数,基数的选择对排序效率原创 2012-12-29 22:10:23 · 6016 阅读 · 0 评论 -
算法导论学习笔记(四):求X的N次方的二分实现
今天在看到网易里的算法导论的公开课,听到老外讲分治法时提到了下算一个数的N次方的可以通过二分思想来实现,于是便想自己写个代码来实现它。虽然很简单,还是想写在博客中。一是可以加深自己的印象,以后遇到这类问题时可以马上想到用二分来解决;二是可以方便以后的复习,再次用到的时候可以直接来这找模板。#includeusing namespace std;int Pow(int x, i原创 2012-12-28 02:39:01 · 5476 阅读 · 4 评论 -
算法导论学习笔记(三):堆排序
堆排序是一种利用堆的性质进行的排序算法。所以学习堆排序之前先来简单介绍下堆。堆堆数据结构是一种数组对象,如图一所示,它可以被视为一颗完全二叉树。 图一树中的每个结点与数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层可能除外。如果树的结点和数组的下标都从0开始,那么给定了某个结点的下标i,其父节点PARENT(i)、左儿子LEFT(i)和右儿子原创 2012-12-26 17:17:32 · 2241 阅读 · 0 评论 -
算法导论学习笔记(二):合并排序
在前一篇博客中已经提到了插入排序,这里继续介绍下另一种比较高效的排序:合并排序。合并排序用到了分治思想,其时间复杂度为O(NlgN)。合并算法的关键在于合并。合并排序的的基本步骤如下:1.把待排序的数组分为左数组和右数组2.对左数组和右数组进行迭代排序3.将左数组和右数组进行合并显然这些基本步骤符合分治模式在每一层递归上的三个步骤:分解、解决、合并。每步的实现代码如下:原创 2012-12-15 22:43:49 · 3234 阅读 · 1 评论 -
算法导论学习笔记(一):插入排序
排序可以说是我们平常写代码中最经常用到的算法之一了。冒泡排序应该是大家最熟悉的了,几乎每本编程语言的入门教程中都会提到。这里主要讲下插入排序。插入排序:插入排序的大概步骤是从第二个元素开始遍历,当遍历到第N个元素时,前面N - 1个元素都已经排好序了,然后查找前面排好序的N - 1个元素,将第N个元素插入到适当的位置。也就是说插入排序实现有两个关键点:如何保证遍历到当前原创 2012-12-11 22:32:38 · 3492 阅读 · 0 评论