算法
文章平均质量分 64
wenlei_zhouwl
这个作者很懒,什么都没留下…
展开
-
插入法
#include /** *brief insertion sort * *param sortArray: the array which is to be sorted * *param size: the size of sortArray */template void InsertionSort(T* sortArray, int size){ for (int i = 1; i = 0; --j) { if (temp原创 2010-09-20 00:18:00 · 2528 阅读 · 0 评论 -
动态规划--最优二叉查找树
问题:假设n个已经排序的关键字{1,2,…,n},他们被搜索的概率分别为{p1,p2,…,pn},其它搜索值则被这些关键字分割,它们的概率为{q0,q1,…,qn}。q0代表搜索值小于1的可能性,qn代表搜索值大于n的可能性,qi(i=1,2,,…,n-1)代表搜索之大于i小于i+1的可能性。构建二叉搜索树,使得值搜索的期望代价最小。分析:令a[i][j]代表i->j的最优二叉搜索树的期望代价。于是我们可以得到以下递推式:这个算法的复杂度为O(n^3)。Knuth已经证明对于所有的1 代码:原创 2010-11-05 23:42:00 · 1621 阅读 · 0 评论 -
动态规划--计划一个公司聚会
<br />问题:Stewart教授是一家公司总裁的顾问,这家公司计划一个公司聚会。这个公司有一个层次结构;也就是,管理关系形成一棵以总裁为根的树。人事部给每个雇员以喜欢聚会的程度来排名,这是一个实数。为了使每个参加者都喜欢这个聚会,总裁不希望一个雇员和他(她)的直接上司同时参加。<br />Stewart教授面对一颗描述公司结构的树,使用了10.4节描述的左子女、右兄弟表示法。树中每个节点除了包含指针,还包含雇员的名字以及该雇员喜欢聚会的排名。描述一个算法,它生成一张客人列表,使得客人喜欢聚会的程原创 2010-11-07 00:44:00 · 3740 阅读 · 1 评论 -
动态规划--01背包问题
问题:0-1背包问题是一个经典的动态规划问题,问题定义如下:有n个物品,其重量分别为W={w1, w1, w3, ... wn},其价值分别为V={v1, v2, v3, .. vn}。现在要将这N个物品放入允许的最大重量为w的包中,问怎样选择物品能使包中的物品总价值最大。分析:构建二维数组a[n][w],a[i][j]代表将1->i个物品放入允许的最大重量为j的包中,所能产生的最大总价值。初始时,令a[i][0]=0(i = 0->n), a[0][j]=0(j = 0->w)。计算a[i原创 2010-11-07 13:37:00 · 1577 阅读 · 1 评论 -
动态规划--达到最高效益的调度
问题:假设有一台机器,以及在此机器上处理的n个作业a1,a2,...an的集合。每隔作业aj有一个处理时间tj,效益pj,以及最后期限dj。机器在一个时刻只能处理一个作业,而且作业aj必须在tj连续时间单位内不间断地运行。如果作业aj在最后期限dj之前完成,则获得效益pj,但如果在最后期限之后才完成,则没有效益。请给出一个动态规划算法,来寻找能获得最大量效益的调度,假设所有的处理时间都是1到n之间的整数。分析:其实这个问题类似于01背包问题。1. 将a1,a2,…,an按照dj值排序,从小原创 2010-11-07 14:04:00 · 4541 阅读 · 12 评论 -
广度优先遍历BFS
本文章代码中的图用邻接矩阵来表示,所以算法复杂度为O(V^2)。如果用邻接表来表示,那么算法的复杂度为O(V+E)。献上代码:#include #include #include #define MAXLENGTH 1000#define WHITE false#define BLACK trueusing namespace std;//the color of node ibool color[MAXLENGTH];//the parent of node iin原创 2010-11-08 22:38:00 · 1111 阅读 · 0 评论 -
深度优先遍历DFS
本文章代码中的图用邻接矩阵来表示,所以算法复杂度为O(V^2)。如果用邻接表来表示,那么算法的复杂度为O(V+E)。通过DFS,形成一个由多棵深度优先树所组成的深度优先森林。将原先图中的边添加到该森林之后,可以将所有边定义为以下四类:1. 树边:森林中自带的边(即不在森林生成后,从原先图中添加的边)。2. 反向边:从某个节点指向祖先的边,包括自己指向自己。非森林自带的边。如果图中存在反向边,则表明存在环。3. 正向边:从某个节点指向后代的边,非森林自带的边。4.原创 2010-11-09 00:03:00 · 3188 阅读 · 0 评论 -
单源最短路径通用解法—BellmanFord
<br />问题:在可能存在负边的情况下,计算有向图中某个起点s到其它所有点的最小距离。设w[i][j]为点i到j的边的权值,G为图的邻接表表示。BellmanFord算法可以用来求s到所有点的最小距离,当图中存在负边回路时,该方法返回false,否则返回true。每个点的最小距离存于distance[v]中,parent[v]为v的前一个节点。<br /><br />伪代码:<br />BellmanFord(G, w, s){ //initialization for eve原创 2010-11-14 00:06:00 · 1161 阅读 · 0 评论 -
DAG单源最短路径
对于有向无环图求单源最短路径,可以按照图中节点的拓扑顺序来求路径。伪代码:DagShortestPath(G, w, s){ topologically sort the nodes in G //initialization for each vertex v in G { distance[v] = infinite parent[v] = NULL; } distance[s] = 0 f原创 2010-11-14 12:00:00 · 2491 阅读 · 0 评论 -
floyd算法,求任意点间最短距离
<br />有向图G中可能存在负边,但不存在负边灰回路,此时求G上任意两点间的最短距离,可以用Floyd算法。W[i][j]代表i到j的边权值,如果i==j,则W[i][j]=0,如果i和j之间没有边,则W[i][j]=infinite。节点记号为1->n。<br /><br />构造d[k][i][j],它代表当从i到j的最短路径中所包含中间节点只能落在1->k时,所得最短路径长度。<br />递推式:<br />最终d[n][i][j]极为i到j的最短路径(因为它考虑了中间节点为1->n的所原创 2010-11-14 15:17:00 · 2462 阅读 · 0 评论 -
判断无向图中是否有环
转载自:http://blog.csdn.net/lyflower/archive/2008/03/01/2137710.aspx如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。n算法: 第一步:删除所有度 第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。 如果最后还有未删除顶点,则存在环,否则没有环。n算法分析: 由于有m条边,n个顶点。如果m>=n,则根据图论知识可直接判断存在环路。 (证明:原创 2010-11-10 18:57:00 · 4085 阅读 · 1 评论 -
Dijkstra单源最短路径
<br />对于权值非负的有向图单源最短路径求解,可以用Dijkstra算法。<br /><br />伪代码:<br />Dijkstra(G, w, s){ for each vertex v in G { distance[v] = infinite parent[v] = NULL color[v] = WHITE } distance[s] = 0 insert the vertexes原创 2010-11-14 12:37:00 · 1004 阅读 · 0 评论 -
动态规划--最长单调递增子序列
问题:找出一个n个数的序列X中最长的单调递增子序列。分析1:这里描述一个O(n^2)的算法,令c[i]表示:在a[0->i]中,当以a[i]为单调递增子序列最后一个元素时,所得最长单调递增子序列的长度。所以,我们可以得到递推式:代码:#include #define MAXLENGTH 1000using namespace std;/** * @brief Get the longest increasing subsequence. The time complexity i原创 2010-11-05 21:14:00 · 14065 阅读 · 0 评论 -
动态规划--整齐打印
<br />问题:考虑在一个打印机上整齐地打印一段文章的问题。输入的正文是n个长度分别为L1、L2、……、Ln(以字符个数度量)的单词构成的序列。我们希望将这个段落在一些行上整齐地打印出来,每行至多M个字符。“整齐度”的标准如下:如果某一行包含从i到j的单词(i<j),且单词之间只留一个空格,则在行末多余的空格字符个数为 M - (j-i) - (Li+ …… + Lj),它必须是非负值才能让该行容纳这些单词。我们希望所有行(除最后一行)的行末多余空格字符个数的立方和最小。请给出一个动态规划的算法,来在原创 2010-11-06 22:40:00 · 8606 阅读 · 2 评论 -
动态规划--双调欧几里得旅行商问题
问题描述: 欧几里得旅行商问题是对平面上给定的n个点确定一条连接各点的最短闭合旅程的问题。如图(a)给出了一个7个点问题的解。这个问题的一般形式是NP完全的,故其解需要多于多项式的时间。 J.L. Bentley 建议通过只考虑双调旅程(bitonic tour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。下图(b)显示了同样的7个点的最短双调路线。在这种情况下,多项式的算法是可能的。事实上,存在确定的最优双调路线的O(n*n)时间的算法。【动原创 2010-11-06 14:43:00 · 3646 阅读 · 5 评论 -
MergeSort归并排序
/** * @brief Merge the SubArray * * @tparam T: the data type * @param sortArray: the array to be sorted * @param start: the start position * @param mid: the middle position, which is the start position of the second sub-array and the position j原创 2010-10-14 22:28:00 · 695 阅读 · 0 评论 -
约瑟夫环的O(n)解决算法
问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,求最后一个出列人的编号。分析:1. 考虑当队列中还有Z个人,我们按照他们报数的先后顺序来排列,生成如下左序列。2. 这时,剔除第m个人时,我们按照下一次的报数先后顺序列出每个人员,m%(Z-1)则为下次第一个报名的人,生成序列如下中所示。3. 接下来,我们重新对他原创 2010-10-19 22:30:00 · 2484 阅读 · 0 评论 -
算法导论第四章习题:找出所缺的整数,VLSI芯片测试
<br />4.2 找出所缺的整数<br />问题:数组A[1..n]的每个元素均在0~n范围内且各不相同(显然,0~n中肯定有个数不在数组A[1..n]内)。数组A[1..n]中的元素只能按位访问(如:取A[i]的第j位),访问一位所花费的时间为常数。现在的任务是给出一个算法,在O(n)时间内找出0~n中不在A[1..n]中的数。<br /><br />解决思路:<br />1. 针对A[1,…,n]里面的元素,如果第一位(从右到左)是0,则去掉第一位并放到偶数数组里面;如果第一位是1,原创 2010-10-23 01:13:00 · 2006 阅读 · 0 评论 -
堆排序
<br />#ifndef HEAP_SORT_H#define HEAP_SORT_H#define Parent(i) (i / 2)#define Left(i) (2 * i)#define Right(i) (2 * i + 1)//the root is at index 1/** * @brief Make tree i to be Max-Heap when its Left and Right sub-trees are Max-Heap. The com原创 2010-10-29 22:14:00 · 736 阅读 · 0 评论 -
快排
} else { //swap element at i and j T temp = array[i]; array[i++] = array[j]; array[j--] = temp; break;原创 2010-10-31 11:04:00 · 858 阅读 · 4 评论 -
计数排序,基数排序
计数排序(CountingSort)#ifndef COUNTINGSORT_H#define COUNTINGSORT_H/** * @brief Counting sort the array "from" to array "to", from small to large. The complexity is O(n + k). This method applies to such situation: * the n elements in the array are inte原创 2010-10-31 23:18:00 · 867 阅读 · 0 评论 -
桶排序
桶排序(BucketSort)桶排序基于这样的假设:输入由一个随机过程产生,该过程将元素均匀而独立地分散在[0,1)上。BucketSort(array){ n = array.size() insert array[i] to list[n*array[i]] for i = 0 to n - 1 Insert Sort every list[i] concatenate list[0], list[1], ..., list[n - 1]原创 2010-11-01 00:09:00 · 680 阅读 · 0 评论 -
排序不同长度的数据项
问题一:给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但该数组中,所有整数中总的数字数是n。说明如果在O(n)时间内对该数组进行排序。解体思路:1. 数组中的元素总共m个,对每个元素构造struct{element, length},将这m个struct进行桶排序,存入Bucket[1], ..., Bucket[k]中,合并到数组T中。过程1算法复杂度为O(m)。2. 进行基数排序:i从1到k,第i次循环时,分两种情况讨论: (1)将T中元素的第i位进行计数排序,并将struct.l原创 2010-11-01 17:56:00 · 1071 阅读 · 0 评论 -
随机访问数组中第i大的元素
<br />在快排的基础上进行算法实现,只是每次分区之后只选择第i大的元素所在的区域进行查找。平均算法复杂度为O(n),最差算法复杂度为O(n^2),如同快排一样,出现最差情况的概率极低。<br />#ifndef RANDOMSELECT_H#define RANDOMSELECT_H#include <iostream>/** * @brief Exception class which means that i is larger than the number of elemen原创 2010-11-01 20:44:00 · 1091 阅读 · 0 评论 -
二叉搜索树
<br />#ifndef BINARYSEARCHTREE_H#define BINARYSEARCHTREE_H#include <cstdlib>#include <iostream>template <typename T>struct Node{ struct Node<T> *parent; struct Node<T> *left; struct Node<T> *right; T value;};template <ty原创 2010-11-04 00:02:00 · 643 阅读 · 0 评论 -
动态规划--装配线调度问题
问题描述:一个找出通过工厂装配线的最快方式的制造问题。共有两条装配线,每条有n个装配站,装配线i的第j个装配站完成工作需要的时间为a[i][j] 。在通过i装配线的第j个装配站后,产品可以直接进入i装配线的j+1个装配站,当中不需要损耗时间;产品也可以进入另外一条装配线的j+1个装配站,这个过程需要损耗t[i][j]时间。产品从初始站进入装配线分别需要损耗时间为e[0],e[1] ,产品从装配线进入终点站分别需要时间为x[0],x[1]。求一个产品从初始站到达终点站的最快路径。分析:当j>1时,从初始站到完原创 2010-11-05 16:34:00 · 2901 阅读 · 0 评论 -
动态规划--最长公共子序列
问题:已知整数序列X,Y,长度分别为m,n,求出它们的最长公共子序列。子序列的定义如下:给定一个序列X={x1, x2, …, xm},另一个序列Z={z1, z2, …, zk}是X的一个子序列,如果存在X的一个严格递增下标序列{i1, i2, …., ik},使得对于所有的j=1,2, …, k,有xij = zj。分析:令a[i][j]代表序列X[1->i]和Y[1->j]的最长公共子序列。则可获得递推式代码#include #define MAXLENGTH 1000using name原创 2010-11-05 18:31:00 · 1214 阅读 · 0 评论 -
float,double 的范围和有效数字怎么算出来的?
首先说一下: 范围是3.4E-38 ——3.4E+38,可提供7位有效数字。 上述这两个量都是近似值,各个编译器不太一样的。 下面我就将标准值是怎么定义的,和你说一下: 这个比较复杂,建议你找一下IEEE754标准看一下。 这个简单说一下吧: 在IEEE754标准中进行了单精度浮点数(float)和双精度数浮点数(double)的定义。float有32bit,doubl转载 2012-04-23 10:48:17 · 10723 阅读 · 2 评论