Category Archives: C && C++

算法技术手册 - 排序 - 堆排序

堆排序依赖于上午写道的构建堆和调整堆。

基本思想:
(1)首先执行BuildHeap(以最大堆为例),则arr[0]已经是最大元素了,如果我们要按照从小到大排序,那么它应该被放在arr[n-1]上,于是,我们swap arr[0]和arr[n-1]。
(2)类似的,我们让i从n-1到0,依次执行调整堆,AdjustHeap(i,n),每次调整完成后,堆顶部一定是最大元素,正好把他换到i-2上。
上述的思路和选择排序是不是非常相似!

改进:
调整堆实际用到了递归方法,而其实它是[......]

继续阅读

算法技术手册 - 排序 - 堆排序 - 调整堆和构造堆

堆的下标相关:

对于大小为n的堆(0~n-1)中的一个元素idx
(1)左孩子:idx*2 + 1
(2)右孩子:idx*2 + 2
(3)父亲结点:(idx-1)/2
(4)最大(右下)的非叶子结点:n/2-1
特别注意(4)区别于(3),为什么呢?最后一个结点为n-1,那么它的父亲结点肯定是最后一个非叶子结点。即(n-1-1)/2 = n/2 - 1,都是下标搞的麻烦是吧!

目的:通过n/2-1次调整堆,可以构造一个堆。

调整堆(i,max):将i及之后(右、下)[......]

继续阅读

在Python中调用C++,使用SWIG

SWIG:Simplified Wrapper and Interface Generator,顾名思义,就是将C/C++包装为其他高级语言的Wrapper工具,非常好用。

该项目历史悠久(创始于1995年!),且一直非常活跃,目前最新版本为2011年5月发布的2.0.4。

1、安装SWIG
wget http://prdownloads.sourceforge.net/swig/swig-2.0.4.tar.gz
tar -xzvf swig-2.0.4.tar.gz
cd[......]

继续阅读

MurmurHash3的官方实现

首先声明,根据我的实验测试,MurmurHash并非碰撞效率最好的,但确实是速度非常非常快的。

我将基于C++和如下的官方实现,开发BloomFilter并开源,尽请关注。

http://smhasher.googlecode.com/svn/trunk/MurmurHash3.h
http://smhasher.googlecode.com/svn/trunk/MurmurHash3.cpp[......]

继续阅读

Linux下如何合并两个.a库为一个,如何追加。

将两个库合并为一个,其实就是解开,获得所有的.o,然后再打包,这种方法当然也适合多个。
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
如何向一个.a中追加.o
ar rcs libabc.a *.o
2012.3.1更新:

其实搞复杂了,最简单的还是解压出各种.o,然后再合并:
ar x <library name 1>
ar x <library name 2>
......
ar cs &l[......]

继续阅读