插入溢出

在图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\}\)时,逐级可以计算得到数据插入溢出的概率为:

层级溢出概率
20.003921
36.127e-8
43.874e-15
51.041e-24
61.280e-36
76.870e-51
81.843e-67
92.436e-86
101.522e-107
…………
32<1.7e-308

由上表可以看出,按照本文推荐的除数序列是几乎不存在数据插入溢出,除非人为刻意去实施。实际应用中,随着哈希树中保留的数据量越来越多,出现插入溢出的概率会逐步提升。

对于这种数据插入溢出的情况,具体处理建议如下:

  1. 选择更长的除数数列。
    实际应用当中,选择尽量长的除数数列(例如本文推荐的数列长达32),因此可以将这种数据插入溢出的概率降至最低。
  2. 抛出异常。
    遇到数据插入溢出,则直接抛出程序异常。然后对原有程序设计和参数选择进行重新审视。