2012年9月12日
摘要: 哈希表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。目录基本概念常用的构造散列函数的方法处理冲突的方法查找的性能分析实际应用字符串哈希函数基本概念 * 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。 * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(k.. 阅读全文
posted @ 2012-09-12 14:12 bitbit 阅读(522) 评论(0) 推荐(0) 编辑
摘要: 为什么需要auto_ptr_ref这几天开始拜读侯捷先生和孟岩先生的译作《C++标准程序库:自修教程与参考手册》 。两位先生确实译功上乘,读得很顺。但是读到P55页关于auto_ptr_ref的讨论,却百思不得其解:为什么需要引入auto_ptr_ref这个辅助类呢?从书中描述来看,仿佛与拷贝构造函数 、右值 、类型转换 有关。于是,结合auto_ptr的源代码,google之、baidu之,找了一推资料,终于初步 搞清该问题。auto_ptr的拥有权C++常见的智能指针有std::auto_ptr、boost::shared_ptr、boost::scoped_ptr、boost::shar 阅读全文
posted @ 2012-09-12 14:00 bitbit 阅读(919) 评论(0) 推荐(0) 编辑
  2012年9月11日
摘要: 算法复杂度目录简介1、时间复杂度2、空间复杂度编辑本段简介 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。1、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)... 阅读全文
posted @ 2012-09-11 19:42 bitbit 阅读(337) 评论(0) 推荐(0) 编辑
  2012年9月9日
摘要: 根据二叉树的后序遍历以及中序遍历还原二叉树【题目】假设一棵二叉树的后序遍历序列为 DGJHEBIFCA ,中序遍历序列为 DBGEHJACIF ,则其前序遍历序列为 ( ) 。A. ABCDEFGHIJB. ABDEGHJCFIC. ABDEGHJFICD. ABDEGJHCFI由题,后序遍历的最后一个值为A,说明本二叉树以节点A为根节点(当然,答案中第一个节点都是A,也证明了这一点)下面给出整个分析过程【第一步】由后序遍历的最后一个节点可知本树根节点为【A】加上中序遍历的结果,得知以【A】为根节点时,中序遍历结果被【A】分为两部分【DBGEHJ】【A】【CIF】于是作出第一幅图如下【第二步】 阅读全文
posted @ 2012-09-09 14:51 bitbit 阅读(593) 评论(0) 推荐(0) 编辑
摘要: CRT运行时库1)运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数.2)C 语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);所以,C 语言内核开发出来之后,Dennis Ritchie 和 Brian Kernighan 就用 C 本身重写了 90% 以上的 UNIX 系统函数,并且把其中最常用的部分独立出来,形成头文件和对应的 LIBRARY,C run-time library 就是这样形成的。3)随后,随着 C 语言的流行,各个 C 编译器的生产商 阅读全文
posted @ 2012-09-09 14:49 bitbit 阅读(992) 评论(0) 推荐(0) 编辑
摘要: classNoncopyable{protected:Noncopyable(){};~Noncopyable(){};private:Noncopyable(constNoncopyable&src);constNoncopyable&operator=(constNoncopyable&src);//声明一下就行了};为了禁用编译器自动提供的功能,你必须将相关的成员函数声明为 private 的,同时不要实现它。这里使用一个像 noncopyable 这样的类来完成这一工作。 阅读全文
posted @ 2012-09-09 14:45 bitbit 阅读(323) 评论(0) 推荐(0) 编辑
摘要: 软件系统设计思路 最近有学弟问我,拿到一个软件需求,但是却不知道怎么才能更好地架构好整个系统,在此,我简单地根据我的经验介绍一下我是怎么设计一个软件系统的吧。当然,这只是我的一个简单的思路而已,真正涉及到一个大的软件项目,可能还要复杂很多很多。 要设计一个面向对象的系统,建议遵循如下思路:1. 调研,完成一份详细的需求文档 (1)系统要实现什么功能 (2)性能上有什么特别的要求 (3)哪些是技术难点,可以的话对技术难点首先测试攻关2. 确定系统的运行环境 (1)系统运行的操作系统:widows,linux,unix等 (2)使用何种编程语言:c/c++,java,C# 等 (3)使用何种界.. 阅读全文
posted @ 2012-09-09 14:40 bitbit 阅读(1532) 评论(0) 推荐(0) 编辑
摘要: 类设计五项基本原则原则:单一职责原则开放封闭原则Liskov替换原则依赖倒置原则接口隔离原则第8章 单一职责原则 ( SRP )就一个类而言.应该仅有一个引起它变化的原因. 一个class就其整体应该只提供单一的服务 如果一个class提供多样的服务,那么就应该把它拆分,反之,如果一个在概念上单一的功能却由几个class负责,这几个class应该合并 第9章 开放-封闭原则 ( OCP )软件实体(类. 模块. 函数等等)应该是可以扩展的. 但是不可修改的.例如.把一个类的功能抽象出来.形成一个抽象接口.然后对该接口编程.这样当需要扩展时只要从该接口派生一个新类就可以完成扩展的功能.看一个例. 阅读全文
posted @ 2012-09-09 14:34 bitbit 阅读(973) 评论(0) 推荐(0) 编辑
摘要: C++虚函数表解析 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰的剖析。当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段 阅读全文
posted @ 2012-09-09 13:58 bitbit 阅读(196) 评论(0) 推荐(0) 编辑
摘要: C++多态性C++中的多态(虽然多态不是C++所特有的,但是C++中的多态确实是很特殊的)分为静多态和动多态(也就是静态绑定和动态绑定两种现象),静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态;发生在运行期的则是动态绑定,也就是动多态。静多态可以通过模板和函数重载来实现(之所说C++中的多态主要还是因为模板这个东西),下面举两个例子:1)函数模板template <typename T>T max(const T& lsh, const T& rhs) { return (lsh > rhs) ? lsh : rhs; 阅读全文
posted @ 2012-09-09 13:54 bitbit 阅读(1322) 评论(0) 推荐(1) 编辑