在图9所示的哈希树状态下,再插入一条数据记录\((key=31)\)。则会发现该数据记录路径上的子节点均有数据记录,已经没有位置给予新插入的数据,这种情况称为数据插入溢出。
对于指定的除数序列 且\(M=\{m_i|m_i∈N^∗ \}\,(m_i>1,i∈N……∗)\)和结果序列\(R=\{r_i|r_i∈N\}\,(i∈N^∗)\) ,如果插入数列有如下形式,则会导致数据插入溢出:
\[K = \{ k_1 m_1 + B_1(r_1), k_2 m_1 m_2 + B_2 (r_1, r_2), …… \\ k_n m_1 m_2 ……m_n + B_n(r_1, r_2, ……, r_n)\}\]
其中\(k_i \in N\)。\(B_i\)则是满足部分余数序列的特解。
出现数据插入溢出的概率\(\phi_m\)为:
\[\phi_m=\frac{1}{[\frac{D}{m_1}]} \cdot \frac{1}{[\frac{D}{m_1\cdot m_2}]} \cdot …… \cdot \frac{1}{[\frac{D}{m_1 \cdot m_2 …… \cdot m_n}]} \cdot \frac{1}{D} \cdot D \\ = \frac{m_1}{D} \cdot \frac{m_1 \cdot m_2}{D} \cdot …… \cdot \frac{m_1 \cdot m_2 \cdot …… \cdot m_n}{D}\]
例如:当除数数列\(M=\{2,3,5\}\)时,可以得到数据插入一处的概率\(\phi_m\)为:
\[\phi_m = \frac{2}{30} \cdot \frac{2\times 3}{30} \cdot \frac{2\times 3 \times 5}{30} \cong 0.0133 \]
当除数序列为本文推荐的除数序列\(M^*=\{256,255,253,251,247,……,107\}\)时,逐级可以计算得到数据插入溢出的概率为:
层级 | 溢出概率 |
---|---|
2 | 0.003921 |
3 | 6.127e-8 |
4 | 3.874e-15 |
5 | 1.041e-24 |
6 | 1.280e-36 |
7 | 6.870e-51 |
8 | 1.843e-67 |
9 | 2.436e-86 |
10 | 1.522e-107 |
…… | …… |
32 | <1.7e-308 |
由上表可以看出,按照本文推荐的除数序列是几乎不存在数据插入溢出,除非人为刻意去实施。实际应用中,随着哈希树中保留的数据量越来越多,出现插入溢出的概率会逐步提升。
对于这种数据插入溢出的情况,具体处理建议如下:
- 选择更长的除数数列。
实际应用当中,选择尽量长的除数数列(例如本文推荐的数列长达32),因此可以将这种数据插入溢出的概率降至最低。 - 抛出异常。
遇到数据插入溢出,则直接抛出程序异常。然后对原有程序设计和参数选择进行重新审视。