- 博客(76)
- 资源 (45)
- 收藏
- 关注
原创 C++ STL学习笔记
#.string 建议 使用string 的方便性就不用再说了,这里要重点强调的是string的安全性。 string并不是万能的,如果你在一个大工程中需要频繁处理字符串,而且有可能是多线程,那么你一定要慎重(当然,在多线程下你使用任何STL容器都要慎重)。 string的实现和效率并不一定是你想象的那样,如果你对大量的字符串操作,而且特别关心其效率,那么你有两个选择,首
2012-11-18 18:12:27
3210
原创 windows下ping程序实现
windows下ping程序的实现:使用原始套接字SOCK_RAW,基于IP协议上的ICMP协议来实现,发送的ICMP数据包type为8(请求回复),收到的回复的ICMP数据包type为0,为了判断收到是数据包是本进程发送的。将ICMP包的id设置为本进程的ID。如果使用-r选项,会记录中间经过的route。参考代码:// Description:// This sample i
2012-10-18 09:41:54
3670
原创 BST树 B-树 B+树 B*树简介
BST即二叉搜索树:1.所有非叶子结点至多拥有两个儿子(Left和Right);2.所有结点存储一个关键字;3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;如:B-树(B树)是一种多路搜索树(并不是二叉的):1.定义任意非叶子结点最多只有M个儿子;且M>2;2.根结点的儿子数为[2, M];3.除根结点以外的非叶子结点的儿子数
2012-10-16 14:03:50
6996
原创 Windows下一个并发阻塞队列(BlockingQueue)
Windows下一个带有大小限制的并发阻塞队列,实现的比较简单。#ifndef BLOCKINGQUEUE_H_#define BLOCKINGQUEUE_H_#include #include using namespace std;template class BoundedBlockingQueue { public: BoundedB
2012-10-11 11:58:56
3265
原创 Linux下设计并发队列
设计并发队列#include #include using namespace std;template class Queue { public: Queue( ) { pthread_mutex_init(&_lock, NULL); } ~Queue( ) {
2012-10-07 09:59:35
2839
原创 Linux的进程通信(IPC)
进程间通信的目的数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。进程
2012-10-06 10:18:32
3342
原创 面向对象的5个基本设计原则
面向对象的3个基本要素:封装、继承、多态面向对象的5个基本设计原则:单一职责原则(Single-Resposibility Principle) 其核心思想为:一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖
2012-10-05 19:49:02
40377
4
原创 后缀数组--处理字符串的利器
后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。子串:字符串S的子串r[i..j],i后缀:后缀是指从某个位置i开始到整个串末尾结束的一个特殊子串。字符串 s 的从第i个字符开始的后缀表示为Suffix(i), 也就是Suffix(i)=r[i..len(s
2012-10-05 12:44:28
3308
原创 求字符串中最长无重复字符的子串
题目:求一个字符串中最长的没有重复字符的子串。方法一:穷举法,使用2重外循环遍历所有的区间,用2重内循环检验子串是否符合“无重复字符”这一要求。其中外层循环i、j 遍历所有的下标,m、n是内层循环,检查区间[i,j]是否符合要求。空间复杂度是O(1),时间复杂度O(N^4)。//O(N^4)的时间复杂度int max_unique_substring1(char * str){
2012-10-02 13:25:06
17271
原创 二分搜索及其扩展
二分搜索折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度:二分搜索每次把
2012-10-01 15:48:19
3398
原创 卡特兰数 Catalan number
卡特兰数 Catalan number卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 914825636
2012-10-01 10:23:59
5118
原创 背包问题
P01: 01背包问题 题目:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路:这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v] = max{ f[i-1][v],
2012-09-20 19:55:08
3305
原创 大整数加减乘除的实现
为了复习C++基本的东西,自己随便写的,实现的是正的大整数的加减乘除,其中除的实现比较低效,没有找到很好的解决方法。实现代码:#include using namespace std; const int MAXLEN = 100; class Integer {private: int is_neg; //是否为负 int
2012-09-14 21:04:56
10109
翻译 有序数组中找中位数
原文:Median of two sorted arrays题目:两个有序数组A和B,大小都是n,寻找这两个数组合并后的中位数。时间复杂度为O(logn)。中位数:如果数组有个数是奇数,那么中数的值就是有序时处于中间的数;如果数组个数是偶数的,那么就是有序时中间两个数的平均值。方法一:合并时计数使用Merge Sort时的Merge操作,比较两个数组时候计数,当计数达到n时,就可以
2012-09-09 14:54:09
4357
原创 等概率随机函数的实现
利用等概率函数Rand5产生等概率函数Rand3问题描述:现在有一个叫做Rand5的函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使用任何能产生随机数的函数或数据源),生成等概率的[0, 3)范围内的随机整数。//使用Rand5()实现Rand3()int Rand3(){ int x; do
2012-09-06 14:34:41
3311
1
原创 Trie树的C++实现
Trie—单词查找树Trie,又称单词查找树、前缀树,是一种哈希树的变种。应用于字符串的统计与排序,经常被搜索引擎系统用于文本词频统计。性质:1.根节点不包含字符,除根节点外的每一个节点都只包含一个字符。2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。3.每个节点的所有子节点包含的字符都不相同。优点:1.查询快。对于长度为m的键值,最坏情况下只需
2012-09-03 13:40:23
6511
原创 二分查找法及其扩展运用
二分查找可以解决排序数组的查找问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它。一开始,范围覆盖整个数组。将数组的中间项与T进行比较,可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。对于包含N个元素的表,整个查找过程大约要经过logN次比较。 二分搜索需要注意开闭区间的问题,限
2012-09-02 15:24:15
3804
原创 C++类的大小
一个空类class A{};的大小为什么是1,因为如果不是1,当定义这个类的对象数组时候A objects[5]; objects[0]和objects[1]就在同一个地址处,就无法区分。#includeusing namespace std;class A{public: virtual void aa(){}private: char k[3];
2012-09-01 10:45:41
1178
原创 C++构造函数虚拟化
虚拟构造函数当你有一个指针或引用,但是不知道其指向对象的真实类型是什么时,你可以调用虚拟函数来完成特定类型(type-specific)对象的行为。仅当你还没拥有一个对象但是你确切地知道想要对象的类型时,你才会调用构造函数。那么虚拟构造函数又从何谈起呢?例如假设你编写一个程序,用来进行新闻报道的工作,一条新闻报道由文字或图片组成。你可以这样管理它们:class NLComponent
2012-08-12 19:31:25
2644
原创 类的operator new与operator delete的重载
为什么有必要写自己的operator new和operator delete?答案通常是:为了效率。缺省版本的operator new是一种通用型的内存分配器,它必须可以分配任意大小的内存块。同样,operator delete也要可以释放任意大小的内存块。operator delete想弄清它要释放的内存有多大,就必须知道当初operator new分配的内存有多大。有一种常用的方法可以
2012-08-11 10:45:32
1174
原创 C++的重载(overload)与重写(override)
成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。重写是指派生类函数重写基类函数,是C++的多态的表现,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。示例中,函数Base::f(int)与Base::
2012-08-09 18:27:13
1701
原创 排列组合问题
排列:从n个不同元素中,任取m(m 组合:从n个不同元素中,任取m(m#include using namespace std;#define MaxN 10char used[MaxN];int p[MaxN];char s[MaxN];//从n个元素中选r个进行排列void permute(int pos,const int n,const i
2012-08-08 13:59:42
1000
原创 O(N)的时间寻找最大的K个数
寻找N个数中最大的K个数,本质上就是寻找最大的K个数中最小的那个,也就是第K大的数。可以使用二分搜索的策略来寻找N个数中的第K大的数。对于一个给定的数p,可以在O(N)的时间复杂度内找出所有不小于p的数。寻找第k大的元素:#include using namespace std;//快速排序的划分函数int partition(int a[],int l,int r){
2012-08-07 11:45:28
2961
原创 会场安排问题
会场安排问题问题描述:假设要在足够多的会场里安排一批活动,活动的开始时间和结束时间已知,并希望使用尽可能少的会场。设计一个有效的算法进行安排。分析:这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,就对应要找的最小会场数。 图的最少着色问题,至今没有有效的算法,但这个问题和图的着色问题有不同,活动的时间区间之间的约束
2012-08-07 10:07:01
1305
原创 new、operator new和placement new
C++中的new/delete与operator new/operator deletenew operator/delete operator就是new和delete操作符,而operator new/operator delete是函数new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载operator new
2012-08-04 19:17:08
1277
原创 单源最短路径算法--Dijkstra算法和Bellman-Ford算法
Dijkstra算法算法流程:(a) 初始化:用起点v到该顶点w的直接边(弧)初始化最短路径,否则设为∞;(b) 从未求得最短路径的终点中选择路径长度最小的终点u:即求得v到u的最短路径;(c) 修改最短路径:计算u的邻接点的最短路径,若(v,…,u)+(u,w)(d) 重复(b)-(c),直到求得v到其余所有顶点的最短路径。特点:总是按照从小到大的顺序求得最短路径。假
2012-08-03 20:58:07
1712
原创 内部排序法小结
1.冒泡排序(Bubble Sort)冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最
2012-08-02 20:34:12
5119
原创 寻找最大的k个数,TopK问题的C++实现
2亿个整数中求最大的100万之和题目:有一个文件中保存了2亿个整数,每个整数都以' '分隔。求最大的100万个整数之和。算法:1. 首先建立一个容量为100万(nTop)的int数组,从文件读取整数填充。2. 利用堆维护该100万条记录(确保堆顶元素为最小值)3. 从文件中读取一个整数与堆顶元素比较,如果大于堆顶元素则替换该元素,并调整堆的结构。4. 重复步骤3一直到数据读
2012-07-28 12:02:21
9033
原创 hashmap的C++实现
按照hashmap的基本原理用C++实现了简单的基本功能,复杂的实现参考C++库的源码,C++最新的标准库里已经有以下四种基于hashtable的容器:unordered_set(C++11) unordered_multiset(C++11) unordered_map(C++11) unordered_multimap (C++11)。具体参考:http://en.cppr
2012-07-25 19:00:02
9608
原创 《编程珠玑》中的一些代码
位图排序使用位图对[0..N-1]中不同的整数进行排序/* bitmap sort -- Sort distinct integers in the range [0..N-1] */#include #define BITSPERWORD 32#define SHIFT 5#define MASK 0x1F#define N 10000000int a
2012-07-16 18:25:06
1292
原创 编程之美--数字之魅
读《编程之美》数字之魅部分的笔记。1、整型数V的二进制中1的个数:int Count(int v){ int num = 0; while(v) { num += v & 0x01; v >>= 1; } return num;}int Count(int v){ int n
2012-07-12 14:55:56
1424
原创 几种不同语言版本的HMM实现
C语言版:1、 HTK(Hidden Markov Model Toolkit): HTK是英国剑桥大学开发的一套基于C语言的隐马尔科夫模型工具箱,主要应用于语音识别、语音合成的研究,也被用在其他领域,如字符识别和DNA排序等。HTK是重量级的HMM版本。 HTK主页:http://htk.eng.cam.ac.uk/2、 GHMM Library:
2012-07-08 13:56:04
8924
原创 Dynamic time warping 动态时间规整算法(DTW)
Dynamic time warping (DTW) is an algorithm for measuring similarity between two sequences which may vary in time or speed. For instance, similarities in walking patterns would be detected, even if i
2012-07-08 13:45:02
8127
原创 C++数字与字符串之间的转换
1、字符串数字之间的转换(1)string --> char * string str("OK"); char * p = str.c_str();(2)char * -->string char *p = "OK"; string str(p);(3)char * -->CString char *p ="OK"; CSt
2012-06-29 18:28:11
3632
原创 构造函数和析构函数的一些问题
1、构造函数和析构函数为什么没有返回值?构造函数和析构函数是两个非常特殊的函数:它们没有返回值.这与返回值为void的函数显然不同.后者虽然也不返回任何值,但还可以让它做点别的事情,而构造函数和析构函数则不允许.在程序中创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以确保它们被执行.如果它们有返回值,要么编译器必须知道如何处理返回值,要么就只能由客户程序员自己
2012-06-20 11:37:02
1981
原创 BP人工神经网络的C++实现
BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法(梯度法),通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网
2012-06-10 14:33:28
36696
原创 串口通信Serial Port类C++实现
串口介绍串口叫做串行接口,也称串行通信接口,按电气标准及协议来分包括RS-232、RS-422、RS485、USB等。 RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。USB是近几年发展起来的新型接口标准,主要应用于高速数据传输领域。 RS-232:也称标准串口,是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(E
2012-06-08 17:54:46
50195
1
原创 Base64算法及C++实现
Base64用途1.用于对SOHO级路由器(网关设备)管理员帐户密码的加密2.流媒体网站对于播放的流媒体文件的路径的加密3.迅雷等下载软件对下载链接地址的加密Base64算法Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。Base64类
2012-06-07 11:50:20
7241
原创 Windows多线程的同步与互斥
系统中的所有线程都必须拥有对各种系统资源的访问权,这些资源包括内存堆栈,串口,文件,窗口和许多其他资源。如果一个线程需要独占对资源的访问权,那么其他线程就无法完成它们的工作。反过来说,也不能让任何一个线程在任何时间都能访问所有的资源。如果在一个线程从内存块中读取数据时,另一个线程却想要将数据写入同一个内存块,那么这就像你在读一本书时另一个人却在修改书中的内容一样。这样,书中的内容就会被搞得乱七八糟
2012-06-06 16:45:37
4024
原创 Windows线程的创建和终止
线程的创建CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别 CreateThread是Windows的API函数,提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要轻易。在使用的过程中要考虑到进程的同步与互斥的关系(防止死锁)
2012-06-05 13:06:40
1952
windows 核心编程
2008-09-09
mfc42ud.lib和mfc42ud.dll
2008-08-03
C++ STL书籍集
2008-04-08
C++ STL编程书籍
2008-04-07
程序员面试攻略(第二版)
2012-08-24
python 2.5 for windows
2009-04-04
简明python教程
2008-09-23
Visual C++ 6.0高级编程技术-OpenGL篇(OpenGL实例)
2008-09-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人