哈希树(HashTree)
罗堃 吴朝宏
2000年开始,作者开始研究基于TCP/IP的短信息传输技术。这种技术目前在国际上的标准被成为SMPPShort Message Peer to Peer Protocol)。SMPP协议是一种支持异步传输模式(Asynchronized Transmission Mode字符串长度的正确表示)的信息传输方式。这种异步方式主要体现在两个地方:传递信息和等待确认。在为电信运营商编写软件的过程当中,解决大容量(百万用户以上)要求下的快速查与匹配成为实现这个系统的核心任务。
    作者在反复设计整个过程中曾经尝试过很多种方式和算法,但都未能取得满意的效果。最终不得不自己开始设计针对这种系统的特殊存储模式。并在这个过程中,到了一种比较理想的数据存储结构——哈希树(HashTree)。
一、查算法
    在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系。因此在机构中查记录的时需要进行一系列和关键字的比较。这一类的查方法建立在“比较”的基础上。在顺序查时,比较的结果为“”与“”两种可能。在折半查、二叉排序树查和树查时,比较的结果为“”、“”与“”三种可能。查的效率依赖于查过程中所进行的比较次数。
    为确定记录在查表中的位置,需和给定值进行比较的关键字个数的期望值成为查算法在查成功时的平均查长度(Average Search Length)。下面我们简单讨论一下在含有个数据记录的结构中,各种查算法的平均查长度。
    在等概率的情况下,顺序查的平均查长度为:
    对于折半查(表要求是顺序表),在比较大()的时候,可有以下近似结果:
    在随机情况下(二叉树查可能退化为顺序查),对于二叉树,其平均查长度为:
在平衡二叉树上进行查,其平均查长度为:
,其中
    对于一颗阶的树,从根节点到关键字所在节点的路径上涉及的节点数可以说是平均查长度的上限:
    总的来说,这些查算法的效率都将随着数据记录数的增长而下降。仅仅是有的比较快(时间复杂度为),有的比较慢(时间复杂度是)而已。这些查算法的平均查长度是在一种比较理想的情况下获得的。在实际应用当中,对数据结构中数据的频繁增加和删除将不断地改变着数据的结构。这些操作将可能导致某些数据结构退化为链表结构,那么其性能必然将下降。为了避免出现这种情况而采取的调整措施,又不可避免的增加了程序的复杂程度以及操作的额外时间。
二、哈希表
    理想的情况是希望不经过任何比较,一次存取便能得到所查的记录,那就必须在记的存储位置它的关键字之间建立一个确定的对应关系,使每个关键字和结构中一个唯一的存储位置相对应。因而在查时,只要根据这个对应关系到给定值的像。若结构中存在关键字和相等的记录,则必定在的存储位置上,由此,不需要进行比较便可直接取得所查记录。在此,我们称这个对应关系为哈希(Hash)函数,按这个思想建立的表为哈希表。
    在哈希表中对于不同的关键字可能得到同一哈希地址,即,而。这种现象称做冲突(Collision)。在一般情况下,冲突只能尽可能地减少,而不能完全避免。因为哈希函数是从关键字集合到地址集合的映像。通常关键字的集合比较大,它的元素包括所有可能的关键字,而地址集合的元素仅为哈希表中的地址值。
    假设标识符可定义为以字符为首的8位字符,则关键字(标识符)的集合大小为,而在一个源程序中出现的数据对象是有限的,设有10000个元素。地址集合中的元素为09999。因此在一般情况下,哈希函数是一个压缩映像函数,这就不可避免的要产生冲突。
二、哈希树的理论基础
2.1质数分辨定理
    定理1选取任意个互不相同的质数:),定义:
    ),那么对于任意的,()=()不可能总成立。
    证明:假设定理1的结论不正确,那么对于任意的,()=()将总是成立。这个可以表达为:
    设:
    显然,是一个合数,而且包含质因素。根据质数的定义和质因素分解定理,可以表达为:
    而另外一方面,根据,可以得出:
    很明显,这两个结论是相互矛盾的。因此原定理1正确。
    这个定理可以简单的表述为:个不同的质数可以“分辨”的连续整数的个数和他们的乘积相等。“分辨”就是指这些连续的整数不可能有完全相同的余数序列。这个为哈希树的分辨方式奠定了理论基础。
显然,这个定理的一个特殊情况就是为从2起的连续质数。我们可以记为前个连续质数的乘积。连续10个质数就可以分辨大约个数,已经超过计算机中常用整数(32bit)的表达范围。连续100个质数就可以分辨大约
而按照目前的CPU水平,100次取余的整数除法操作几乎不算什么难事。在实际应用中,整体的操作速度往往取决于节点将关键字装载内存的次数和时间。一般来说,装载的时间是由关键字的大小和硬件来决定的;在相同类型关键字和相同硬件条件下,实际的整体操作时间就主要取决于装载的次数。他们之间是一个成正比的关系。
2.2余数分辨定理
    在这里,我们对更为普遍的余数分辨方式做一个讨论。
定理2选取任意个互不相同的自然数:),定义LCMLease Common Multiple)为的最小公倍数。
    ),那么对于任意的,()=()不可能总成立。
    证明:假设定理2的结论不正确,那么对于任意的,()=()将总是成立。这个可以表达为:
    设:
    显然,是一个合数,而且包含因素。根据最小公倍数的定义,可以表达为:
    而另外一方面,根据,可以得出:
    很明显,这两个结论是相互矛盾的。因此原定理2正确。
这个定理2可以简单的表述为:个不同的数可以“分辨”的连续整数的个数不超过他们的最小公倍数。超过这个范围就意味着冲突的概率会增加。定理1是定理2的一个特例。
2.3分辨算法评价标准
1. 状态和特征
分辨也即分辨不同的状态。分辨一般是先定义一组不同的状态,然后将这些状态记录下来形成特征。由这些特征所形成的空间是特征空间。特征空间的纬数是特征数列的长度。
2. 分辨能力
分辨能力D,也称分辨范围,就是指分辨算法可以分辨的最大连续空间大小。在这个范围内,
分辨算法可以唯一确定被分辨数。即任何两个在分辨范围内的数,不可能具有完全相同的特征数。这些特征数会以某种形式被记录下来,或者以数据结构的形式体现出来。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。