随笔分类 -  算法设计与实现

摘要:参考文献:http://blog.minidx.com/2008/02/03/468.html正文在面试的时候二分查找是用的比较多一种查找算法,如何在面试官面前快速准确得的写出代码决定你是否能够被录取。以前一直以为二分查找很简单,所以就没怎么重视,但是真要在面试官面前对着黑板手写出来,还是漏洞百出。今天自己在电脑面前敲出了二分查找的代码,也花了将近半个小时。对于这种基础排序查找算法,还是得好好重视。二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。二分查找的一个条件是待查询的数组是有序的,我们假设这里的数组是升序的。二分查找的主要思路就是设定两个指针start和end 阅读全文
posted @ 2012-05-07 13:24 xwdreamer 阅读(23630) 评论(6) 推荐(6) 编辑
摘要:题目:用两个栈实现一个队列。队列的生命如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。template <typename T>class CQueue{public: CQueue(void); ~CQueue(void); void appendtail(const T& node); T deleteHead();private: stack<T> stack1; stack<T> stack2;};解题思路:插入操作在stack1中进行,删除操作在stack2中进行,如 阅读全文
posted @ 2012-05-03 15:17 xwdreamer 阅读(10610) 评论(0) 推荐(1) 编辑
摘要:1.排序算法简要比较名称数据对象稳定性时间复杂度空间复杂度描述平均最坏插入排序数组、链表√O(1)(有序区,无序区)。把无序区的第一个元素插入到有序区的合适的位置。对数组:比较得少,换得多。直接选择排序数组×O(1)(有序区,无序区)。在无序区里找一个最小的元素跟在有序区的后面。 对数组:比较得多,换得少。链表√堆排序数组×O(nlogn)O(1)(最大堆,有序区)。从堆顶把根卸出来放在有序区之前,再恢复堆。归并排序数组、链表√O(nlogn)O(n) +O(logn) , 如果不是从下到上把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行 阅读全文
posted @ 2012-04-06 19:06 xwdreamer 阅读(4436) 评论(0) 推荐(0) 编辑
摘要:1.编辑距离编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。例如将kitten一字转成sitting:sitten (k→s)sittin (e→i)sitting (→g)最小编辑距离代码实例View Code #include<iostream>#include<stdlib.h>#include<stdio.h>#i 阅读全文
posted @ 2011-06-21 01:05 xwdreamer 阅读(2295) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/wxbjs/articles/1507657.html一、什么是算法算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模n的函数f(n),算法执行的时间的增长率与f(n)的增长率正相关,称作渐进时间复杂度(Asymp 阅读全文
posted @ 2011-06-19 00:18 xwdreamer 阅读(2365) 评论(0) 推荐(1) 编辑
摘要:1.解析Prim算法和Dijkstra算法非常类似,他们的伪码几乎相近,只是他们优先队列所排序的键值不同而已。Prim算法的键值为节点与集合S中顶点间的最轻边的权重,而在Dijkstra算法中,键值为由起始点到某节点的完整路径长度。在后面的博客中会说明最小生成树MST与最短路径的区别。2.代码实例#include<iostream> #include<malloc.h> #include<queue> #include <algorithm> #include<stdlib.h> #include<functional>u 阅读全文
posted @ 2011-06-16 20:14 xwdreamer 阅读(2373) 评论(0) 推荐(0) 编辑
摘要:1.说明这个快速排序算法是对前面的快速排序算法QuickSort一种改进。只是修改了int Partition(int arry[],int start,int end)这个方法。2.思路仔细观察我们可以发现,我们前面Partition方法中,都需要swap(arry,start,end),但是这一步中有些步骤是可以省略的。在(<-end)过程中,碰到第一个小于等于pivot的元素时,只需要进行一次赋值arry[start]=arry[end];因为当前的arry[start]是值就是pivot;在(start->)过程中,碰到第一个大于等于pivot的元素之,只需要进行一次赋值a 阅读全文
posted @ 2011-06-16 01:59 xwdreamer 阅读(978) 评论(0) 推荐(0) 编辑
摘要:1.说明快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择。这边所介绍的第一个快速排序法版本,是在多数的教科书上所提及的版本,因为它最容易理解,也最符合轴心分割与左右进行排序的概念,适合对初学者进行讲解。2.解法这边所介绍的快速演算如下:一趟快速排序的算法是:设置两个变量start、end,排序开始的时候:start=1,end=N; 阅读全文
posted @ 2011-06-15 20:50 xwdreamer 阅读(4276) 评论(0) 推荐(1) 编辑
摘要:1.解析while循环其实不是只循环V-1次,因为如果找出的边能够形成环的话,这条边并不是我们需要的边,所以本次循环无效。while循环中其实包含了找出最小的功能,这个其实可以通过单独的一个函数来实现。就是按边长度升序来排列。kruskal算法其实是一个找边的算法,对于一V个顶点的图,必定由V-1条边构成一个最小生成树,那么按边的权值遍历图每一条边。判断如果添加这条选出的当前权最小的边,图中会不会生成一个环,如果生成环,则当前找到的这条边无效,继续找下一条权值最小边。每找出一条边,相当于图中合并了两个连通部件(初始化是一个顶点算一个连通部件),因此找到V-1条边就相当于是将原来分离的V个连通部 阅读全文
posted @ 2011-06-15 00:19 xwdreamer 阅读(808) 评论(0) 推荐(0) 编辑
摘要:更新所有的边,每条边更新V-1次,时间复杂度为O(V*E).有些更新操作是重复了的,这里可以考虑检查多余的重复操作作,如果没有更新发生,则立即终止算法。#include<iostream> #include<malloc.h> #include<queue> #include <algorithm> #include<stdlib.h> #include<functional>using namespace std; #define maxNum 100 //定义邻接举证的最大定点数 #define maxWeight 1 阅读全文
posted @ 2011-06-14 11:03 xwdreamer 阅读(569) 评论(0) 推荐(0) 编辑
摘要:1.解析该算法其实就是广度优先算法的改版,只是将广度优先算法中的普通队列改为了这里的优先队列。2.算法实例#include<iostream> #include<malloc.h> #include<queue> #include <algorithm> #include<stdlib.h> #include<functional>using namespace std; #define maxNum 100 //定义邻接举证的最大定点数 #define maxWeight 1000000 //边权最大值 //顶点信息ty 阅读全文
posted @ 2011-06-14 02:10 xwdreamer 阅读(907) 评论(0) 推荐(0) 编辑
摘要:本文实现的Dijkstra算法是最简单的方法,就是暴力搜索,其时间复杂度为O(V^2),后面会使用优先队列的方法,修改广度优先遍历来实现Dijkstra算法,这样的算法时间复杂度上会有所改善。代码实例:/*参考文献:http://baike.baidu.com/view/7839.htm算法流程:在以下说明中,s为源,w[u,v]为点u和v之间的边的长度,结果保存在dist[]1.初始化:源的距离dist[s]设为0,其他的点距离设为无穷大,同时把所有的点的状态设为没有扩展过。2.循环n-1次: 在没有扩展过的点中取一距离最小的点u,并将其状态设为已扩展。 对于每个与u相邻的点v,执行Rel. 阅读全文
posted @ 2011-06-13 21:21 xwdreamer 阅读(714) 评论(0) 推荐(0) 编辑
摘要:1.前言复习算法第四章——图中的路径,首先完成算法广度优先遍历,其中使用到了队列结构2.参考资料http://blog.csdn.net/lengyuhong/archive/2010/01/06/5145100.aspx3.相关博客在之前的博客中完成了图的深度优先遍历,也是使用邻接矩阵表示法。图的深度优先遍历(邻接矩阵表示法)4.代码实现#include<iostream> #include<malloc.h> #include<queue>#include<stdlib.h>using namespace std; #define maxNu 阅读全文
posted @ 2011-06-13 19:01 xwdreamer 阅读(11524) 评论(1) 推荐(0) 编辑
摘要:发现在平常的编码中,stack和queue用到的频率都非常高,自己写一个stack和queue又显得麻烦,今天特地研究如何使用STL中的stack和queue。研究的并不输入,只是一些简单用法而已。下面附上我的stack和queue使用代码#include<iostream>#include<stack>#include<queue>#include<stdlib.h>//system("pause");需要用到using namespace std;int main(){ stack<int> s; queue& 阅读全文
posted @ 2011-06-13 16:19 xwdreamer 阅读(2483) 评论(0) 推荐(0) 编辑
摘要:没有找到原文出处,请参考一下链接:http://www.cnblogs.com/hiside/archive/2010/12/01/1893878.htmlhttp://topic.csdn.net/u/20071023/11/3edb81fc-37b2-4506-906e-44dc0fc521f2.html一、无向图:方法1:如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。 n算法: 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。 第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。 如果最后还有未删除 阅读全文
posted @ 2011-06-11 21:44 xwdreamer 阅读(42271) 评论(2) 推荐(0) 编辑
摘要:1.前言期末复习算法,第三章讲到了图,所以想将课本中的算法实现。当写完代码的时候才发现这样的复习效率太低了,看书复习是复习,写代码是写代码。不过写完以后还是有点成就感的。2.参考文献http://blog.csdn.net/lengyuhong/archive/2010/01/06/5145100.aspx3.代码实现#include<iostream>#include<malloc.h>using namespace std;#define maxNum 100 //定义邻接举证的最大定点数int visited[maxNum];//通过visited数组来标记这个顶 阅读全文
posted @ 2011-06-11 15:12 xwdreamer 阅读(9026) 评论(0) 推荐(0) 编辑
摘要:图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List)。1. 邻接表的结点结构(1)表结点结构 ┌────┬───┐ │adjvex│next│ └────┴───┘ 邻接表中每个表结点均有两个域: ① 邻接点域adjvex 存放与vi相邻接的顶点vj的序号j。 ② 链域next 将邻接表的所有表结点链在一起。注意: 若要表示边上的信息(如权值),则在表结点中还应增加一个数据域。(2)头结点结构 ┌────┬─────┐ │vertex│firs... 阅读全文
posted @ 2011-04-15 09:27 xwdreamer 阅读(15841) 评论(0) 推荐(0) 编辑
摘要:1. 解题思路AKS算法整体包括六个步骤,它本身相当于一个过滤器,只有经过各种条件筛选以后的数才是素数。步骤如 REF _Ref288765521 /h 图 1 08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200380038003700360035003500320031000000所示。Step1就是判断n是否是一个数的幂次方形式,如果是的话就表明n是合数,程序结束。Step2需要找出比(log2n)2大的最小的欧拉函数r。Step3是找出gcd(a,n),如果存在a<=r的情况, 阅读全文
posted @ 2011-03-28 10:19 xwdreamer 阅读(1215) 评论(0) 推荐(1) 编辑
摘要:输入:要生成的随机数的位数输出:随机数因为是32位系统,因此只能生成9位长度的10进制数。如果是10位的话可能会出现负数。溢出。#include<math.h>#include<time.h>#include<stdio.h>#include<stdlib.h>long MyRand(int n){ static int inited=0; long X,k=1; int i; if(!inited) { srand((unsigned)time(0)); inited=1; } if(n==1) return... 阅读全文
posted @ 2011-03-21 10:05 xwdreamer 阅读(2993) 评论(0) 推荐(0) 编辑
摘要:genPrime和genPrime2是筛法求素数的两种实现,其实是一个思路,表示方法不同而已。具体思路在注释中已经含有。#include<iostream> #include<math.h> #include<stdlib.h>using namespace std; const int MAXV = 100; //素数表范围 bool flag[MAXV+1]; //标志一个数是否为素数 int prime[MAXV+1]; //素数表,下标从0开始 int size=0; //素数个数 void genPrime(int max) { memset(fl 阅读全文
posted @ 2011-03-21 10:04 xwdreamer 阅读(5710) 评论(0) 推荐(3) 编辑

点击右上角即可分享
微信分享提示