02 2012 档案
摘要:有以下多种容器:1、数组(array)2、动态数组(dynamic array)3、链表(linked list)4、栈(stack)5、队列(queue)6、双向队列(deque)7、优先级队列(priority queue)8、树(tree)9、二叉查找树(binary search tree)10、二叉堆(binary heap)11、字典(dictionary)12、集合(set)13、图(graph)14、有向无环图(directed acyclic graph)容器操作:1、插入(insert)2、移除(remove)3、顺序遍历(sequential access)4、随机遍历(
阅读全文
摘要:动态内存分配速度很慢。影响因素有二:1、堆分配需要处理任何大小的分配,所以管理支出较大;2、大多数OS中调用malloc()和free()必须首先从用户模式切换到内核模式,处理完后再切换回来。所以需要自己定制的内存分配器!一、Stack-Based Allocators1、分配大段连续的内存块(malloc() or new or array)2、维护一个指向栈顶的指针。初始化指针指向内存最低地址处。运行过程中,内存地址低于栈顶的都是正在使用的内存块,内存地址高于栈顶的都是未被使用的内存块。3、每次分配只需要将指针往内存高地址处移动;每次施放内存只需要将指针往内存低地址处移动。4、需要一个标记
阅读全文
摘要:错误的方式一wrong solution1 1 class RenderManager 2 { 3 public: 4 RenderManager() 5 { 6 //start up the manager... 7 } 8 ~RenderManager() 9 {10 //shut down the manager... 11 }12 //...13 };14 15 //singleton instance16 static RenderManager gRenderManage...
阅读全文
摘要:使用贪心策略,伪代码如下mst1 GENERIC-MST(G,w)2 A=空集3 while(A不形成生成树)4 找到一条安全边5 将此边添加到A中去6 return A在Kruskal算法中,集合A是一个森林,加入集合A中的安全边总是图中连接两个不同连通分支的最小权边。在Prim算法中,集合A仅形成单棵树,添加入集合A的安全边总是连接树与一个不在树中得顶点的最小权边。info 1 typedef struct Edge 2 { 3 int adj_vertex; 4 int weigh...
阅读全文
摘要:思路: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...
阅读全文
浙公网安备 33010602011771号