自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 第26章:最大流

下面给出代码求解一个图中的最大流:void networkFlow::pathWithMaxFlow(double& flow,vector<int>& path){ vector<bool> visited(gSize,false); vector<double> maxFlow(gSize,DBL_MIN); for(int i=0;i!=gSiz

2016-05-31 14:43:59 538

原创 第25章:每对顶点间的最短路径—基于矩阵乘法的动态规划算法

下面给出一个基于动态规划的算法,void graph::shortestWeightsOfAllPairs(){ const int NOT_A_VERTEX=-1; shortestWeights.resize(gSize); shortestPath.resize(gSize); for(int i=0;i!=gSize;++i)

2016-05-31 14:33:32 4014

原创 第24章:单源最短路径

Dijkstra算法解决了有向图G=(V,E)带权的单源最短路径问题,但要求所有边的权值非负。下面给出Dijkstra算法代码:void weightedGraphType::shortestPath(int vertex){ source=vertex; for(int i=0;i!=gSize;i++) smallestWeight

2016-05-31 14:22:35 1103

原创 第23章:最小生成树

本章展示了两种最小生成树算法,一个是Kruskal算法,一个是prim算法。Kruskal算法:代码如下:void msTreeType::kruskalMinimumSpanning(){ int edgesAccepted=0; DisjSets dj(gSize); Edge e; int uVertex,vVertex;

2016-05-31 14:13:38 436

原创 第22章:图的基本算法—广度优先搜索和深度优先搜索

1:在下面的代码中,用的是邻接表来表示图,声明如下:vector<list<int> > graph 2:有两种方法去遍历一个图,一个是广度优先搜索,另外一个是深度优先搜索广度优先搜索:代码如下:void graphType::breadthFirstTraversal(){ vector<bool> visited(gSize); for(int vertex=

2016-05-31 14:04:33 2663

原创 第21章:用于不相交集合的数据结构

一:不相交集类的声明如下:#ifndef DISJSETS_H#define DISJSETS_H#include <vector>using namespace std;class DisjSets{public: explicit DisjSets(int); bool isSameSet(int x, int y) const { ret

2016-05-30 22:22:00 470

原创 第11章:散列表

下面代码用分离链接法实现散列表:1:将一个输入元素利用散列函数散列到某一个值:int hash(int key){ return key;}int hash(const string& key){ int hashVal=0; for(string::size_type ix=0;ix!=key.size();ix++)

2016-05-30 22:20:45 451

原创 第9章:中位数和顺序统计量

快速选择算法如下:template<class Type>void quickSelect(vector<Type>& array,int k,int left,int right){ //尾递归/* if(left<right){ if(10<=right-left){ int

2016-05-30 22:18:03 536

原创 第8章:线性时间排序

一:计数排序:计数排序假设n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数,当k=O(n)时,排序的运行时间为Θ(n)\Theta{(n)} 代码如下:void countingSort(vector<unsigned int>& array){ if(array.size()==0) throw underflow_error

2016-05-30 22:16:45 359

原创 第7章:快速排序

随机化快速排序:1:对数组的随机划分:int random(int i,int j){ return rand()%(j-i+1)+i;}template<class Type>int partition(vector<Type>& array, int left,int right){ Type compareVal=array[right];

2016-05-30 20:30:00 307

原创 第2章:算法基础

1:插入排序:代码如下:template<class Type>void insertionSort(vector<Type>& a){ for(typename vector<Type>::size_type i=1;i!=a.size();i++) { Type tmp=a[i]; typenam

2016-05-30 20:21:09 314

原创 第六章:堆排序

一:二叉堆的基本操作:假设我们要实现的是一个最小堆:1:插入操作代码:template<class Type>void binaryHeap<Type>::insert(const Type& val){ if(currentSize==array.size()-1) array.resize(array.size()*2); in

2016-05-30 20:14:20 318

原创 第33章 :计算几何学

一:判定给定的两条线段是否相交:当两条线段的四个点p1,p2,p3,p4给定时,如下的代码能够判断线段p1p2与线段p3p4是否相交,如果相交则返回true,否则返回false;//pair<double,double>第一个元素存储坐标点的x坐标,第二个元素存储坐标点的y坐标using point=pair<double,double>;// 计算矢量(pk-pi)与矢量(pj-pi)的叉乘

2016-05-30 19:56:50 414

原创 第14章:namespace

14.2.4节:这一节介绍了与命名空间相关的依赖参数的向上查找法则(Argument-Dependent Lookup):1:如果一个函数在它的源文件中没有发现被定义,那么编译器就会去查找该函数的参数所对应的命名空间,看该命名空间中是否定义了该函数。例如:namespace Chrono{ class Date{/*...*/}; bool operator==(const Date

2016-05-28 10:32:42 370

原创 第32章 :字符串匹配—有限自动机算法,Knuth-Morris-Pratt算法

有限自动机算法:一个有限自动机M是一个5元组(Q,q0,A,Σ,δ)(Q, q_{0}, A, \Sigma, \delta),其中:1:Q 是状态的有限集合; 2:q0q_{0}(属于Q)是初始状态; 3:A(属于Q)是特殊的接收状态的集合; 4:Σ\Sigma是有限输入字母表; 5:δ\delta是一个从Q×ΣQ\times\Sigma到Q的函数,称为M的转移函数;有限自动机开始于状态q

2016-05-26 23:28:57 1886

原创 第32章:字符串匹配问题: 朴素算法,Rabin-Karp算法

在文本编辑中,经常要找出某一个模式在一段文本中全部出现的位置。这可以用字符串匹配问题来求解,不过这一章节仅考虑长度有限的字符串。如果一个模式P(长度为m)是从文本T(长度为n)中第(s+1)个字符开始出现,我们则说模式p在文本T中出现并且位移为s(0<=s<=n-m)。本章节给出了求解字符串匹配问题的四种算法,分别是朴素算法,Rabin-Karp算法,有限自动机算法,Knuth-Morris-Pra

2016-05-22 20:21:53 428

原创 第31章 数论算法:元素的幂以及模取幂

元素的幂:在这里介绍求元素的幂X^n(X和n均为非负整数)的两种算法,一个是递归求解,另外一个是用反复平方法递归求解:当我们计算X^n时,当n=0,结果为1,这可以看做递归的基准情况,当n为偶数时,X^n=(X^2)^(N/2),当n是基数时,X^n=(X^2)^((n-1)/2)*X。代码如下:bool isEven(unsigned int n){ if(n%2==0) ret

2016-05-22 13:14:31 1217

原创 第5章:概率分析与随机算法

知识点总结概率分析是在问题分析中应用概率的理念,必须要假设输入的分布,然后计算出一个平均情形下的运行时间,其中对所有可能的输入分布取平均值,得到的这种运行时间称为平均情况运行时间如果一个算法的行为不仅由输入决定,而且也由随机数生成器产生的数值决定,我们称这个算法是随机的。当分析一个随机算法的运行时间时,我们以运行时间的期望值来衡量,其中输入值由随机数生成器产生,我们称为期望运行时间。当我们在概

2016-05-19 21:39:30 1655

原创 第4章 分治策略——strassen算法

strassen算法首先要求两个矩阵要是方块矩阵,并且维数是2的幂。如果两个矩阵不满足这两个条件,可以增加元素均为0的行与列以满足条件。假设要计算C=A*B。首先将A,B,C均分解为4个n/2*n/2的子矩阵。假设将A分解为A11,A12,A21,A22。 B分解为B11,B12, B21, B22。 对C做类似的操作。创建10个n/2*n/2的矩阵 S1,S2,…, S10。S1=B12-B2

2016-05-19 21:35:01 774

原创 第4章:分治策略 ——最大字数组问题

第四章 分治策略知识点总结这一章主要给我们介绍了分治算法,这算法由如下三个步骤组成分解步骤将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小;解决步骤递归地求解这些子问题,如果子问题的规模足够小,则停止递归,直接求解;合并步骤将子问题的解组合成原问题的解。 递归式与递归算法时间复杂度的分析紧密相关,我们见到的递归式大部分情况下具有如下的形式:T(n)=aT(n/b)+f(n)

2016-05-19 21:29:14 371

原创 第31章:数论算法

最大公约数:欧几里得算法:对于任意非负整数a和任意正整数b来说,当求它们的最大公约数时,有如下定理:gcd(a,b)=gcd(b,a mod b);根据这个定理,可以写出求最大公约数的代码:// a和b是任意非负整数;//递归求解;unsigned long Euclid_Rec(unsigned long a,unsigned long b){ if(b==0)

2016-05-18 22:54:23 642

原创 第12章:functions

(1): 函数的声明:在c++11新标准中,有两种函数声明的方式,第一种是返回类型放在函数名字的前面;第二种是返回类型放在函数参数列表的后面。例如这下面两种声明方式是等价的:string to_string(int a); //c++老标准中的声明方式;auto to_string(int a)->string;//c++11中新添加的声明方式;对于第二种声明方式,放在函数名字前面的auto表明这

2016-05-15 20:34:22 308

原创 第11章: select operations

lambda表达式:1:相比于c++老标准,c++新标准增加了lambda表达式。它的存在主要是为了替代函数对象。可以看如下例子:比如说vector<string>中存储了一系列字符串,现在我要统计在这个vector中,长度分别大于等于0到10的字符串个数是多少个。在c++老标准中,我们需要先定义一个类,在这个类中重载调用操作符。代码如下://先定义类,在类中重载调用操作符;class GT_cls

2016-05-14 00:12:38 485

原创 第10章:expressions

const 和const expr:相比于c++的老标准,c++11新标准引入const expr这个类型,下面简要说一下,这两个不同的类型的相同点和不同点:1:用const 和const expr声明的变量它们的值一旦被定义后就不能被改变。如下面例子代码所示:const int x1=0; //okay;x1=1; //error, the value of variable x1 can't

2016-05-11 22:40:52 329

原创 第9章:statements

相比于c++98的老标准,c++11新标准增加了范围for语句(range for statement)。 范围for语句的语法形式为:for (declaration:expression) statementexpression表示的必须是一个序列,比如用花括号括起来的初始值列表,数组,或者vector和string等类型的对象。这些类型共有的一个特点是拥有能返回迭代器的begin()

2016-05-10 23:02:34 345

原创 第8章:structures, unions, and enumerations

这一章主要讲了关于structures,unions,和enumerations的一些知识。structures:1:我们知道数组是相同类型元素的集合,从最简单定义的角度理解,我们可以认为struct是任意类型元素的集合,默认的访问级别是public。2:在内存中,struct成员分配地址的顺序是按照成员声明的顺序分配的,然而struct对象的内存大小并不简单是其成员内存大小的和。为了节省分配的内存

2016-05-10 10:20:33 678

原创 第7章:pointers,arrays and references

1: 在c++中,我们能够通过对象名字访问一个对象。但与此同时,存储在内存中的对象在内存中有一个具体地址,因此我们也能够通过该具体地址访问该对象,指针存储着内存地址。2:在c++旧标准中,我们使用0或者是NULL来表示零指针,零指针表示该指针不指向任何对象。当我们使用0来表示零指针时,它很容易与整形的0混淆;NULL是个宏,一般来说在c++中NULL被如下定义:#define NULL 0,然后在

2016-05-09 10:41:03 614

原创 第六章: types and declarations

一:c++变量基本类型c++变量类型可以分为内置类型(built-in types)和用户定义类型(user-defined type)两种。内置类型可以分为基本类型(如bool,int, char, double,void等)和用声明算符构造的类型(如int*, char[], double&, double&&)。用户定义类型指的是数据结构,类和枚举类型。下面主要给出基本类型一些介绍:基本类型:

2016-05-06 16:22:45 516

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除