
算法设计与实现
xw13106209
喜欢交朋友
展开
-
关于ubuntu 是否需要使用std::到问题。
首先是在ubuntu下编译c++要使用g++,比如g++ -Wall 01knap2.cpp -o 01knap2 而如果是编译c语言文件的话则需要用gcc -Wall 01knap2.c -o 01knap2 即可,g++编译得到的是.cpp文件,而gcc编译得到的是.c文件。 第二个是关于是否能够直接使用cout,cin,end的问l题,如果在文件头上原创 2009-11-29 00:24:00 · 1172 阅读 · 0 评论 -
判断一个图是否有环 无向图 有向图
没有找到原文出处,请参考一下链接:http://www.cnblogs.com/hiside/archive/2010/12/01/1893878.htmlhttp://topic.youkuaiyun.com/u/20071023/11/3edb81fc-37b2-4506-906e-44dc0fc521f2.html一、无向图:方法1:如果存在回路,则必存在一个子图,是一个环路。环路中原创 2011-06-11 21:44:00 · 21852 阅读 · 3 评论 -
图的深度优先遍历DFS(邻接矩阵表示法)
1.前言期末复习算法,第三章讲到了图,所以想将课本中的算法实现。当写完代码的时候才发现这样的复习效率太低了,看书复习是复习,写代码是写代码。不过写完以后还是有点成就感的。2.参考文献http://blog.youkuaiyun.com/lengyuhong/archive/2010/01/06/5145100.aspx3.代码实现#include#includeusing name原创 2011-06-11 15:12:00 · 7201 阅读 · 0 评论 -
STL中stack和queue的用法
发现在平常的编码中,stack和queue用到的频率都非常高,自己写一个stack和queue又显得麻烦,今天特地研究如何使用STL中的stack和queue。研究的并不输入,只是一些简单用法而已。下面附上我的stack和queue使用代码#include#include#include#include//system("pause");需要用到using namespac原创 2011-06-13 16:19:00 · 2007 阅读 · 0 评论 -
图的广度优先遍历BFS(邻接矩阵表示法)
1.前言复习算法第四章——图中的路径,首先完成算法广度优先遍历,其中使用到了队列结构2.参考资料http://blog.youkuaiyun.com/lengyuhong/archive/2010/01/06/5145100.aspx3.相关博客在之前的博客中完成了图的深度优先遍历,也是使用邻接矩阵表示法。图的深度优先遍历(邻接矩阵表示法) 4.代码实现#inc原创 2011-06-13 19:01:00 · 4194 阅读 · 0 评论 -
Dijkstra算法求单源最短路径(一)
本文实现的Dijkstra算法是最简单的方法,就是暴力搜索,其时间复杂度为O(V^2),后面会使用优先队列的方法,修改广度优先遍历来实现Dijkstra算法,这样的算法时间复杂度上会有所改善。代码实例:/*参考文献:http://baike.baidu.com/view/7839.htm算法流程:在以下说明中,s为源,w[u,v]为点u和v之间的边的长度,结果保存在原创 2011-06-13 21:21:00 · 1652 阅读 · 0 评论 -
Dijkstra算法求单源最短路径(二)(BFS的改版)
1.解析该算法其实就是广度优先算法的改版,只是将广度优先算法中的普通队列改为了这里的优先队列。2.算法实例#include #include #include #include #include #includeusing namespace std; #define maxNum 100 //定义邻接举证的最大定点数原创 2011-06-14 02:10:00 · 1550 阅读 · 0 评论 -
含有负边的图的最短路径(Bellman_ford算法)
更新所有的边,每条边更新V-1次,时间复杂度为O(V*E).有些更新操作是重复了的,这里可以考虑检查多余的重复操作作,如果没有更新发生,则立即终止算法。#include #include #include #include #include #includeusing namespace std; #define maxNum原创 2011-06-14 11:03:00 · 1577 阅读 · 0 评论 -
快速排序算法QuickSort(二)
1.说明这个快速排序算法是对前面的 快速排序算法QuickSort 一种改进。只是修改了int Partition(int arry[],int start,int end)这个方法。2.思路仔细观察我们可以发现,我们前面Partition方法中,都需要swap(arry,start,end), 但是这一步中有些步骤是可以省略的。 在( 因为当前的arry[start]是值就原创 2011-06-16 01:59:00 · 1236 阅读 · 0 评论 -
Prim算法求最小生成树MST以及和kruskal算法的对比
1.解析Prim算法和Dijkstra算法非常类似,他们的伪码几乎相近,只是他们优先队列所排序的键值不同而已。Prim算法的键值为节点与集合S中顶点间的最轻边的权重,而在Dijkstra算法中,键值为由起始点到某节点的完整路径长度。在后面的博客中会说明最小生成树MST与最短路径的区别。2.代码实例#include #include #include #in原创 2011-06-16 20:14:00 · 3552 阅读 · 0 评论 -
Kurskal算法生成最小生成树MST
1.解析while循环其实不是只循环V-1次,因为如果找出的边能够形成环的话,这条边并不是我们需要的边,所以本次循环无效。while循环中其实包含了找出最小的功能,这个其实可以通过单独的一个函数来实现。就是按边长度升序来排列。kruskal算法其实是一个找边的算法,对于一V个顶点的图,必定由V-1条边构成一个最小生成树,那么按边的权值遍历图每一条边。判断如果添加这条选出的当前权最小的边,图原创 2011-06-15 00:19:00 · 1410 阅读 · 0 评论 -
编辑距离
#include#include#include#includeusing namespace std;#define maxNum 100char a[maxNum],b[maxNum];//存放输入字符串int c[maxNum][maxNum];//动态规划二维表int diff(char a,char b)//判断字符a,b是否相等, 相原创 2011-06-21 01:05:00 · 994 阅读 · 0 评论 -
经典算法解析
http://www.cnblogs.com/wxbjs/articles/1507657.html一、什么是算法算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用转载 2011-06-19 00:18:00 · 1488 阅读 · 0 评论 -
有向图的邻接表表示法
在邻接表表示法中,有两种结点,分别是头结点和表结点头结点后面跟的表结点表示是所有起点为头结点,终点为表结点的边。#includeusing namespace std;#define MAX_VERTEX_NUM 50//定义图的最大顶点数typedef char VertexData;typedef struct EdgeNode//表结点{ int adjvex;//邻接点域 VertexData data; EdgeNode *next;//边结点所对应的下一个边结点原创 2011-04-15 09:27:00 · 16858 阅读 · 0 评论 -
基于AKS素性检测的素数生成器
1. 解题思路<br />AKS算法整体包括六个步骤,它本身相当于一个过滤器,只有经过各种条件筛选以后的数才是素数。步骤如图1所示。 Step1就是判断n是否是一个数的幂次方形式,如果是的话就表明n是合数,程序结束。 Step2需要找出比(log2n)2大的最小的欧拉函数r。 Step3是找出gcd(a,n),如果存在a<=r的情况,则输出合数 Step4表明如果n<=r,则输出素数。 Step5是最麻烦的一部,其中涉及到了多项式取模运算,对于多项式的取模运算我们这里使用了一个叫做NTL的C+原创 2011-03-28 10:19:00 · 5770 阅读 · 0 评论 -
筛法求素数
genPrime和genPrime2是筛法求素数的两种实现,其实是一个思路,表示方法不同而已。具体思路在注释中已经含有。#include#includeusing namespace std;const int MAXV = 100; //素数表范围bool flag[MAXV+1]; //标志一个数是否为素数int prime[MAXV+1]; //素数表,下标从0开始int size=0; //素数个数void genPrime(int max){ memset(fl原创 2011-03-21 10:04:00 · 1020 阅读 · 0 评论 -
回溯法之01背包问题
解01背包问题有很多种方法,就我知道的就有动态规划,回溯法,分支界限法这几种,下面就列出我的回溯法解法,以供参考 #include#include using namespace std;class Knap{public: Knap(double *pp,double *ww,double cc,int nn)//构造函数 { p=pp; w=原创 2009-12-02 19:38:00 · 11642 阅读 · 1 评论 -
队列式分支界限法之装载问题
从上个星期就一直卡着的用队列式分支界限法解装载问题终于在今天告破,心里那个激动啊,想想为什么一个星期都没有找出错误呢,是因为我自己只看代码而不去进一步推敲他,今天自己在草稿纸上推导了一遍,一下子就发现错误了,那么为什么我以前不推导呢,太懒了呗。呵呵。言归正传吧,下面贴出我的代码,供自己以后参考使用。#include#include using namespace std;原创 2009-12-02 19:26:00 · 3686 阅读 · 0 评论 -
最大堆MaxHeap和最小堆MinHeap的实现
优先队列式分支界限法解装载问题中需要用到最大堆MazHeap,但是书上没有给出代码,所以只能我们自己写了,下面我贴出这两个数据结构的代码,以供参考。解决了这两个数据结构,那么优先队列式分支界限法就很好实现了。最大堆MaxHeap:#includeusing namespace std;typedef struct Heap{ int capacity; i原创 2009-12-04 20:07:00 · 11807 阅读 · 0 评论 -
动态规划之01背包问题
先贴代码: #includeusing namespace std;int c[10][100];/*行代表是覆盖的背包个数,而列代表背包容量*/int Knapsack(int n,int m){ int i,j; int w[10],v[10];/*分别代表各个物品的重量和价值*/ for(i=1;i<=n;i++) scanf("%d%d",&w[i原创 2009-12-04 20:27:00 · 3592 阅读 · 0 评论 -
malloc函数详解
一、原型:extern void *malloc(unsigned int num_bytes);头文件:#include 或 #include (注意:alloc.h 与 malloc.h 的内容是完全一致的。)功能:分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释原创 2009-12-08 11:14:00 · 336854 阅读 · 30 评论 -
struct和typedef struct的用法
我首先想到的去MSDN上看看sturct到底是什么东西,虽然平时都在用,但是每次用的时候都搞不清楚到底这两个东西有什么区别,既然微软有MSDN,我们为什么不好好利用呢,下面是摘自MSDN中的一段话: The struct keyword defines a structure type and/or a variable of a structure type. A str原创 2009-12-08 22:00:00 · 8961 阅读 · 0 评论 -
优先队列式分支界限法之装载问题
弄了两个星期,终于把这个问题给解决了,解放了。不过感觉自己的代码太乱了,还有好多地方要改进,比如封装行不强,怎么改写成类的形式还有待完善,不过现在将就着吧,挺有成就感的了。代码如下: #includeusing namespace std;/*****************************************************************原创 2009-12-08 23:37:00 · 4099 阅读 · 0 评论 -
优先队列式分支界限法之01背包问题
解01背包问题的第三种解法也终于被我攻破了,这个方法里面有许多和前面回溯相同的地方,结构基本相同,只是这里引入了一个大顶堆而已,所以如果综合前面的方法,再看这里的优先队列式解法的话会很容易理解。好了,不多说,下面是代码:#include #include #include "heap.h"using namespace std; class Kna原创 2009-12-10 00:21:00 · 19904 阅读 · 8 评论 -
两个栈实现一个队列
<br />#include<stdio.h>bool STACK_EMPTY(int &top){ if(top==0) return true; else return false;}void PUSH(int *S,int x,int &top){ top=top+1; S[top]=x;}int POP(int *S,int &top){ if(STACK_EMPTY(top)) return -1; else top=原创 2011-01-03 20:33:00 · 991 阅读 · 0 评论 -
使用数组实现栈stack功能
《算法导论》数据结构那一章节的练习。#includeint SS[10];//定义一个数组作为stackint top=0;//定义stack的指针bool STACK_EMPTY()//判断stack是否为空{ if(top==0) return true; else return false;}void PUSH(int *S,int x)//入栈操作{ top=top+1; S[top]=x;}int POP(int *S)//出栈操作原创 2011-01-03 20:23:00 · 1350 阅读 · 0 评论 -
AES算法介绍
对称密码算法主要用于保证数据的机密性,通信双方在加密/解密过程中使用它们共享的单一密钥。对称密码算法的使用相当广泛,密码学界已经对它们进行了深入的研究 。最常用的对称密码算法是数据加密标准(DES) 算法,它是由IBM在美国国家安全局(NSA) 授意之下研制的一种使用56 位密钥的分组密码算法。自1977 年公布成为美国政府的商用加密标准以来已使用20 多年 。DES 的主要问题是其密钥长度较短,已不适合于当今分布式开放网络对数据加密安全性的要求。在DES 每隔五年的评估会议中,最后一次在199原创 2011-03-16 10:51:00 · 2253 阅读 · 0 评论 -
生成指定位数的随机数
<br />输入:要生成的随机数的位数<br />输出:随机数<br />因为是32位系统,因此只能生成9位长度的10进制数。如果是10位的话可能会出现负数。溢出。<br />#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)原创 2011-03-21 10:05:00 · 4150 阅读 · 0 评论 -
快速排序算法QuickSort
1.说明快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择。这边所介绍的第一个快速排序法版本,是在多数的教科书上所提及的版本原创 2011-06-15 20:50:00 · 1712 阅读 · 0 评论