cmph (C Minimal Perfect Hashing Library)个人理解及应用简介

来源:互联网 发布:linux可命令行以做什么 编辑:程序博客网 时间:2024/05/17 04:35

经我在作一个GTK手机输入法,大致的算法是用两个查找引擎,一级引擎是数字拼音,而二级引擎是拼音汉字,一级引擎是用树和链表,而二级引擎 是用的glib库哈西表来做得,但是我今天并不是想谈我所做得项目,我今天要说的是cpmh,首先还是先看一下这两个图片的对比吧:

 

 

 

                      

 

 Figure 1: (a) Perfect hash function. (b) Minimal perfect hash function.

 

    第一附图是咱们用的普通的hash table,第二附是今天我所介绍的cmph,也就是Minimal Pfect Hash Functions的简称,用了这种方法查找,可以比普通的hash table占用更少的内存并切可以提高查找速度,相关资料http://cmph.sourceforge.net/由于相关的资料非常常少,我目前只找到只有官方的这个资

料,所以学习起来还是比较费劲的,我现在想说一下我在应用过程中的大体流程:


第一:首先要建立一个.mph文件, 可以使用cmph里面的函数,具体见英文文档的example,我用的是命令,首先要有一个key的文件,用cmph -g 选项,可以自动创建一个.mph文件。例如有一个test的文件,那么会自动创建一个test.mph文件。


第二:创建的这个文件,把你的key值对应一个hash值,可以用cmph -v test 查看一下原test文件中的key对应的hash值。具体是怎么对应的,还是去查官方文档把,这里我也是不多说,但是结果就是上面的b图的效果。


第三:这时可以自己建一个数组A,数组的下标是你得到的每个keyhash值,而对应的结果可以是key对应的val值,比如:key a b c,那么,他所对应的hash值可能是 a-》0b-》1c-》2;这样你可以写一个函数insert函数

 insert

         int id = h(a);//a对应的hash


         A
id= val;//val是原本key所对应的那个东东,:)


这样大致的一个结构就建立起来了。


第四步:查找数据,就可以去数组中查找了

lookup {

        int id = h(b);

        return A[id];


}

这样就可以了,最后还是要说一点,就是手册中没有提到怎么编译带有cmph函数的程序,其实很简单,gcc test.c -o test `pkg-config --cflags --libs cmph`就可以了。

cmph官方文档中的例子里面还运用了很多cmph中的函数,可惜都没有介绍用法,只能大家看例子来猜测或者是看源码了。