- 博客(23)
- 收藏
- 关注
原创 贪心算法——部分背包问题(贪心策略内容)
贪心策略贪心选择性质:一个全局最优解可通过做局部最优(贪心)选择来达到。最优子结构:如果问题的一个最优解包含了其子问题的最优解。贪心算法与动态规划算法的差异:贪心算法和动态规划算法都要求问题具有最优子结构性质,这是两类算法的一个共同点。但是,对于一个具有最优子结构的问题应该选用贪心算法还是动态规划算法来求解?是不是能用动态规划算法求解的问题也能用贪心算法来求解?下面我们来研究两个经典的组合优化问
2008-02-11 14:24:00
3990
3
原创 贪心算法——活动安排问题
活动安排问题一个由需要使用某一资源的n个活动组成的集合S = {1, 2, ... , n},该资源一次只能被一个活动占用。每个活动i有个开始时间s[i]和结束时间f[i],且s[i] ActivitySelectorMain.c#include stdio.h>void GreedyActivitySelector(int n, int *s, int *f, int *A);void
2008-02-07 22:04:00
3384
4
原创 动态规划——最优二叉查找树
大年夜,中午在姑姑家喝了些酒,头有些疼,晕乎乎的只想睡觉,还以为是酒精的力量,晚上在干妈家吃饭,愈发难受,意识到应该是感冒了,草草吃了些,就回家磕了点药睡觉,闹钟拨到11点,春晚就拜拜了,但岁还得守,老祖宗的规矩可不能破,^-^最优二叉查找树e[i][j]的值是在最优二叉查找树中的期望搜索代价。为有助于记录最优二叉查找树的结构,定义root[i][j]为k[r]的下标r,对1 e[i][j] =
2008-02-07 00:13:00
3568
1
原创 动态规划——最长公共子序列
最长公共子序列的概念: 若 Z 问题:找出X 和Y 的一个最长公共子序列?引进一个二维数组c[][],用c[i][j]记录X[i]与Y[j] 的LCS 的长度,b[i][j]记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。我们是自底向上进行递推计算,那么在计算c[i,j]之前,c[i-1][j-1],c[i-1][j]与c[i][j-1]均已计算出来。此时我们 根据X[i] =
2008-02-05 22:06:00
1705
2
原创 动态规划——矩阵链乘法(备忘录法)
一般地,当某个问题可以用动态规划法求解, 但二维数组中有相当一部分元素在整个计算中都不会被用到。我们就不需要以递推方式逐个计算二维数组中元素, 而采用备忘录方法: MemorizedMatrixChainMain.c#include stdio.h>#include limits.h>#define LENGTH 6void MemorizedMatrixChain(int p[],
2008-02-01 21:12:00
1843
原创 动态规划——矩阵链乘法
矩阵链乘法问题描述:给定n个矩阵构成的一个链,其中i = 1, 2, ... , n,矩阵A[i]的维数为p[i-1]*p[i],对乘积A[1]A[2]...A[n]以一种最小化标量乘法次数的方式进行加全部括号。步骤1:最优加全部括号的结构用记号A[i..j]表示乘积A[i]A[i+1]...A[j]求值的结果,其中i 步骤2:一个递归解设m[i][j]为计算矩阵A[i..j]所需的标量乘法运算次
2008-02-01 14:22:00
5732
1
原创 动态规划——装配线调度
动态规划动态规划算法的设计可分为如下4个步骤:(1)描述最优解的结构;(2)递归定义最优解的值;(3)按自底向上的方式计算最优解的值;(4)由计算出的结果构造一个最优解。第1~3步构成问题的动态规划解得基础,第4步在只要求计算最优解的值时可以略去。如果的确做了第4步,则有时要在第3步的计算中记录一些附加信息,要构造一个最优解变得容易。装配线问题一个找出通过工厂装配线的最快方式的制造问题。共有两条装
2008-01-31 18:57:00
1295
1
原创 数据结构——红黑树扩展
天气预报说30号雪停的,事实上又下了,这个世界乱套了。到时公路不通就只能靠铁哥了,到苏州再转,转不了就留在苏州玩几天雪吧,人说雪没化掉的话去网师园啊狮子林蛮赞的。写的红黑树还有问题,最近事情也多,唉,扩展不了了,就挖个坑,下次再考虑。看看股市,有消息称,"导致大盘暴跌的原因是因为大面积的降雪, 导致大量的股民滞留车站,机场.无法进入股市抄底, 待在家中人员又因大面积的停电而无法上网操作, 导致了今
2008-01-30 19:21:00
1143
原创 数据结构——红黑树
红黑树一棵红黑树是指一棵满足下述性质的二叉搜索树(BST, binary search tree):1. 每个结点或者为黑色或者为红色。2. 根结点为黑色。3. 每个叶结点(NIL)都是黑色的。4. 如果一个结点是红色的,那么它的两个子节点都是黑色的(也就是说,不能有两个相邻的红色结点)。5. 对于每个结点,从该结点到其所有子孙叶结点的路径中所包含的黑色结点数量必须相同。红黑树的每个节点上的属性除
2008-01-28 15:08:00
16997
2
原创 数据结构——The Red-Black Tree Song
又下雪了,只是上海的温润让她过早的融化。昨天冒雪买车票了,短途车还是挺好买的,有长途乘火车的同学只能去买黄牛票,结果碰到票价涨得不厉害的,又犹豫怕是假票,唉,春运问题难呐,要彻底解决,在中国,估计只能春节不放假了^-^。今天早起,尚来得及看到一点雪后的痕迹。上一次都没见到地上积起来,后来回校时,才从残留的痕迹中想象南京那边的雪。最近手气不行,可能本命年的缘故,打牌也不顺,只有去吃烤肉串的命瓦。
2008-01-27 14:54:00
1857
1
原创 数据结构——二叉查找树
二叉查找树或者是一棵空树,或者是具有下列性质的二叉树:1、每个结点都有一个作为查找依据的关键码,所有结点的关键码互不相同。2、左子树(如果存在)上所有结点的关键码都小于根结点的关键码。3、右子树(如果存在)上所有结点的关键码都大于根结点的关键码。4、左子树和右子树也是二叉查找树。BSTreeMain.c#include stdio.h>#include stdlib.h>#incl
2008-01-25 14:43:00
3674
1
原创 数据结构——杂凑表(开放定址法)
为产生冲突的地址Hash(key)求得一个地址序列:H0, H1, H2, …, Hk 1 增量 di 有三种取法:(1)线性探测再散列:di = 1, 2, 3, ... , m - 1(2)平方探测再散列:di = 1^2, -1^2, 2^2, -2^2, …,(3)伪随机探测再散列:di 是一组伪随机数列注意:增量di应具有“完备性”,即产生的Hi均不相同,且所产生的k(m-1)个Hi值能
2008-01-25 11:36:00
1439
原创 数据结构——杂凑表(拉链法)
Hash设某元素的关键字为key,用函数Hash(key)的值作为该元素的地址,所构造的查找表称为哈希表(或散列表),函数Hash(key)称为哈希(Hash)函数(或散列函数)。若两个关键字k1 != k2,但H(k1) = H(k2)。这种现象称为冲突,k1和k2称为同义词。要避免冲突,需要构造一个恰当的哈希函数。常见的构造哈希函数的方法有:直接定址法、除留余数法、平方取中法等。有时冲突是不能
2008-01-24 14:02:00
2214
原创 数据结构——基本数据结构之有根树
树树是由一个或多个结点组成的有限集合,其中:(1)必有一个特定的称为根(ROOT)的结点;(2)剩下的结点被分成n>=0个互不相交的集合T1、T2、......Tn,而且, 这些集合的每一个又都是树。树T1、T2、......Tn被称作根的子树(Subtree)。树的递归定义如下:(1)至少有一个结点(称为根)(2)其它是互不相交的子树二叉树二叉树也是递归定义的,其结点有左右子树之分。BiTree
2008-01-23 15:39:00
1242
原创 数据结构——基本数据结构之链表
双向循环链表双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 DuLinkListMain.c#include stdio.h>#include stdlib.h>#include "linklist.h"/**//*简单测试程序*/in
2008-01-23 11:43:00
738
原创 数据结构——基本数据结构之队列
循环队列用一组抵制连续的存储单元依次存放从队头到队尾的元素另外两个指针front和rear分别指示队列头元素和尾元素的位置queue.h #ifndef _QUEUE_H#define _QUEUE_H#define MaxQSize 100typedef int ElemType;typedef struct SqQueue...{ ElemType *base; int f
2008-01-22 15:34:00
641
原创 数据结构——基本数据结构之栈
动态集合:集合可以增大、缩小或随时间而变化。动态集合上的操作可分为两类:1.查询,返回有关集合的信息;2.修改:对集合有所改变。Search(S, k):给定一个集合S和关键字k,返回一个指向S中元素的指针x,使key[x] = k,或当S中不存在这样的元素时返回NULL。Insert(S, x):将由x指向的元素增加到S中去,通常假定x中的域都已被初始化。Delete(S, x):当给定一个指向
2008-01-22 13:33:00
566
原创 排序和顺序统计学——中位数和顺序统计学
一个由n个元素组成的集合的第i个顺序统计就是该集合的第i小元素。中位数:在i = ⌊(n + 1)/2⌋和⌈(n + 1)/2⌉处。(i = 1, 2, ... , n)选择问题:输入:一个含n个(不同的)数的集合A和一个数i,1 ≤ i≤ n。输出:恰大于A中其他i-1个元素的x,(x ∈ A)。一、求最大最小元/**//* *Copyright(c) 2008 All rights
2008-01-21 14:13:00
1253
原创 排序和顺序统计学——线形时间排序
对含n个元素的一个输入序列,任何比较排序在最坏情况下都要用Θ(n lg n)次比较来进行排序。下面讨论三种以线性时间运行的算法:计数排序、基数排序和桶排序。这些算法都用了非比较的一些操作来确定元素的次序。 一、计数排序计数排序假设n个输入元素中的每一个都是介于1到k之间的整数,此处k是整数。当k = O(n) 时,计数排序的运行时间为O(n) 。计数排序算法的基本思想是对于给定
2008-01-21 11:16:00
797
原创 排序和顺序统计学——快速排序
一、快速排序最坏情况O(n^2),平均性能相当好,期望的运行时间为O(nlgn),且其隐含的常数因子很小。另外,它还能够进行原地置换排序。采用分治模式分解:数组A[p...r]被划分成两个非空子数组A[p...q-1]和A[q+1...r],使得A[p...q-1]的每个元素都小于等于A[q+1...r];解决:通过递归调用快速排序对子数组A[p...q-1]和A[q+1...r]排序;合并:因为
2008-01-20 20:57:00
849
原创 排序和顺序统计学——堆排序
一、堆 堆结构是一种数组对象,可以被视为一棵完全二叉树。数中每个节点与数组中存放该点中值的那个元素对应。表示一个堆的数组具有两个属性:length[A]:数组中的元素个数heap_size[A]:存放在A中的堆的元素个数。树的根为A[1],给定某个节点的下标i,其父结点PARENT(i),左儿子LEFT(i),右儿子RIGHT(i)。堆结构还满足堆性质(最大堆):对除根以外的每个节点i,
2008-01-19 21:30:00
685
原创 算法概念-Start
问题如下:输入:n个数输出:输入序列的一个排列(即重新排序),使得a[1] 1.插入排序#include stdio.h>/**//* *插入排序 *输入: a:待排序数组 * n:n个数 *输出: 输入序列的一个排列(即重新排序),使得a[0] */void InsertSort(int *a, int n)...{ int i, j; int x
2007-12-16 16:31:00
666
原创 该死的算法——双城记
那是最美好的时代,那是最糟糕的时代;那是智慧的年头,那是愚昧的年头;那是信仰的时期,那是怀疑的时期;那是光明的季节,那是黑暗的季节;那是希望的春天,那是失望的冬天;我们全都在直奔天堂,我们全都在直奔相反的方向--简而言之,那时跟现在非常相象,某些最喧嚣的权威坚持要用形容词的最高级来形容它。说它好,是最高级的;说它不好,也是最高级的。 学校回来,健身月已过,错过了总决赛,错过了抽奖。棍子很
2007-12-02 14:53:00
692
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人