自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hustyangju的足迹

Stay Hungry,Stay Foolish

  • 博客(28)
  • 资源 (2)
  • 收藏
  • 关注

转载 BloomFilter——大规模数据处理利器

loom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一. 实例   为了说明Bloom Filter存在的重要意义,举一个实例:  假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为

2015-07-23 15:59:43 476

原创 使用bitmap处理海量数据

bitmap是一个十分有用的结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码扩展:bloom filter可以看做是对

2015-07-23 15:43:09 933

原创 c/c++ 数据结构之位图(bitmap)详解

1.  概述位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用。本文介绍了位图的实现方法及其应用场景。2. 位图实现(1)自己实现在位图中,每个元素为“0”或“1”,表示其对应的元素不存在或者存在。#define INT_BITS sizeof(int)#define SHIFT 5 // 2^5=32#define MASK

2015-07-23 15:17:48 12096 2

原创 map insert()两种使用方法

#include #include #include #include using namespace std;int main(int argc, char *argv[]){ map m; typedef map::value_type vt; for(int i=0; i<50; i++) { int val =

2015-07-23 14:52:27 5986 1

原创 STL 之 hash_map源码剖析

// Filename: stl_hash_map.h// hash_map和hash_multimap是对hashtable的简单包装, 很容易理解/* * Copyright (c) 1996 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute

2015-07-23 14:42:49 1133

原创 STL之hashtable源码剖析

// Filename: stl_hashtable.h////////////////////////////////////////////////////////////////////////////////// 本实作的hashtable采用的是开链法, 其内存布局如下/////////////////////////////////////////////////////

2015-07-23 10:04:49 940

原创 常用哈希函数的比较及其C语言实现

基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2)。设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了)。在处理大规模字符串数据

2015-07-22 23:36:23 10282 1

原创 [C++设计模式] composite 组合模式

组合(Composite)模式的其它翻译名称也很多,比如合成模式、树模式等等。在《设计模式》一书中给出的定义是:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。从定义中可以得到使用组合模式的环境为:在设计中想表示对象的“部分-整体”层次结构;希望用户忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象。看下组合模式的组成。

2015-07-22 15:43:05 810

原创 [C++设计模式] proxy 代理模式

代理模式:为其他对象提供一种代理以控制对这个对象的访问。Proxy:保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject,就相当于在代理类中保存一个Subject指针,该指针会指向RealSubject;提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体;控制对实体的存取,并可能负责创建和

2015-07-22 10:45:07 862

原创 [C++设计模式] state 状态模式

《head first 设计模式》中的例子很不错,想制造一个自动交易的糖果机,糖果机有四个状态:投入钱不足,投入钱足够,出售糖果,糖果售罄。糖果机的当前状态处于其中不同的状态时,它针对同一个操作的反映动作也不同。传统面向过程编程会套用if-else对不同的状态下分别处理,逻辑麻烦而且不具有可拓展性。状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。状态模式的重点

2015-07-21 16:41:04 791

原创 [C++设计模式] iterator 迭代器模式

迭代器模式定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象。迭代器分内部迭代器和外部迭代器,内部迭代器与对象耦合紧密,不推荐使用。外部迭代器与聚合容器的内部对象松耦合,推荐使用。迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集 合内部的数据。而且,可以同时定义多个迭代器来遍历,互不冲突

2015-07-21 15:37:02 982

原创 [C++设计模式]template 模板方法模式

模板法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。按照《headfirst 设计模式》的例子,煮茶和煮咖啡的算法框架(流程)是一样的,只是有些算法的实现是不一样的,有些是一样的。我们可以将共同的算法框架封装为一个虚基类,将相同的算法声明为不可覆盖的(static),不同的算法声明为子类要实现的纯虚函数。可以使用hook()函数处理算法框架的细小差异。看到这里,或许会想

2015-07-21 10:29:14 966

原创 [C++设计模式] adapter 适配器模式

STL中,stack对vector或者双端队列进行封装,提供stack操作的接口就是典型的适配器模式。将一个类的接口转换成客户希望的另外一个接口,就是适配器模式。使用适配器模式有以下优点:降低了去实现一个功能点的难度,可以对现有的类进行包装,就可以进行使用了;提高了项目质量,现有的类一般都是经过测试的,使用了适配器模式之后,不需要对旧的类进行全面的覆盖测试;总的来说,提

2015-07-20 11:00:28 1037

原创 [C++设计模式] command 命令模式

在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)。在OOP中,一切都是对象,将请求封装成对象,符合OOP的设计思想,当将客户的单

2015-07-20 10:35:58 1313 1

原创 [C++设计模式] factory 工厂模式

说的直接点,工厂模式就是接管对象的创建,在new()的同时既可以做额外的异常处理、初始化等操作,又可以降低模块间的耦合,方便维护和拓展。根据创建对象的复杂度,可以分为简单工厂模式、工厂法模式和抽象工厂模式。一、简单工厂模式ProductA、ProductB和ProductC继承自Product虚拟类,Show方法是不同产品的自描述;Factory依赖于ProductA、Prod

2015-07-15 17:27:06 835

原创 [C++设计模式] decorator 装饰者模式

《head first》中 的例子:咖啡店有各种咖啡饮料,可以往咖啡里面加各种调料变成另一种饮料,如果使用继承的方式来为每一种饮料设计一个类,代码的复杂度很容易膨胀,而且会继承父类的所有特性,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;同时,又掉入了另一个陷阱,随着扩展功能的增多,子类也会增多,各种子类的组合,就会导致类的膨胀,最后,就会被淹没在类的海洋。这时大神们就发明了装饰者

2015-07-15 15:32:48 1249

原创 [C++设计模式]observer 观察者模式

有这么一种松耦合的需求:有一些类的对象对类A对象的状态变化很感兴趣,不会改变类A的对象,也不会被类A的对象改变,想以一种较小的代价观察对类A对象状态变化。下面的几种方式也能实现上述目的(1)通过类的继承来共同管理和维护一些感兴趣的数据或者状态,但是耦合度大,不易扩展和维护。(2)通过调用被观察者的getter方法获取数据,这个还是直接的对象调用。上述两种方法将使观察者和被观察对

2015-07-14 17:25:56 1004

原创 为什么设计模式在C++社区没有Java社区流行?

我们发现设计模式在Java社区很流行,但是在C++社区却没有那么被关注,甚至有点被排斥,究竟是什么原因造成这个差异的呢?  (1)C++内存需要自己管理,所以有些模式在C++里使用不是那么方便,但是Java不用关心内存,所以在Java里的使用设计模式有天生的优势。随着shared_ptr, weak_ptr, unique_ptr等加入C++11,相信这方面会有所改进。   (2)在J

2015-07-14 16:36:06 1625

原创 [C++设计模式] strategy 策略模式

按照陈硕老师的观点,c++里有面向过程编程,面向对象编程和面向接口编程,三种思路都各有其适用场景。面向过程编程是沿袭C的结构化编程思路,OOP是C++的核心,也是现代高级编程语言的核心。c++的OO核心是继承和多态,在GUI编程,构建关键类等编程中很有用,但是泛用继承和多态,会增加复用和维护的难度,也会使软件臃肿复杂。面向接口编程,多采用组合,类之间松耦合,可以简化类别架构,方便复用和

2015-07-14 11:17:29 798

原创 google protocol buffer的原理和使用(四)

有个电子商务的系统(假设用C++实现),其中的模块A需要发送大量的订单信息给模块B,通讯的方式使用socket。假设订单包括如下属性:--------------------------------  时间:time(用整数表示)  客户id:userid(用整数表示)  交易金额:price(用浮点数表示)  交易的描述:desc(用字符串表示)-----------

2015-07-10 10:21:55 938

原创 google protocol buffer的原理和使用(三)

介绍下怎么反序列化GoogleBuffer数据,并在最后提供本系列文章中所用到的代码整理供下载。     上一篇文章介绍了怎样将数据序列化到了addressbook.data中,那么对于接受方而言该怎么解析出原本的数据呢。同样,protoc编译器生成的代码文件中提供了反序列化的接口,基本上和序列化的函数对应的,如下图所示:             上文中采用了SerializeToOs

2015-07-10 10:10:24 1068

原创 google protocol buffer的原理和使用(二)

本文主要会介绍怎么使用Google Protocol的Lib来序列化我们的数据,方法很多种,本文只介绍其中的三种,其他的方法读者可以通过自行研究摸索。但总的来说,序列化数据总的来说分为以下俩步:     1)使用数据源填充数据结构,无论数据源来自文件还是内存还是标准输入     2)利用Lib提供的序列化接口将数据结构序列化,然后存储在内存或者磁盘上         一、填充数据结

2015-07-10 10:07:57 1330

原创 google protocol buffer的原理和使用(一)

一、简单的介绍     Protocol buffers是一个用来序列化结构化数据的技术,支持多种语言诸如C++、Java以及Python语言,可以使用该技术来持久化数据或者序列化成网络传输的数据。相比较一些其他的XML技术而言,该技术的一个明显特点就是更加节省空间(以二进制流存储)、速度更快以及更加灵活。     通常,编写一个protocol buffers应用需要经历如下三步

2015-07-10 10:02:38 1113

转载 select、poll、epoll之间的区别总结[整理]

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用

2015-07-08 09:37:50 459

转载 EPOLL 边缘触发学习

在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __

2015-07-08 09:28:57 639

转载 g++ GNU g++常用编译选项用法

http://blog.csdn.net/mtawaken/article/details/7416332http://blog.csdn.net/poechant/article/details/6641783http://www.cnblogs.com/cryinstall/archive/2011/09/27/2280824.html

2015-07-07 18:58:05 454

转载 boost库 bind/function的使用

1 bind/function 引 (1)头文件 bind函数#include

2015-07-07 15:03:50 433

原创 diff命令详解

diff命令参数: diff - 找出两个文件的不同点 总览 diff [选项] 源文件 目标文件 下面是 GNU所接受的 diff 的所有选项的概要. 大多数的选项有两个相同的名字,一个是单个的跟在 - 后面字母, 另一个是由 – 引出的长名字. 多个单字母选项(除非它们产生歧义)能够组合为单行的命令行语法 -ac 是等同于 -a -c. 长命名的选项能被缩短到他们的名字的任何唯一的前缀.

2015-07-07 10:05:43 2536

qt signal-slot测试代码

signal-slot机制是QT的核心,也是QT解决线程之间通信的一大亮点。深刻理解其两大特性: (1)loosely coupled sender 与 receiver 互不关心,一个signal可以被多个slot获取,signal可以触发另一个signal (2)type-safe connect连接时,遵守严格的参数约定,slot参数必须与signal参数保持一致,slot参数数量可以少于signal qt signal-slot测试代码

2013-12-27

空空如也

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

TA关注的人

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