随笔分类 - Algorithm
摘要:思路:a、对图进行深度优先搜索b、求图的转置c、按照a中求得的finish time从大到小排列,按此顺序对转置图进行深度优先搜索d、得到的深度优先森林即为图的强连通分支
阅读全文
摘要:两种思路一a、找到图中入度为零的顶点,并输出b、删除该顶点,并修改其他顶点的入度c、如果还有入度为零的顶点,则转a,否则输出二a、进行深度优先搜索b、按finish time反序排列,即为拓扑序列solution1 1 int Is_ZeroDegree(int* a,int n) 2 { 3 for(int i=0;i<n;++i) 4 if(a[i]==0) 5 return i; 6 return n; 7 } 8 9 void Topo_Sort1(const Graph* g)10 {11 int indegree[5...
阅读全文
摘要:dfs nonrecursion 1 int _visited[50]; 2 void DFS_Norecursion(const Graph* g) 3 { 4 for(int i=0;i<g->v;++i) 5 { 6 _visited[i]=0; 7 p_dfs[i]=0; 8 } 9 int pp=0;10 for(int i=0;i<g->v;++i)11 {12 int m=i;13 while(!s.empty() || _visited[m]==0)14 ...
阅读全文
摘要:二项树Bk是一种递归定义的有序树,B0只包含一个结点,Bk由两颗Bk-1连接而成,其中一棵树的根是另一颗树的根的最左孩子。二项树Bk的性质:a、共有2k个结点b、树的高度为kc、在深度i处恰有Cki个结点,其中i=0,1,...,kd、根的度数为k,大于任何其他结点的度数,并且如果根的子女从左到右编号为k-1,k-2,...,0,子女i是子树Bi的根二项堆H由一组满足下列性质的二项树组成:a、H中的每个二项树遵循最小堆性质:结点的关键字大于等于其父结点的关键字b、对任意非负整数k,在H中至多有一颗二项树的根具有度数k在包含n个结点的二项堆H中,将n表示成二进制形式(有lgn+1位),当第i位为
阅读全文
摘要:定义:(1)每个结点有以下域:a、n(x):当前存储在结点x中的关键字数b、n(x)个关键字本身,以非降序存放,因此key(x)[1]<=key(x)[2]<=...<=key(x)[n(x)]c、leaf(x),是个布尔值,如果x是叶子的话,则他为true,如果x为一个内结点,则为false(2)每个内结点x还包含n(x)+1个指向其子女的指针c(x)[1],c(x)[2],...,c(x)[n(x)+1],叶结点没有子女,故他们的c域无定义(3)各关键字key(x)[i]对存储在各子树中的关键字范围加以分隔,如果k[i]为存储在c(x)[i]为根的子树中的关键字,则k[1
阅读全文
摘要:huffman1 //C保存所用的字符2 HUFFMAN(C)3 n=length(C)4 把C里的字符按频度从小到大组织成最小二叉堆5 for(i=1;i<n-1;++i)6 取出二叉堆的前两个字符,以他们为左右孩子节点组成一棵树7 该树的根节点频度为二者之和,将该根节点插入二叉堆8
阅读全文
摘要:使用贪心算法来解决数据结构1 //Eleven activities,sort by finish time already, that's important.2 int Start[]={1,3,0,5,3,5,6,8,8,2,12};//Start time3 int Finish[]={4,5,6,7,8,9,10,11,12,13,14};//Finish time4 int n=11;//Eleven activities5 6 vector<int> Activity;//vector containing activities you choose贪心算法
阅读全文
摘要:给定一个由n个互异的关键字组成的序列K={k1,k2,...,kn},且关键字有序,对于每一个关键字ki,一次搜索为ki的概率是pi。某些搜索的值可能不在K内,因此还有n+1个虚拟键d0,d1,...,dn代表不再K内的值。d0代表所有小于k1的值,dn代表所有大于kn的值,对于i=1,2,...,n-1,di代表所有位于ki和ki+1之间的值。对每个虚拟键di,一次搜索对应于di的概率是qi。定义在T内一次搜索的期望代价为E=∑(depth(ki)+1)*pi+∑(depth(di)+1)*qi=1+∑depth(ki)*pi+∑depth(di)*qi一颗最优二叉查找树就是期望代价最小的B
阅读全文
摘要:一个给定序列的子序列就是该给定序列中去掉零个或者多个元素。给定一个序列X={x1,x2,...,xm},对i=0,1...,m,定义X的第i个前缀Xi={x1,x2,...,xi},X0是个空序列。定理:设X={x1,x2,...,xm}和Y={y1,y2,...,yn}为两个序列,并设Z={z1,z2,...,zk}为X和Y的任意一个LCS。(1) 如果xm=yn,那么zk=xm=yn,且Zk-1是Xm-1和Yn-1的一个LCS(2) 如果xm!=yn,那么zk!=xm蕴含Z是Xm-1和Y的一个LCS(3) 如果xm!=yn,那么zk!=yn蕴含Z是X和Yn-1的一个LCS定义c[i][j]
阅读全文
摘要:矩阵链乘法问题:给定n个矩阵构成的一个链<A1,A2,...,An>,其中i=1,2,...,n,矩阵Ai的维数为pi-1 X pi,对成绩A1A2...An以一种最小化标量乘法次数的方式进行加全部括号两个矩阵相乘对于AiAi+1...Aj,设m[i][j]为计算矩阵Ai..j所需的标量乘法运算次数的最小值,可知m[i][i]=0。则求m[i][j]的递归定义为:m[i][j]=0(if i==j) or min{m[i][k]+m[k+1][j]+pi-1pkpj}(if i<j and i=<k<j)下面的程序利用动态规划自底向上计算最小乘法运算次数,设m[i
阅读全文
摘要:全局变量 1 /* 2 There are 2 lines, each line has 5 station. 3 Pass only one station per line, from left to right. 4 Find the fastest way from enter to exit. 5 Dynamic Programming 6 */ 7 8 //enter price per line 9 int e[]={2,4};10 11 //exit price per line12 int x[]={3,6};13 14 //price per station15 in...
阅读全文
摘要:左旋&&右旋Left Rotate 1 LEFT-ROTATE(T,x) 2 y=RIGHT(x) 3 RIGHT(x)=LEFT(y) 4 if(LEFT(y)!=NIL(T)) 5 P(LEFT(y))=x 6 P(y)=P(x) 7 if(P(x)==NIL(T)) 8 Root(T)=y 9 else if(LEFT(P(x))==x)10 LEFT(P(x))=y11 else12 RIGHT(P(x))=y13 LEFT(y)=x14 P(x)=y15 16 Right...
阅读全文
摘要:BST的定义1 //Definition of a Binary Search Tree2 typedef struct BST3 {4 int value;5 struct BST* left;6 struct BST* right;7 }BST; 8 BST* root=new BST;初始化 1 /*Initialization of a BST, based on values in a vector. 2 First element of the vector fills the root, then others will be in the proper...
阅读全文
摘要:Q:我们希望通过利用在一个非常大的数组上直接寻址的方式来实现字典。开始时,该数组中可能包含废料,但要对整个数组进行初始化是不实际的,因为该组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个存储的对象占用O(1)空间;操作SEARCH、INSERT和DELETE的时间为O(1);对数据结构初始化的时间为O(1)。A:增加两个动态数组,S和S',类似于栈,初始化时都为空,当某个关键字变成有效时,压入数组,其最大大小为实际存储在字典中的关键字数目。记直接寻址表为T,当某个关键字k变有效时,T[k]里存储S和S'的索引i,即T[K]=i;S[i]里存储那个有效的关键字k,即S[
阅读全文
摘要:树结点定义TreeNode1 typedef struct Node2 {3 int value;4 struct Node* left;5 struct Node* right;6 bool visited;7 }iNode;前序遍历的递归和非递归算法PreOrder 1 void PreOrder(iNode* r) 2 { 3 if(r==NULL) 4 return; 5 cout <<r->value<<" "; 6 PreOrder(r->left); 7 PreOrder(r->right); 8 }...
阅读全文
摘要:当没有指针和对象时,应该怎么实现链表呢?参考算法导论,给出两种实现方式:1、多重数组表示对于双向链表而言,由三个长度一样的数组来表示,分别为Prev[n],Next[n],Value[n]。下标相同的三个数组元素组成一个链表元素。Value[n]里存放的是链表元素的值,Prev[n]和Next[n]里存放的是数组的索引,表示该链表元素的前面和后面分别是什么。链表中的第一个元素的前缀为空,因此可以在Prev数组相应位置存放-1,最后一个元素的后缀同样操作。链表头元素所在数组的索引存放在单独的一个变量中。这个多重数组表示的链表为2、单数组表示在足够大的一维数组中,链表的每个元素占据一组连续位置,在
阅读全文
摘要:无聊写了一个链表。。ListTable 1 typedef struct Node 2 { 3 int value; 4 struct Node* prev; 5 struct Node* next; 6 }iNode; 7 8 9 typedef struct List10 {11 iNode* head;12 }ListTable;13 14 15 iNode* ListSearch(ListTable* table,int x)16 {17 iNode* node=table->head;18 while(node!=NULL&&nod...
阅读全文
摘要:Concept:顺序统计量(order statistic):一个集合中按照大小顺序排列的位数。Tips:1、对集合进行快速排序。2、将要求的第k位顺序统计量和第一步得到的pivot在数组中的位置相比较,如果相等,则pivot就是第K位的值,否则根据比较结果进行递归。首先,快速排序partition代码:Partition 1 /* 2 Input:an array,and its number of elements. 3 Functioning:Quick sort this array by arr[0] as pivot 4 Output:the new pos...
阅读全文
浙公网安备 33010602011771号