关于跳过列表元素频率

问题描述

首先,我对跳过列表不太了解,我只是在为考试做准备。当跳过列表中有 log(n) 列表时,每个级别上最佳搜索 (log(n)) 元素的频率是多少?我知道在处理 2 个列表时,第一个有 n 个元素,第二个有 sqrt(n) 个元素。因此,在搜索元素时,我最多在第二个列表(上面的列表)上执行 sqrt(n) 个步骤,在第一个列表(包含所有元素的列表)中执行 sqrt(n) 个步骤,因为元素之间的间隙是sqrt(n)-长。所以这似乎没问题。但是在使用 log(n) 列表时,每个列表有多少个元素?

解决方法

当一个元素被添加到一个跳跃列表时,“抛硬币”几次来决定新元素应该包含在多少层中。元素总是添加到第一个(最低)层,然后在每次硬币落在正面时添加到上面的下一层。如果我们称掷硬币正面朝上的概率为 p(通常使用 p = 0.5),则每个元素以概率 1 添加到第一层,以概率 p 添加到第二层,以概率 p^2 添加到第三层层,通常概率为 p^(i-1) 到第 i 层。如果跳过列表包含 n 个元素,则第二层包含期望中的 n*p 个元素(不是 sqrt(n)),第三层包含 n*p^2 个元素,通常第 i 层包含 n*p^(i- 1)元素。例如,在 p = 0.5 和 n = 64 个元素的跳过列表中,我们希望第二层包含大约 32 个元素,第三层包含大约 16 个元素,依此类推,因此我们希望有 log_(1/p) (n) = log_2(n) 层总数。要搜索跳过列表中的元素,我们首先线性扫描最上面的列表(它只包含几个元素,可能是 2 或 3 个)。这允许我们将搜索限制在下面列表中的较小范围内。然后我们扫描下面列表的那个范围并重复这个过程,直到我们到达最底部的列表。当 p = 0.5 时,您几乎可以将其视为二分查找。例如,当 n = 64 个元素时,我们希望在最上面的列表中使用大约 32 个元素的大约 2 个步骤,将我们在下面的列表中的搜索限制在大约 32 个元素的范围内。然后,我们将以大约 16 个元素的步长扫描下面列表中的这 32 个元素,依此类推。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...