随笔分类 - 算法
摘要:0/1背包 问题描述有N件物品和一个容量为V的背包,第i件物品的体积为c[i],价值为w[i]。求将哪些物品放进背包可以使物品价值总和最大(有两种情况:不要求填满背包和填满背包)。每件商品只有一件,且只能选择放或者不放入背包。 解决方案使用动态规划求解,定义一个递归式opt[i][v]表示前i个物品,在背包容量大小为v的情况下,最大的价值。opt[i][v] = max(opt[i-1][v], opt[i-1][v-c[i]] + w[i])其中opt[i-1][v]表示第i件物品不装入背包中的总价值,而opt[i-1][v-c[i]]+w[i]表示第i件物品装入背包中的总价值。通过初始..
阅读全文
摘要:二项堆(图摘自:http://blog.csdn.net/acceptedxukai/article/details/6951922)一、介绍一颗二项堆是由一组二项树组成。二项树是一种递归的定义:二项树B[0]仅仅包含一个节点B[k]是由两棵B[k-1]二项树组成的,其中一颗树是另一颗树的子树,下面是B0-B4二项树:图:二项树二项树的性质:对于二项树B[k]有2^k个节点在深度为i的层中,有才C(k,i)个节点,其中i为0,1,2...k根节点的度数为k,大于树中任何其它节点的度数一颗包含n个节点的二项树,任意节点的最大度数为lgn二项堆H是由一组满足下面条件的二项树组成的:H中的每个二项树
阅读全文
摘要:R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,一个字段记录经度,另一个字段记录纬度。这样的话我们就需要遍历所有的餐厅获取其位置信息,然后计算是否满足要求。如果一个地区有100家餐厅的话,我们就要进行100次位置计算操作了,如果应用到谷歌地图这种超大数据库中,我想这种方法肯定不可行吧。R树就很好的解决了这种高维空间搜索问题。它把B树的思想很好的扩展到了多维空间,采用了B树分割空间的思想,并在添加、删除操作时采
阅读全文
摘要:B树及其衍生树一、B树1. 介绍B树与其它几种查找树(二叉查找树、AVL树和红黑树)不同,它每个节点最多有N个子节点而不是两个子节点,所以,它的高度是,而不是其它几种树的。B树是用来为磁盘而设计的数据结构,它区别于针对随机存取的贮存而设计的数据结构。因为磁盘的IO操作比较耗时,大概比主存存取大5个数量级,也就是说,一次磁盘存取大概的时间可以使主存完成大概100000次的存取。图:B树-每个内节点有1000关键字上图可以看出,一个B树,每个结点有1000个关键字,高度为2,就能包含10亿个关键字,只有根节点存在主存中,查找一个关键字只需要最多读取两次磁盘就能完成查找。图:B树的结构图B树是由有序
阅读全文
摘要:#include <iostream.h>#include <stdlib.h>#include <stdio.h>using namespace std;//冒泡排序 O(n^2)---稳定冒泡排序将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为ki的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R;凡扫描到违反本原则的轻气泡,就使其向上"漂浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。void BubbleSort(int *arr, int len){ bool changed
阅读全文
摘要:一、 最长公共子序列1. 问题通过比较公共子序列的长度来判断两个序列是否相似,如ABCBCDA和ACBCCAD的最长公共子序列为ABCCD。现在有两个序列和,找出X和Y的最长公共子序列(LCS)。2. 子问题拆分这个问题就是求所有公共序列,然后找出最长的那个,而如何计算序列的长度,就是一个递归的过程了,公式如下: 这个问题是几个动态规划问题中最好理解的一个,是一个二维遍历标记的过程,最后再遍历一遍标记就能获得结果,不再赘述,直接看伪代码。3. 伪代码LCS-LENGTH(X, Y) m <- length[X] n <- length[Y] for i <- 1 to m .
阅读全文
摘要:一、动态规划之我见动态规划是算法中很常见的一种,这两天系统的又把其细看了下,有点心得,写下来做个备忘。动态规划主要有几种类型:装配线调度(单次并行正向规划—一维,反向输出)矩阵链乘法(多次正向规划--一维,不同步长,正向输出)最长公共子序列(多次串行正向规划-二维,反向输出)最优二叉查找树(多次正向规划-一维,不同步长,正向输出)二、装配线调度简单的说,装配线调度是指在多条并行的流水线上(每个流水线能够进行转换)找到最快的输出结果的路径,是一个顺序的过程,所以只需要一次规划(循环)就能达到。1.问题:一个车间,有N条流水线,每条流水线都有M个节点,每条流水线上的对应第m个节点的功能是相同的,且
阅读全文
摘要:代码可以根据《红黑树研究记录-实例》那篇文章的图来验证main.cpp#include <iostream.h>#include "RBTree.h"using namespace std;int main(int argc, char *argv[]){ int arr[20] = {12, 1, 9, 2, 0, 11, 7, 19, 4, 15, 18, 5, 14, 13, 10, 16, 6, 3, 8, 17}; RBTree *tree = new RBTree(); for(int i = 0; i < 20; i++) tree->
阅读全文
摘要:红黑树插入删除实例图片摘自http://saturnman.blog.163.com/blog/static/557611201097221570/插入过程插入顺序为:12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17插入节点12:为根节点插入节点1:父节点为黑色,结束插入节点9:父节点为红色,叔父节点为黑色,LR,case2+case3插入节点2:父节点为红色,叔节点为红色,case1插入节点0:父节点为黑色,结束插入节点11:父节点为黑色,结束插入节点7:父节点为红色,叔节点为红色,case1插入节点19:父节点为黑色,结束插入节点4:父节点
阅读全文
摘要:一、 什么是红黑树?红黑树,是二叉查找树的一种,相对于AVL树,通过放弃绝对的平衡而提高了插入的速度,它可以不要求节点的左右子树高度差小于2,但保证一颗子树的高度绝对小于另一颗子树高度的2倍。一棵拥有n个内部结点的红黑树的树高h<=2log(n+1)。红黑树性质:1. 每个结点或红或黑。2. 根结点为黑色。3. 每个叶结点(实际上就是NULL指针)都是黑色的。4. 如果一个结点是红色的,那么它的周边3个节点都是黑色的。(也就是说两个红色节点不可能相连)5. 对于每个结点,从该结点到其所有子孙叶结点的路径中所包含的黑色结点个数都一样。二、 左旋和右旋红黑树中,最基础也是最重要的就是左旋和右
阅读全文

浙公网安备 33010602011771号