gperf--GNU完美哈希函数生成器用户手册

介绍
************
  'gperf'是一个用C++编写的完美的hash函数生成器.它通过一个完美的hash函数F转
换一个含有N元素的用户特定关键字集合到集合W. F唯一映射关键字到W的0..K范围,其
中K>=N如果K=N那么F就是最小化的完美hash函数.'gperf'生成一个0..K元素的静态查
找表和一对C函数.这些函数决定一个给定的字符串S是否在集合W中,通过只多一次的查找.

  'gperf'普遍用于为多个商业编译器,研究型编译器,语言处理工具的词法分析器生成一
个关键字识别器.这些编译器包括GNU C, GNU C++, GNU Pascal, GNU Modula 3,
和GNU indent.完整的'gperf'C++源代码可以通过匿名ftp`ics.uci.edu' 和 `ftp.
santafe.edu'得到.'gperf'已经随GNU libg++一起发布好几年了.高度相似,功能等价
的K&R C版本'gperf'已经存档于comp.sources.unix, volume 20.最后,一篇有关
'gperf'设计和实现的十分详细资料可以在第二次USENIX C++会议录中找到.

`gperf'静态查找结构和GNU 'gperf'
****************************************
  一个"静态查找结构"是一个有一些基本操作的抽象数据类型,这些操作如:初始化,插入,
和检索概念上,所有插入都发生在检索之前.在实际中,'gperf'生成一个'static'数组,它
是包含关键字和用户指定相关属性的查找集.这样,基本上没有执行所有插入时间花费(预先放
置在数组中).这是一个有用的数据结构用于表示"静态查找集".静态查找集经常能在软件系统
应用中发现.通常静态查找集包含编译器关键字,汇编指令代码,和内置shell命令解释.查找集
成员,称为关键字,其只被插入结构中一次,通常是在程序初始化时,并在实时运行时不作修改.

  有许多静态查找结构实现方式,如,数组,链表,二叉查找树,数字查找元组,和哈希表.不同的
方法提供了在空间利用和查找效率上的权衡.例如,一个N个元素的已排序数组是空间有效,虽然
查找花费的平均时间复杂度是与log N成例.相反,哈希表实现通常能在常数时间定位一个表中
的记录,但通常需要额外的内存开销和呈现出在最坏情况下的低性能.

   "最小化完美哈希函数"为一种特殊的静态查找集提供一个理想的解决方案.一个最小完美哈
希函数被定义具有以下两个性质
 * 它允许识别一个静态查找集中的关键字最多只要在哈希表中进一"一次"探测.这个
   性质代表"完美"性质
 * 实际内存分配用于保存关键字精确地刚好足够保存关键集,并不会"更大".这是"
   最小化"性质.

   对于许多应用生成"完美的"哈希函数比生成"最小完美"哈希函数容易.而且,在实际中非最
小化完美哈希函数往往会比"最小完美"哈希函数执行更快.这种现象的发生是因为查找一个稀疏
关键字表增加了定位到一个"NULL"记录的概率,因此减少字符串的比较.'gperf'默认方式是关
键字符集生成"近似最小化"完美哈希函数.然而,'gpref'提供了许多选项许可用户控制最小化
和完美性的程度

   静态查找集通常在时间上呈现相对稳定.例如,Ada's 63保留字(就是静态查找集)已保持常数
将近十年.因此,如果其后每次都要重复实现,那么花费努力去一次性商定构造一个最佳查找结构是
十分值得的.'gperf'移除手动实现一个权衡空间和时间的查找集的苦差事.已经证明它是一个十分
实用的工具用于各种程序设计工程.'gpref'的输出普遍被用于多个商业编译器,研究型编译器,包括
GNU C, GNU C++, GNU Pascal, GNU Modula 3.最后两个编译器还没有成为官方GNU发行.每个
编译器利用'gperf'去自动生成静态查找结构去有效地标识它们的保留字.

`gperf' GNU'gperf'的高级描述
*************************************
   完美哈希函数生成器'gperf'由一个关键文件("keyfile"或默许的标准输入)读入一个关键字集
合它尝试得到一个完美哈希函数通过最多一次在查找表中探测去识别"静态关键字"成员.如果'gperf'
成功地产生一个这样的函数,那么它会产生一对C源代码例程去执行散列和表的查找识别.所有生成的C代
码定向为标准输出.接下来的命令行选项描述允许你去修改'gperf'的输入输出格式

   默认地,'gperf'尝试通过减少强调有效的空间利用来生成更具时间效率的代码.然而,几个选项存在
允许以执行时间换取空间存储.特另地,扩展生成表格大小产生一个稀疏查找结构,一般地产生更快的查找.
相反,你可以指示'gperf'去利用C的'switch'语句安排最小数据空间存储大小.此外,使用C switch可以
实际上在某种程度上提高关键字的检索时间.当然这也与你的C编译器有关

   一般地,'gperf'分配值给字母用于散列直到结定的集合中的每一关键字对应一个唯一的值.一个十分
有用的启发式是越大的哈希值范围,'gperf'越容易找到和生成一个完美的哈希函数.实验表明这是'gperf'
最重要的一点.

'gperf'输入格式
====

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值