算法和数据结构
文章平均质量分 67
sinapme
这个作者很懒,什么都没留下…
展开
-
动态规划求解合唱队问题的思路
动态规划求解合唱队问题思路:该题的关键是不能置换队员的顺序,这个要求降低了问题的难度,如果可以排列的话就难了,建一个堆总会出现重复的元素,如何调整还没想出来怎么做。考虑不能排列的情况,先对整个队列求一个最长递增子序列再求一个最长递降子序列。则剩下的人数就好算了。因为最长递增子序列是一个典型的动态规划问题,设子问题的解是FAscend[i]和FDescend[i]则合唱队问题的最优解是N-max[i原创 2014-02-20 15:48:00 · 1024 阅读 · 0 评论 -
图像的四叉树深度优先存储
#include #include "QuadTree.h"#include #include #include #include#include #include #include using namespace std;typedef struct structQTree QTree;struct structQTree{ unsigned char pixel;原创 2013-12-18 08:42:17 · 1276 阅读 · 0 评论 -
图像的四叉树广度优先存储
#include #include #include #include #include#include #include #include using namespace std;typedef struct quardresult_t{ int seq; char val;}QuadResult;/* 象限 */typedef en原创 2013-12-18 12:01:48 · 1294 阅读 · 0 评论 -
长整数相乘的字符串表示法
容易出错的地方在于 字符串的0位恰好代表长整数的高位*详细描述: char* LongIntegerMul(char* pNum1, char *pNum2);输入参数: char* pNum1:使用字符串表示的长整数1 char* pNum2:使用字符串表示的长整数2输出参数(指针指向的内存区域保证有效):原创 2013-12-18 08:18:55 · 875 阅读 · 0 评论 -
四叉树存储2^n大小的图像
#include typedef struct structQTree QTree;struct structQTree{ unsigned char pixel; bool isLeaf; QTree *children[4];};/* 象限 */enum{ TOP_RIGHT = 0, TOP原创 2013-12-17 16:26:18 · 1943 阅读 · 0 评论 -
贪心法求解多处理器问题
有jobNum个任务等待machineNum个处理器去完成,任务不可细分,求最优完成时间。本质是NP问题,但是可以通过贪心法来求近似解:策略: 对jobNum个任务按其占用处理器的时间排序,最重的任务往前排,每次选择最早空出来的处理器安排给最重的任务。例如7个独立作业{2,14,4,16,6,5,3}的三处理器调度为M1: 4M2: 2-7M3: 5-6-3-1原创 2013-12-17 11:34:23 · 738 阅读 · 0 评论 -
长整数的乘法
思路比较简单但是编写程序特别容易出错,思路就是用字符串来模拟乘法的计算,错误的地方在于,字符串的低位恰恰是其代表的长整数的高位测试用例#include #include "CExampleTest.h"#include #include #include extern char* LongIntegerMul(char* pNum1, char *pNum2);原创 2013-12-16 16:22:45 · 1727 阅读 · 0 评论 -
素数筛法计算完全数
完全数的性质: 如果i为质数,且2^i-1为质数,则(2^i-1)*2^(i-1)是完全数public final class Demo{ /** * * 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。 * 它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。原创 2013-12-16 22:03:56 · 801 阅读 · 0 评论 -
分支限界法解决 二维最长下降序列问题(滑雪场问题)
int [][]all={{1,2,3,4,5}, {16,17,18,19,6}, {15,24,25,20,7}, {14,23,22,21,8}, {13,12,11,10,9}};数组中的数值表示的是该点的高度原创 2013-12-17 21:42:58 · 839 阅读 · 0 评论 -
collision by chaining的hash的cpp模板实现
///////////////////////////////////////////////////////#ifndef _HASHTBL_H#define _HASHTBL_Husing namespace std;/////////////////////////////////////////////////////////常用的Hash函数/* * 字符串Has原创 2013-12-26 16:14:59 · 599 阅读 · 0 评论 -
Hash表基础知识
1.1 除法hash表H(k)=k mod m, 这里m不应该是2的p幂次,否则对m取模等价于取k的低p位,除非k的低p位足以区分各个记录。当k是一个按基数2^p解释的字符串时,选m=2^p-1不好,因为对k的各个字符进行排列并不会改变其散列值.M的选择应该取与2的整数幂不太接近的质数。1.2 乘法hash表用关键字k乘以常数A(0并取出结果的小数部分,然后用m乘以原创 2013-12-05 18:30:43 · 511 阅读 · 0 评论 -
hash表的openADDRESSing的c语言实现
int ProbeArray[]={997,***}; //一个合适的素数序列用来open addressingtypedef struct{ ElemType *elem; //数据元素的动态分配首地址 Int count; // 当前数据元素个数 Int sizeindex; // 动态数组的当前容量}HashTable;#define SUCCESS 1#d原创 2013-12-05 17:48:07 · 864 阅读 · 0 评论 -
滑雪问题的分支限界法求解
首先明白一件事情,最长的路径总是从最高点开始的!import java.util.*;public class Demo{ /** * 计算区域最长长度 * * Michael喜欢滑雪这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜, * 而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michae原创 2013-12-25 15:50:53 · 671 阅读 · 0 评论 -
过河卒问题的动态规划求解(分支限界或者回溯过于耗时)
如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。#include #include "OJ.h" #define MAX原创 2013-12-25 11:50:27 · 749 阅读 · 0 评论 -
约瑟夫环的数学解决
约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。在那里,这些叛乱者表决说“要投降毋宁死”。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签,并且,作为转载 2013-12-25 10:11:54 · 604 阅读 · 0 评论 -
python求解一个数的阶乘有几个零
算法: 0的个数为 n/5+n/25+n/125+n/(5^i)'''求一个数的阶乘末尾有多少个0要求:大于或等于0小于10000的整数2.输入非数字或者超过范围,则退出程序用例:输入 输出'5' '5! have 1 zero''e' 'e is not a number''10000'原创 2013-12-19 16:48:07 · 2071 阅读 · 0 评论 -
素数筛-筛出1到n的所有素数
判断一个数字是否为素数,正如大家都知道的那样,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n)--n的开方,那么我们可以用这个性质用最直观的方法来求出小于等于n的所有的素数。 num = 0; for(i=2; i { for(j=2; j if( j%i==0 ) break; if( j>sqrt(i) )转载 2013-12-05 10:48:39 · 1033 阅读 · 0 评论 -
0-1背包问题的动态规划求法(开心的小明)
注意:动态规划问题的子问题的解并不包含全局最优解!而是全局最优解包含子问题的解!也即子问题的局部最优解是什么并不能最终决定全局解在该局部的取值。因此动态固化存储了所有的情况,不管这些情况是否会被用到,自底向上的过程中,不知道上层的解应该是怎么样。求解的过程中也没有存储解的结构,而是只计算最优质,最后回溯来获得解的结构。问题描述:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背原创 2013-12-16 10:21:54 · 907 阅读 · 0 评论 -
动态规划求解最大子段和
子段:连续动态规划: 问题规模定义为opm_fromj注意opm_fromj可以小于opm_fromj-1,这是因为opm_fromj固定的是j,从j往前数若干个元素的最大值,因此opm_fromj必然要包含数组的第j个元素。每次迭代opm_fromj={opm_from(j-1)+pIntArray[j]当opm_fromj>0即从第j-1个元素往前数的最优子段和大于0的情况,原创 2013-12-04 11:00:36 · 864 阅读 · 0 评论 -
5. 由树的前序序列和中序序列来确定树的结构
1. 由树的前序序列和中序序列来确定树的结构例如前序为 ABCDEFG,而中序为CBEDAFG。首先根据前序可以知道,整棵树的根为A。而根据中序可以知道,左子树为CBED,右子树为FG。然后根左子树的CBED的先序遍历为BCDE,中序为CBED。因此根的左子树的根为B,中序为【C】B【ED】。而根的右子树的先序为FG,中序也为FG。因此根的右子树的根为F,右子树的孩子为原创 2013-12-05 14:36:53 · 567 阅读 · 0 评论 -
shell排序
int dlta[]={4,3,2,1}; //增量序列void shellInsert(int* a, int n,int delta){ cout<<"the delta is "<<delta<<endl; int temp; for(int i=0;i<n-delta;i++) //每个piece的起始 { for(int j=i+delta;原创 2013-09-29 10:39:56 · 534 阅读 · 0 评论 -
堆和堆排序
堆heap与内存分配中的堆是完全不同的两个概念,只是由于历史的原因才有区别。堆是一个很形象的概念,好比一堆石子,大的堆在底下,小的堆在顶上,这样才能稳定。也即堆是有序的结构,有序体现在顶层的node比底层的node在某种比较条件下小,或者说parent要比child小。而堆的无序体现在sibling之间是没有顺序的。可以用完全二叉树的线性表示来表示堆。堆的操作有两个核心的问题,一是对于一个原创 2013-09-11 10:55:15 · 688 阅读 · 0 评论 -
图的存储结构
1. 邻接矩阵表示是最简单的,可以用matlab实现dij算法2.邻接表是最常用的(邻接表可以看成一种广义线性表)2.1 每个顶点vi建立一个单链表(顶点的编号是在图的生成过程中就确定了),每个链表有一个表头节点,有数据域和firstarc域(指向第一个相连的结点),表头结点顺序存储便于随机访问2.2 每个顶点的链表存放与该顶点相连的边2.3 每个node有3个域,adjvex指示原创 2013-09-26 16:13:30 · 645 阅读 · 0 评论 -
图的dfs
节点的名字一般用数字来表示邻接表的边只存储指向下一条边,而十字链表的边里还存储节点指针。1 十字链表用来存储DG,可以看成邻接矩阵的链式存储结构,其实就是拓展了一下邻接表,原来邻接表的一个顶点对应的链表只存储该顶点出发指向的边,现在增加一个域来存储以该顶点为终点的边的点.2.邻接多重表用来存储UDG表示边的结构field:mark(是否被搜索过),ivex(顶点原创 2013-09-26 16:57:12 · 876 阅读 · 0 评论 -
整数的加法拆分
题目描述一个整数总可以拆分为2的幂的和,例如:7=1+2+47=1+2+2+27=1+1+1+47=1+1+1+2+27=1+1+1+1+1+27=1+1+1+1+1+1+1总共有六种不同的拆分方式。再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。用f(n)表示n的不同拆分的种数,例如f(7)=6.转载 2013-12-11 08:30:30 · 2470 阅读 · 0 评论 -
多关键字排序的方法
每个记录有d个关键字,表示为K1,K2到Kd而关键字的优先顺序为K1>K2>Kd不可能存在两个关键字的优先级相同的情况,因为如果这样两个记录无法比较。因此出现了两种多关键字排序的方法,即MSD和LSD,MSD即按照关键字优先级k1>k2>kd来派讯,LSD即按照关键字优先级kd拿扑克牌为例,如果花色的优先级高于数值。则MSD对应的方法是先将52张扑克牌按照花色分成4堆,然后原创 2013-11-07 12:39:30 · 3821 阅读 · 0 评论 -
回溯法
1.首先要定义好解空间,即选择一种数学方法来描述问题的解以及解的所有可能的情况。 因为在编程中解还是要用数据结构来表示。 解空间是一个集合,每一个元素表示一个可能的解(不一定正确),对于0-1背包问题,其解空间为长度n的0-1vector组成,即所有可能的0-1排列的集合,当n为3时,解空间的cardinal为2^3=8.2.然后将解空间中的元素组合成树或者图的形式。解原创 2013-09-26 16:55:17 · 509 阅读 · 0 评论 -
火车调度问题的回溯法解决
问题描述:火车编号为:1~9,且不重复。如:编号分别为“1”、“2”、“3”、“4”、“5”的5个火车顺序进站,那么进站序列为“12345”,全部进站后再顺序出站,则出站序列为“54321”,如果先进1,2,然后2出站,然后1出站,然后再3进站、出站,4进站、出站,5进站、出站,那么出站序列就为21345.详细描述: int JudgeTrainSequence (int原创 2013-09-27 09:35:56 · 1194 阅读 · 0 评论 -
兔子产子与fibanacii序列
获取第nValue1个月出生多少对兔子 这里最好把兔子理解为中子,两个中子对撞可以产生新的两个中子,即没有雌雄之分第一个月 只有一对中子,第二个月 一对中子对撞出新的一对中子,因此2th月出生的中子对数为1.第三个月 还是第一个月的中子对撞出新的一对中子第四个月 第一个月和第二个月的中子都能对撞出新的中子对,因此本月的新生中子对数为2对设第n个月的新生中子对数为Bn,则原创 2013-12-05 14:26:00 · 712 阅读 · 0 评论 -
素数筛的方法 筛出小于n的所有素数
判断一个数字是否为素数,正如大家都知道的那样,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n)--n的开方,那么我们可以用这个性质用最直观的方法来求出小于等于n的所有的素数。 num = 0; for(i=2; i { for(j=2; j if( j%i==0 ) break; if( j>sqrt(i) )转载 2013-12-05 14:30:46 · 2411 阅读 · 0 评论 -
数论基本理论的整理
1. 大整数情况,衡量问题复杂度是输入的整数的位数,衡量效率是位操作的次数。2. 除法定理:a=qn+r, 余数为r3. 取模可以划分等价类,[a]n表示模n后余数为a的数即 a+k*n; 例如[3]7=[-4]7=[10]7中,k分别取 0,-1,1. 等价类的代表元是3,3+k*7即等价类的所有的元素4. 用Zn表示所有的模n的等价类地集合即Zn={[a]n: 05. a原创 2013-12-13 09:51:21 · 1406 阅读 · 0 评论 -
图的十字链表表示的c++实现
#include using namespace std;class VexNode;class ArcNode;typedef int VEXID;#define MAXVEXNUM 1000// 编程错误:函数的顺序写错,入s->v写成v->s// 一定要有无参的构造函数且要初始化所有成员,不然disasterclass VexNode{原创 2013-09-30 08:57:19 · 926 阅读 · 0 评论 -
合唱队问题的动态规划解法
问题描述:N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 Ti+1 > … > TK (1 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排原创 2013-12-05 17:47:40 · 2892 阅读 · 0 评论 -
动态规划求解最长公共子串的问题
2. 动态规划求解最长公共子串的问题2.1 问题描述:Description 找出2个给定字符串中最长的公共子字符串Prototype void vProcTaskToCoreByLayerAndTime(unsigned int Layer,unsigned int* pDuration)Input Param char* pSrcStr1, ch原创 2013-12-06 19:42:58 · 551 阅读 · 0 评论 -
同余方程(线性模方程)求解青蛙约会问题
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,原创 2013-12-13 11:46:06 · 1118 阅读 · 0 评论 -
分治法求解放苹果问题(量子力学的状态问题,完全相同的苹果和完全相同的盘子)
题目描述把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 输入每个用例包含二个整数M和N。0,1。 样例输入7 3 样例输出8 /** * 计算放苹果方法数目 * 输入值非法时返回-1 * 1 * @par原创 2013-12-13 21:51:53 · 832 阅读 · 0 评论 -
推广的欧几里得算法--对于求解 线性模方程 有用
问题描述: d=gcd(a,b)=ax+by, (1)求出满足条件的x和y。这个问题的求解有助于计算模乘法的逆。Extended-Eculid要求输入两个非负整数,返回一个满足方程(1)的 triple (d,x,y)a b floor(ab) d x y[function begin]extended-euclid(a,b)if b==0 return (a,1,原创 2013-12-13 08:40:25 · 1205 阅读 · 0 评论 -
《算法导论》:等概率的前提下通过判定树来分析折半查找的性能
折半查找的最差情况下的性能是floor(log-n)+1,即一直查找到最底层才找到或找不到。这个判定树与霍夫曼树的区别在于折半查找的判定树的内节点也是待查找元素,而叶子节点是区间。因此折半查找与BST更相似,只不过折半查找的判定树是固定的,不是动态结构。另一个区别在于折半查找是以元素的序号来区分的,而BST的元素序号与其位置没有关系,BST元素的键值决定了其位置,而且键值没有二分关系。描述原创 2013-12-05 14:39:35 · 1609 阅读 · 0 评论 -
对AOV(DAG的一种,Activity on vertex)拓扑排序得到chain(人为添加边构成全序)来判断AOV是否有环
等价关系: 如果集合上的关系是 自反的,对称的(a~b=>b~a)和传递的,则称为R是集合上的偏序关系。偏序关系: 如果集合上的关系是 自反的(aa=b)和传递的(a合,全序关系: 如果集合中的每个元素都可以比较,则称为全序关系(偏序为partial order,即存在两个元素不可比的情况即a!偏序集合中的全序集合称为偏序集合的一个chain,即该chain即拓扑排序.原创 2013-09-25 17:25:10 · 1097 阅读 · 0 评论 -
动态规划求解最长公共子串
2. 动态规划求解最长公共子串的问题2.1 问题描述:Description 找出2个给定字符串中最长的公共子字符串Prototype voidvProcTaskToCoreByLayerAndTime(unsigned int Layer,unsigned int* pDuration)Input Param char* pSrcStr1, char*原创 2013-09-25 14:10:26 · 591 阅读 · 0 评论