自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Dijkstra最短路径算法详解

简介Dijkstra最短路径算法是非常经典的图搜索算法,而且具有一定难度,需要花时间好好理解。算法导论第24章对此有详细的分析,值得研究一番。而我自己也结合一个具体实例,实现了代码,确实只有在编码的过程中才能理解算法的细节,提高自己的算法能力。实例分析1.分步解析Dijkstra最短路径算法也叫单源最短路径算法,意思就是只需要输入一个起点,求出该起点到图中其余点的最短路径即可。(而floyd则是求任

2015-08-06 00:26:44 2059

原创 5行代码搞定floyd算法

简介floyd是图搜算中很经典的一个算法,用于求一副图中任意两点之间的最短路径(时间,花费等)。其算法思想感觉比Dijkstra简单,而且代码也很容易实现。不过就是效率比较低,三个for循环导致复杂度为O(n3)。实例假如有如下的地图,图中四个点代表不同的城市,带箭头的边表示飞往各城市的机票(城市1可以到城市2,但城市2不可直接到城市1,只能通过其他城市周转)。我们利用二维矩阵存储这幅地图的各个点和

2015-08-05 21:49:32 933 1

原创 全排列问题

简介字符串全排列是个很经典的问题,记得在毕业前夕面试一家游戏公司,要我手写代码,然后就没有然后了。现在理解了递归是多么的神奇和有用(虽然递归有时候效率是个瓶颈)。所谓字符串全排列,就是打乱顺序重新组合,如abc的全排列有6种,abc,acb,bac,bca,cab,cba。而用代码如何实现呢?实现简单地说:就是第一个数分别以后面的数进行交换E.g:E = (a , b , c),则 prem(E)=

2015-08-05 00:11:27 590

原创 并查集实例详解

一、简介并查集,是一种很有用的数据结构。可以把它想象为多棵独立的树。 并查集的常用基本操作有查找任意两个树节点,看看它们是否属于同一棵树(其实就是查不同节点的根节点是否一样即可),如下图b & e 同属于根为c的树,所以它们在同一个集合;而h & g则不属于同一集合。合并这些独立的树,成为一棵更庞大的树。(其实也很简单,就是将一颗树的根节点成为另一个树根节点之下的孩子即可)合并操作如图所示:

2015-08-04 00:13:24 2385

原创 Trie树兄弟单词实例

Trie树趣味实例如果一个单词,将其字母顺序重新排列可以生成另一个单词,则称这两个单词是兄弟单词。 如:”mary“ & ”army“ “cinema”&“iceman” 现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有哪些兄弟单词?要求时间和空间效率尽可能的高。解决思路:利用Trie树就可以妥善解决。 只需将上面的树节点增加一个vector< string >,构建

2015-08-03 16:29:42 666

原创 log4cpp深度封装

简介关于log4cpp的介绍与好处就不再赘言了,百度一搜一大把。主要是对于log4cpp的使用如果不封装一下,感觉还是挺麻烦的,例如不少函数名挺长的。所以自己动手把它的日常使用进行了封装,可以让使用log4cpp就像调用一句printf()函数一样简单快捷。封装目标不需要用一次就调用一次getInstance,只需要在main文件中引入一次即可封装成需要使用时只需简短的一举logError(“s

2015-08-03 16:05:39 6722 2

原创 C++文本查询程序实例

需求介绍假如有这样的需求: 处理一个英文文本(简单处理为无标点),用户输入一个单词:如you, 程序执行,显示you在文本文件中出现的次数,以及其所在行的内容。如果该单词在一行中出现多次,则此行只显示一次即可。查询结果按行号升序输出各行内容。解决思路利用C++实现这样一个简单的文本查询需求十分简单。 编写两个类 1)TextQuery 2)QueryResult所用数据结构:使用ve

2015-08-03 15:37:44 939

原创 二分查找的非递归与递归实现

简介查找是很常见的操作,一般就循环遍历,不过如果数据量大那就得等很久了。所以为了加快查找速度,二分查找当仁不让。二分查找的思路非常简单,就不断折半缩小查找范围,可以控制指针缩小范围,也可以利用递归。以下是对两种版本的具体实现 虽然代码不难,但是也有几个要点需要注意:取中值 如果直接mid = ( low + high )/2; 这样一般没什么错,但是要考虑数据量很大时就容易整数溢出。 所以

2015-07-29 17:34:25 532

原创 大小堆排序 & Top K 问题

大小堆排序堆这种数据结构定义比较简单,大根堆就是父节点的值大于左右子孩子节点的值(小根堆相反),而且利用数组下标就可以很好的表现堆(不过要注意是从0 还是 1开始)。堆常用语实现优先队列,Top K等问题。算法导论第6章对堆的进行了详细讲解,我就不赘述了(看书是不够的,要把思路用代码实现出来才是真的懂了,争取把算法导论上常用的数据结构和算法都自己实现一般)。大根堆具体代码(按照算法导论中下标从1开始

2015-07-29 15:09:44 4922 1

原创 归并排序的实现

归并排序算法导论第二章就着重介绍的归并排序,充分体现了分治法的思想,同时也利用了递归。也是类比生活中洗牌的场景,十分生动形象。具体代码:void merge(int a[],int p ,int q,int r){ int i=0,j=0,k; //左右新数组 int *LeftArray; int *RightArray; //左右数组大小 in

2015-07-29 14:53:25 504

原创 快速排序的两种实现

简介快速排序是排序中速度比较快的,采用分治策略,不断递归排序。很多编程语言的sort()或者qsort()函数的底层实现就是快排。 算法导论第7章对快速排序进行了深入的探讨,而且它的划分思想与国内的许多教材不同。如严蔚敏数据结构版本选择第一个元素为中枢,从左右两端往中间逼近;而算法导论则是选择最后一个元素为中枢,两个指针一起从左到右遍历一遍进行划分。(选择中枢也是个值得探讨的问题,算法导论采取随机

2015-07-29 14:51:47 579

原创 Switch语句的一个坑 & 一个妙用

一个坑switch有一个坑比较容易踩,在这里记录提醒自己。如下代码请问输出什么? 如果你觉得答案是: i:2那就错了。答案其实是: 要注意,switch语句到case语句之间的代码是不会执行的。 直接略过,所以case挨着switch写好了:)妙用switch语句通常我们惯性思维case都是从下到大1-N种情况排列下来, 不过不要忘记case是可以倒着从大往小写的。如,求某日期是该年的第几

2015-07-29 13:38:18 922

原创 实现简单HTTP服务器-图片与CGI

简介在学习了深入理解操作系统第11章的内容后,更加深刻的理解的Socket,IO流,fork,Cgi 以及Http等知识。并且学习了HTTP服务器的代码实现。并不复杂,大概300行,就可以实现发送图片,和执行CGI程序将结果返回给客户端。具体实现过程服务器代码:代码量比较少,而且添加了一些注释,简明易懂。 csapp.h是该书的通用头文件,定义了一些常量,以及进一步封装了一些系统调用(检查返回值等

2015-07-29 12:51:21 2255

原创 约瑟夫环问题

简介约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。编程解决思路思路一 环形链表很显然立马就会联想到用环形链表解决,很直观,编码也不会很

2015-07-28 23:46:34 466

原创 最大子数组问题

简介最大字数组问题我就不赘述了,网上一搜就有。 在算法导论第四章,分治策略,对最大子问题这个经典的编程题目进行了十分详细生动的描绘,类比股票的正负波动,深入浅出,读起来十分有趣。并且不断优化方法,从一开始的暴力法,到左中右分治法,将复杂度从O(n3)逐渐降低到O(nlogn) ps:甚至还可以用动态规划法将复杂度降为O(n)。思考过程十分精彩,伪代码也比较好懂。光看不练空把式,所以决定将其伪代码实

2015-07-28 22:27:04 497

原创 平面坐标两点间路径问题

有一道挺有意思的题目 如图所示: 我的解决思路: 利用递归解决,不过暂时只能得到路径条数,如果需要打印出路径这个要求还没想到好方法,用栈记录?希望高手不吝赐教,谢谢! 测试代码及结果:

2015-07-28 22:04:37 852

原创 冒泡-选择-插入排序算法的实现

排序算法排序是编程中很重要的一种算法,虽然各编程语言都实现了效率很高的sort函数在工作中调用,但是经典排序算法里面的许多思想值得借鉴以及深入学习。 以下是自己对几个经典排序的实现。用到的交换两数的宏定义,以及数组初始化,输出函数:#define SWAP(a,b) do { temp = (a);\ (a) = (b);\ (b) = (temp);}while(0);//随机

2015-07-28 20:51:05 517

原创 二叉排序树C++实现

学习了算法导论12章关于二叉排序树的内容,自己利用C++实现了二叉排序树的封装。(删除暂时没有实现,后续再补吧) 有什么不足之处希望不吝赐教!头文件,二叉排序树类的定义(注释比较清楚,就不再赘述了):#pragma once#include<iostream>using namespace std;//树节点定义,包含父节点指针(便于回溯前驱与后继)typedef struct Node {

2015-07-28 20:20:20 3287

原创 封装linux 条件互斥锁

linux互斥锁 与 条件变量的简单封装

2015-07-27 23:38:30 1375 2

原创 log4cpp-回滚文件

log4cpp

2015-07-27 21:49:28 856

原创 log4cpp学习笔记

Log4cppcp的简单介绍

2015-07-27 21:15:27 1372

原创 Trie树词频统计实例

Trie树词频统计实例

2015-07-26 00:00:07 3613

原创 C++ 自定义简单String类

String类的简单实现

2015-07-24 13:03:01 889

原创 C++单例模式实现

单例模式(也常说单件模式)是最为常用的一种设计模式,许多项目都会出现它的身影。 保证内存中只有一个单例类的对象,常用全局静态变量实现。 在C++中实现单例模式只需要简单几个步骤即可:将构造函数私有化在类中定义一个静态的指针在类外将静态指针初始化为NULL定义一个返回值为指针的静态成员函数 static Singleton* getInstance();具体简单实例(线程不安全): 运

2015-07-23 21:19:55 447

转载 一个Sqrt函数引发的血案

这段代码是3D游戏中经常需要用到的数学函数,而这位大神的代码比系统自带的开平方函数快了好几倍!简直神奇。希望大家当做趣闻慢慢读读,有兴趣的朋友可以慢慢理解一下文章中的代码,牛顿也真是天神下凡,哪里都有他的身影~~ 原文: 好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获。我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函

2015-05-27 21:37:22 611

原创 数组循环左移或右移(数组翻转)

今天练习了一道编程题:数组翻转或者说是数组循环移动。 例如有数组A:1,2,3,4,5,循环左移动2位变成:3,4,5,1,2。 此题的解法很简单也很巧妙,首先将数组逆置 变为 5 4 3 2 1 ,然后将数组分成两个部分,5,4,3 & 2,1 然后分别继续逆置两个部分,即为所求:3 4 5 1 2。根据这个思想编写代码,没有什么难点,不过为了优化代码也花费了半个小时左右调试。 首先是

2015-05-27 20:43:20 2164

空空如也

空空如也

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

TA关注的人

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