随笔分类 - 算法
摘要:普利姆算法,是一种常用的求最小生成树的算法。最小生成树,使得一个连通图内拥有最小的和。对现实生活中有极大的作用。主要思路1 选定一个顶点(与结果无关)2 寻找与这个顶点相连的最小权值的邻居while(jarc[k][j] arc[k][j]; ver[j] = k; } }5 直到所有顶点都存在于该集合中算法代码 1 void Prim(Graph *g){ 2 int min,i,j,k; 3 int ver[MAXSIZE]; 4 int lowcost[MAXSIZE]; 5 lowcost...
阅读全文
摘要:邻接图的优点就是,现用现申请,空间存储很灵活,并且需要的空间也很小。我们在做复杂网络时,通常也是用这种方法。缺点是不适合并行化,因为cuda只支持连续地址空间的拷贝。数据结构主要包括,边节点和顶点节点typedef struct edgeNode{ int num; int weight; struct edgeNode * next;}edgeNode;typedef struct vertexNode{ char data; edgeNode * firstNode;}vertexNode,List[NUM];typedef struct Graph{ ...
阅读全文
摘要:图的常用表示方法就是矩阵和邻接表。矩阵通常使用与规整的,且数据量较小的图,这种图直观上方便的表示出了图之间节点的相互关系。图的数据结构typedef struct Graph_Matrix{ char vers[NUM]; //存储数据表示 int arc[NUM][NUM];//二维矩阵图,用来表示节点相连情况 int numVer,numEdge;//顶点数,和边数}Graph_Matrix;矩阵图的深度优先遍历为了防止图中有不连通的子图,因此每个节点顺序的遍历一次,每次采用深度优先遍历其联通子图,避免了遗漏节点。有点类似书中遍历玩父节点,直接遍历他的左边孩子,然后再回来...
阅读全文
摘要:完全二叉树特点:1 叶子节点只能出现在最下面两层2 最下层的叶子一定集中在左部连续位置3 倒数第二层,如果有叶子节点,一定都集中在右边4 如果节点度为1,则该节点只有做孩子5 同样节点数的二叉树,完全二叉树深度最小性质1:在二叉树的第i层上至多有2的(i-1)次幂个节点性质2:深度为k的二叉树最多有2的k-1次幂个节点性质3:叶子节点数为m,度为2的节点数为n,那么 m=n+1性质4:具有n个节点的完全二叉树深度为[log2n]+1性质5:如果节点i的两个孩子是2i和2i+1遍历方式前序遍历void PreOrderTree(BiTree *b){ if( b == NULL) ...
阅读全文
摘要:[edit by xingoo]kmp算法其实就是一种改进的字符串匹配算法。复杂度可以达到O(n+m),n是参考字符串长度,m是匹配字符串长度。传统的算法,就是匹配字符串与参考字符串挨个比较,如果相同就比较下一个,如果不相同,就返回上一次的结果,再重新比较。如图1 如果失败则字符串会重新用S(参考字符串)的第二个,与T(匹配字符串)的第一个比较,知道全部符合查找,或找不到为止。此时发现S[5] != T[5],因此用S[1]与T[0]进行比较。此时发现S[1]!=T[0],因此用S[2]与T[0]比较。此时,仍然不相等,继续后移。此时,S[3] == T[0],继续比较,发现所有T元素都在S中
阅读全文
摘要:循环队列类似栈,但是有两个口,一个专门用来入队,一个专门用来出队。由于入队出队不在一个端口,因此如果不适用循环队列,随着队列的使用,存储空间马上就被耗光了。在循环队列中,一个主要的知识点,就是如何判断队列为空,或者队列满。这里主要有两个方法:1 设置一个标记位,初始时,队列为空,我们设置flag=0;随着数据的使用,如果队满,设置flag=1;2 使用一个空的数据位,这样rear指针永远也不能追上front指针。当front==rear时,队列即为空;当(rear-front)%SIZE==SIZE时,队列为满数据结构typedef struct Queue{ int data[MAXS...
阅读全文
摘要:共享栈,即是两个栈使用同一段存储空间。第一个栈从数组头开始存储,第二个栈从数组尾开始,两个栈向中间拓展。当top1+1==top2或者top1==top2-1时,即staock overflow!.与普通栈一样,共享栈出栈入栈的时间复杂度仍为O(1).数据结构typedef struct shareStack{ int data[MAXSIZE]; int top1; int top2;}shareStack;出栈操作该数据,仅存的是非负数,因此如果想要存储更复杂的操作,可以在判断栈空时,换一种方式,即可。int Pop(shareStack *ss,int flag){ ...
阅读全文
摘要:栈的基本操作就是出栈和入栈,这两个的时间复杂度都是O(1)数据结构typedef struct Stack{ int data[MAXSIZE]; int top;}Stack;出栈操作int Pop(Stack *s){ if(s->top == -1) return 0; s->top--; return s->data[s->top+1];}入栈操作int Push(Stack *s,int num){ if(s->top == MAXSIZE-1) return 0; s->top++; s->data[s->...
阅读全文
摘要:优点:1 空间存储方便,现用现申请2 插入删除,只针对单一数据,不需要移动大量数据缺点:1读取,插入,删除慢,需要从头查找,时间复杂度均为O(n)数据结构声明typedef struct Node{ int data; struct Node * next;}Node;int main(){ ... Node *p = (Node *)malloc(sizeof(Node)); p->data = 1; ... }链表读取指定位置的元素void getNode(Node *L,int n,Node *tar){ int i=1; Node *p; ...
阅读全文
摘要:顺序存储优点:1 不用额外增加新的节点空间2 可以快速读取任意位置的元素顺序存储缺点:1 插入和删除需要移动大量元素2 长度变化较大时,难以估计长度3 存储空间碎片化读取时,时间复杂度为O(1);插入或删除时,时间复杂度为O(n);实例代码 1 /*Edit by Xhalo*/ 2 #include 3 #include 4 5 #define MAXSIZE 20 6 7 typedef struct seqList{ 8 int data[MAXSIZE]; 9 int length;10 }SL;11 12 13 int initElem(SL *L,int l...
阅读全文
摘要:#include <iostream>using namespace std;class A{ public: A(int *data, int len){} }; template<class T> class MaxHeap{ private: T *datas; int MaxSize; int currentSize; void KeepHeap(int root); bool del; public: MaxHeap(int MaxSize); MaxHeap(T *datas, int length); ~...
阅读全文
摘要:语法:add(chara[],charb[],chars[]);参数:a[]: 被乘数,用字符串表示,位数不限b[]: 乘数,用字符串表示,位数不限t[]: 结果,用字符串表示返回值: null注意: 空间复杂度为o(n^2) 需要string.h源程序: #include <iostream>#include <string.h>using namespace std;void add(char a[],char b[],char back[]){ int i,j,k,up,x,y,z,l; char *c; if(strlen(a)>strlen(b)) ..
阅读全文
摘要:问题说明: 若有一只兔子,每月生一只,一个月以后小兔子也开始生产。起初一只兔子,一个月以后两只兔子,两个月以后三只兔子,三个月后五只兔子。。算法描述: 简单的递归即可: #include <stdio.h>#include <stdlib.h>#define N 20int main(){ int Fib[N] = {0}; int i; Fib[0] = Fib[1] = 1; for(i=2;i<N;i++) Fib[i] = Fib[i-1] + Fib[i-2]; for(i=0;i<N;i++) printf("...
阅读全文
摘要:语法:mult(chara[],charb[],chars[]);参数:a[]: 被乘数,用字符串表示,位数不限b[]: 乘数,用字符串表示,位数不限t[]: 结果,用字符串表示返回值: null注意: 空间复杂度为o(n^2) 需要string.h源程序: #include <iostream>#include <string.h>using namespace std;void mult(char a[],char b[],char s[]){ int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0; char resu
阅读全文
摘要:问题描述: 给定无向图G=(V,E),其中V是非空集合,称为顶点集; E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。 如果U∈V,且对任意两个顶点u,v∈U有(u,v)∈E,则称U是G的完全子图。 G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。 如果U∈V且对任意u,v∈U有(u,v)∈E,则称U是G的空子图。G的空子图U是G的独立集当且仅当U不包含在G的更大的空子图中。G的最大独立集是G中所含顶点数最多的独立集。 对于任一无向图G=(V,E),其补图G'=(V'
阅读全文
摘要:算法描述: 活结点优先队列中结点元素N的优先级由该结点的上界函数Bound计算出的值uprofit给出。 子集树中以结点N为根的子树中任一结点的价值不超过N.profit。 可用一个最大堆来实现或节点优先队列。 N.weight 是结点N所相应的重量,N.profit是N所相应的价值,N.uprofit是结点N的价值上界,最大堆以这个值作为优先级。class Object{ friend int Knapsack(int *,int *,int ,int ,int *);public: int operator <= (Object a) const { ...
阅读全文
摘要:语法:mult(charc[],chart[],intm);参数: c[]: 被乘数,用字符串表示,位数不限 t[]: 结果,用字符串表示 m: 乘数,限定10以内返回值: null注意: 需要string.h源程序: #include <stdio.h>#include <stdlib.h>#include <string.h>void mult(char c[],char t[],int m){ int i,l,k,flag,add=0; char s[100]; l=strlen(c); for (i=0;i<l;i++) s[l-i-1]=..
阅读全文
摘要:题目说明: 创世纪时,Benares有一座波罗教塔,是由三只钻石棒所支撑,开始时神在第一根棒子上放置了64个由上至下 依小到大的排列的金盘,并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子的下面的原则。若每日仅搬一个盘子,则当盘子全数搬完时,此塔将会损毁,也就是世界末日来临之时。算法思路: 如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它搬至C,当有两个盘子,就将它当做辅助。 如果盘子超过2个,将第三个一下的盘子遮住,就简单了。 每次处理两个盘子,也就是 A->B,A->C,B->C这三个步骤,被遮住的部分。就进入递归处理。程序代码:
阅读全文
摘要:语法 intresult=factorial(intn);参数: n: n的阶乘返回值: 阶乘结果的位数注意: 本程序直接输出n!的结果,需要返回结果请保留longa[]inlclude <math.h>源程序: int factorial(int n){ long a[10000]; int i,j,l,c,m=0,w; a[0]=1; for(i=1;i<=n;i++) { c=0; for(j=0;j<=m;j++) { a[j]=a[j]*i+c; c=a[j]/10000; ...
阅读全文
摘要:问题描述: 印刷电路板不限区域划分成n*m个方格阵列。如下图所示 精确的电路布线问题要求确定连接方格a的中点,到连接方格b的中点的最短布线方案。 布线时,电路只能沿直线或直角布线。为了避免线路相交,已布的线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。分支限界法的解决方案: 首先,从起始位置a开始,将它作为第一个扩展结点。与该节点相邻,并且可达的方格成为可行结点被加入到活节点队列中,并且将这些方格标记为1. 即从起始方格a到这些扩展方格距离为1. 然后,从活节点队列中取出队首结点作为下一个扩展结点,并将于当前扩展结点相邻且为未标记过的方格标记为2,并存入或节点队列。 最...
阅读全文