BFS(广搜): 广搜就是广度优先搜索,根据名字可以知道,是通过广度来遍历图,也就是层次遍历吧. 在这里以及下面的DFS(深搜),都用到了颜色WHITE,GRAY,BLACK,不过作用不同,具体分别再分析. 在BFS中,WHITE,GRAY,BLACK这三色是用来记录一个点是否被搜到,以及是否它的邻接点都是灰色.(具体见P324倒数第2段). P326 的图22-3是个经典的图,看了此图基本就知道BFS是干嘛的了. 在图22-3中,因为他是用字母表示的,我把各点定义为顺时针从标号1开始,于是r点…
(搬运)<算法导论>习题解答 Chapter 22.1-1(入度和出度) 思路:遍历邻接列表即可; 伪代码: for u 属于 Vertex for v属于 Adj[u] outdegree[u]++; indegree[v]++; 源代码: package C22; import java.util.Iterator; public class C1_1 { static int[] indegree; static int[] outdegree; static Adjacent_List…
前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜索树,它通过在每一个结点附加颜色位和路径上的一些约束条件能够保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).以下会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码. 先给出红黑树的结点定义: #define RED 1 #define BLACK 0 ///红黑树结点定义,与普通…
一.什么叫最小生成树 一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时T无回路且连接所有的顶点,所以它必须是棵树. 二.为什么要研究最小生成树问题 <算法导论>上举了电子线路设计的例子.而在经济学.生物学中也常应用最小生成树. 三.如何求一个无向连通图的最小生成树 <算法导论>中提取讲解了两种得到最小生成树的算法,一是Kruskal算法,另一种是Prim算法.这两种算法都使用了贪心策略. 先说明几个概念: 安全边:A是G的某最小生成树的子集,…
转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------------------- dynamic programming is a method for solving complex problems by breaking them down into simpler subproblems. (通过把原问题分解为相对简单的子问题的方式求解复杂问题的…
对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思路例如以下: 1.分解:将A[p,r]分解成A[p,q-1]和A[q+1,r]两部分.使得A[p,q-1]都小于A[q],A[q+1,r]都不小于A[q]; 2.求解:假设A[q]恰好是第k小元素直接返回,假设第k小元素落在前半区间就到A[p,q-1]递归查找.否则到A[q+1,r]中递归查找. 3…
一.邻接矩阵实现 思路:如果是邻接矩阵存储,设邻接矩阵为A,则A*A即为平方图,只需要矩阵相乘即可: 伪代码: for i=1 to n for j=1 to n for k=1 to n result[i][j]+=matrix[i][k]*matrix[k][j]; 算法复杂度 两个n维数组相乘,因此复杂度为O(V^3),当然可以通过Strassen算法稍加改进. 扩展:这种方法的作用是比如求u到v路径长度为k的路径数目,只需要求A^k,然后[u][v]即可. 算法正确性分析 命题:给定两点…
1. 红黑树(RED-BLACK TREE)引言: ------------------------------------- 红黑树(RBT)可以说是binary-search tree的非严格的平衡版本.与之相应的是平衡二叉树(Balanced Binary Tree)又称之为AVL树(因为是G.M. Adelson-Velsky 和 E.M. Landis在1962年发明的这棵树)是binary-search tree的严格的平衡版本. BST达到最平衡的状态称之为AVL.在AVL树中任何…
一般散列表都与B+树进行比较,包括在信息检索中也是. 确定某条边是否存在需要O(1). 不足: (1)散列冲突. (2)哈希函数需要不断变化以适应需求. 另外:B+树.(见第18章) 与散列表相比的不足: (1)插入需要O(lgn) (2)树要保持平衡. (原文点此,索引目录.感谢xiazdong君 && Google酱.这里是偶尔做做搬运工的水果君(^_^) )…
思路:设置两个游标i指向行,j指向列,如果arr[i][j]==1,则i=max{i+1,j},j++:如果arr[i][j]==0,则j=max{i+1,j+1}. 伪代码: has_universal_sink() for i=1 to N //对角线检查是否全是0 if A[i][i]==1 return false; i=1,j=2 while(i<=N && j<=N) if(A[i][j]==1) i=max{i+1,j} j++ else j=max{i+1,j+…