- 博客(34)
- 资源 (12)
- 收藏
- 关注

原创 C++ 对象的内存布局—— 虚继承下的虚函数
C++ 对象的内存布局(下)这篇文章的“单一虚拟继承”和“钻石型虚拟继承”时的类内存布局讲得不太清楚,我有一处疑问,我用的是VS2005,因此记录一下。 类继承图如下:这里:类B被类B1和B2虚拟继承,而B1和B2同时被D继承。B1的f()、B2的f()覆盖了B的f();D的f()覆盖了B1的f(),D的f1()覆盖了B1的f1()D的f()覆盖了B2的f(),D的
2014-08-19 12:43:09
1146

转载 VC++类继承内存布局
——谈VC++对象模型(美)简.格雷程化 译译者前言一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Object Model虽然是一本好书,然而,书的篇幅多一些,又和具体的VC++关系小一些。因此,从篇幅和内容来看,译者认为本文是深入理解C
2014-08-18 15:45:47
846

原创 数据结构之并查集
并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等。使用并查集时,首先会存在一组不相交的动态集合 S={S1,S2,⋯,Sk},一般都会使用一个整数表示集合中的一个元素。每个集合可能包含一个
2014-07-19 16:03:41
942

转载 STL源码剖析---红黑树原理详解下
原文地址:http://blog.youkuaiyun.com/hackbuteer1/article/details/7760584 算法导论书上给出的红黑树的性质如下,跟STL源码剖析书上面的4条性质大同小异。 1、每个结点或是红色的,或是黑色的 2、根节点是黑色的 3、每个叶结点(NIL)是黑色的 4、如果一个节点是红色的,则它的两个
2014-07-10 16:16:35
749

转载 STL源码剖析---红黑树原理详解上
原文地址:http://blog.youkuaiyun.com/hackbuteer1/article/details/7740956一、红黑树概述 红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。这一点在我们了解了红黑树的实现原理
2014-07-10 16:14:06
673

原创 平衡二叉树(AVL树)
平衡二叉树:是一颗空树;或者具有以下性质的树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。平衡二叉树的关键在于插入结点时如何保持整棵树的平衡性。下面是不平衡发生的四种情况:(1)平衡二叉树某一节点的左孩子的左子树上插入一个新的节点,使得该节点不再平衡。LL型(左孩子的左子树)由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至
2014-07-09 14:27:22
906

原创 二叉排序树
二叉排序树(Binary Sort Tree):或者是一颗空树,或者是具有以下性质的树:(1)若它的左子树不空,则左子树上所以结点的值均小于它的根节点的值;(2)若它的右子树不空,则右子树上的所以结点的值均大于它的根节点的值;(3)它的左、右子树也分别是二叉排序树。二叉排序树的基本操作均可以在O(h)时间内完成(算法导论p165)。相关操作代码如下:int InsertBST(BiTr
2014-07-08 23:14:25
814
转载 从头到尾彻底理解KMP(2014年7月版)
从头到尾彻底理解KMP作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文。1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得非常混乱,如此,留言也是“骂声”一片。所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终
2014-07-30 10:29:54
1402
原创 直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序
一、直接插入排序稳定,时间复杂度:最好O(n)、最差O(n^2)、平均O(n^2),空间复杂度O(1)void InsertSort(int L[], int n){ int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i];
2014-07-06 14:13:07
1454
原创 计数排序、基数排序与桶排序
一、计数排序稳定、 当输入的元素是n 个小区间(0到k)内整数时,它的运行时间是 O(n + k),空间复杂度是O(n)。const int K = 100;//计数排序:假设输入数据都属于一个小区间内的整数,可用于解决如年龄排序类的问题//Input:A[0, ..., n-1], 0 <= A[i] < K//Output:B[0, ..., n-1], sorting of A
2014-07-06 13:25:49
965
原创 快排、归并排序(分治)、堆排序
(1)快速排序算法以及应用快速排序中划分的思想求数组中第k小的数,最小的前k个数。(2)归并排序算法以及利用归并排序计算数组的逆序对数。(3)堆排序
2014-07-04 23:42:35
1899
原创 利用堆实现堆排序&优先队列
假设要实现非递减排序,则需要用要大顶堆。此处设计到三个大顶堆的操作:(1)自顶向下调整操作:MaxHeapify(对应堆的SiftDown操作)、(2)利用数组建立大顶堆:BuildMaxHeap、(3)不断交换堆顶元素(堆的最大元素)和堆的末尾元素,实现非递减排序。优先队列分为最大优先队列和最小优先队列,分别借助于大顶堆和小顶堆。优先队列有以下基本操作:(1)提取队列中的最大(小)元素;(2)提取队列中的最大(小)元素并从队列中删除;(3)将队列中元素为x的关键字减少(增大)到k,这里假设k的值不大(
2014-06-19 12:15:39
3877
原创 数据结构之(二叉)堆
(二叉)堆是一个数组,是一颗近似完全二叉树,分为大顶堆&小顶堆。表示堆的数组A有两个属性:(1)A.length表示数组元素的个数;(2)A.heap-size表示有多少个堆元素存储在数组A中。更多的关于堆的性质的介绍:算法导论第三版:p85-p89、编程珠玑:p141-p145。堆的操作主要包括堆插入、堆删除两个,而堆插入设计到FixUp操作(自底向上调整),堆删除涉及到FixDown操作(自顶向下调整,大顶堆时对应算法导论上的MAX-HEAPIFY操作)。本文主要给出的是大顶堆和小顶堆的基本操作的C
2014-06-19 10:41:19
1425
原创 最短路径之Floyd算法
图文并茂。Dijkstra算法求某一个源点到其余各顶点时间复杂度是O(n^2),但如果采用此算法,找从某一源点到某一特定终点的最短路径,复杂度仍为O(n^2)。求每一对顶点之间的最短路径:(1)每次以一个顶点为源点,重复执行Dijkstra算法n次。总的时间复杂度是O(n^3);(2)弗洛伊德(Floyd)算法:时间复杂度也是O(n^3),但形式上更简单。
2014-06-10 00:16:01
2310
原创 最短路径之Dijkstra算法
本文简单描述了Dijkstra(迪杰斯特拉)算法,结合一个实例进行了算法流程描述,给出了C语言的算法实现。另外给了两个直接应用Dijkstra算法求解ACM题的链接。
2014-06-09 16:37:48
28240
1
原创 数据结构之最小生成树
最小生成树: 一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。这种构造连通网的最小代价生成树称为最小生成树,详见数据结构之图(术语、存储结构、遍历)。求连通网的最小生成树有两种经典方法:普里姆(Prime)算法和克鲁斯卡尔(Kruskal)算法。1、Prime算法(1)算法描述假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。从V中任选一个顶点u0,算法从U={u0}(u0∈V),TE={}开始,重复执行以下步骤:在所有u∈U、v∈V-
2014-06-09 15:13:46
2728
原创 bitmap与2-bitmap使用总结
bitmap是一种简单的数据结构,但在存储空间压缩方面却使用广泛。bitmap就是用一个bit位来标记某个元素是否存在:1表示存在,0表示不存在;而2-bitmap就是用两个bit为来标记某个元素出现的次数:00出现0次,01出现1次,10出现2次及其以上,11无意义。2-bitmap在内存中的表示如下: [0] [1] [2] …… |00 00 00 00|00 00 00 00|00 00
2014-06-05 11:02:28
2462
原创 C语言str系列库函数之strspn()、strcspn()和strpbrk()
在vc++8.0的函数库中,strtok()函数的实现采用了bit map
2014-05-31 13:35:36
4673
1
原创 Winsocket 三:非阻塞server&client程序(tcp)
在 Winsocket 一:单线程阻塞server&client程序(tcp) 和 Winsocket 二:多线程阻塞服务器程序(tcp)简单接收了阻塞tcp程序,阻塞式tcp程序服务器程序会因为建立连接和关闭连接而频繁的创建和关闭线程会产生大量的内存碎片,从而导致服务端程序不能保证长时间的稳定运行,本文简单介绍非阻塞式tcp程序的编写。一、非阻塞阻塞是指在进行一个操作的时候,如服
2014-05-20 11:58:35
4487
原创 Winsocket 一:单线程阻塞server&client程序(tcp)
简单介绍什么是Winsocket以及server/client应用程序模型,给了一个简单的server/client程序的tcp实现。一、Winsocket简介 Winsocket是unix/linux下的berkeley socket在Windows下的实现。unix/linux下的berkeley socket是网络通讯方面的基石,应用程序通过调用berkeley soc
2014-05-20 00:01:12
2077
1
数据结构之最小生成树
2014-06-08
数据结构之图
2014-06-04
数据结构之循环顺序队列
2014-05-30
数据结构 顺序栈
2014-05-30
数据结构之单链表
2014-05-28
数据结构之线性表的顺序表示和实现
2014-05-28
非阻塞server&client程序(tcp)
2014-05-20
多线程阻塞服务器程序(tcp)
2014-05-20
单线程阻塞tcp server&client程序
2014-05-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人