【问题标题】:skip list for small data sets小数据集的跳过列表
【发布时间】:2012-10-14 01:28:03
【问题描述】:

我对使用 A* 的打开列表的跳过列表很感兴趣。然而,让我感到困扰的是它的概率性质。开放列表可以从非常小的节点集到大量节点,并且需要保持每个节点的性能。

据我了解,跳过列表对于小型数据集随机给出错误结果的可能性更高。我认为这可能会在生成大量短路径时出现问题。

我正在考虑解决这个问题,为什么不在一定程度上监视随机数。保持每个级别的节点数量的运行总数,并且为了保持每个级别之间节点的理想分布,有时会干预并强制节点成为特定级别。

我不确定这在我的给定应用程序中的效果如何,我是否应该专注于我的开放列表的另一个数据结构。

我在跳过列表上阅读的所有文章都没有提到这种优化。由于我对整个性能分析游戏还很陌生,因此我不愿尝试改进已记录的数据结构。

【问题讨论】:

  • 美妙之处在于,跳过列表对于小列表有不好的属性是无关紧要的,因为小列表无论如何都会很快,即使降低到线性查找时间。直到分析并发现它是一个问题之前,我不会担心这个。

标签: algorithm data-structures language-agnostic skip-lists


【解决方案1】:

我建议您创建一个程序,随机生成您希望 A* 算法创建的长度的跳过列表。检查这些列表,看看有多少不是最佳的。

我不建议尝试创建具有您建议的监控的生产跳过列表数据结构。您可能会发现监控和干预代码会导致跳过列表在一般情况下表现不佳。

【讨论】:

  • 我有点好奇为什么它会在一般情况下表现不佳。如果我只将我的篡改限制在插入新节点的级别,那会对性能产生那么大的不利影响吗?
  • 监控随机数的代码将要求您为每个列表存储这些数字并在每次插入时迭代它们。这将大大增加已完成的工作量。现在,如果您主要关心的是搜索小列表,那么我会说不要太担心它,因为即使是小列表的线性搜索(如果非常非最佳,跳过列表会退化)也会非常快.
【解决方案2】:

当你说“跳过列表更有可能随机给出小数据集的坏结果”时,你到底害怕什么?

您不应该害怕的是,对于一个包含 10 个元素的列表,没有足够的 2 级或 3 级节点来加速遍历。迭代 2 个元素或 10 个元素的链表(没有 2+ 级节点的skiplist 归结为)之间的区别基本上不存在,即使在紧密循环中(数据所需的节点引用管理类型)结构可能会产生更大的影响)。

显然,一旦您获得更多元素,没有足够的更高级别节点的影响就会增加。但幸运的是,获得更高级别节点的机会也增加了。例如,如果添加 8 个元素,它们都成为 1 级节点的机会是 0.5^8 = 0.39%,即极不可能。

【讨论】:

    【解决方案3】:
    1. 是的,你是对的 - 在谈论小型跳过列表时,跳过列表有更高的衰减机会。
      一般来说,根据this paper,有一个常数alpha使得跳过列表超过alpha * n空间的概率小于1/2<sup>Ω(sqrt(n))</sup> - 所以随着跳过列表变大,概率这个(超过这个限制)变得越来越小。

    2. 为避免跳过列表最坏的情况,可以使用原始跳过列表的一种变体,即确定性跳过列表。这个话题在this thesis work

    3. 中讨论
    4. 其他替代品是balanced BSTs,例如AVLred-black-tree,甚至B+ trees(通常用于文件系统)。

    5. 如果您的“开放集”确实如此之小 - 您的分支因子也很可能非常小(接近 1),或者确切地说是 B^d(d=解的深度;B=分支因子)也会很小。这将导致快速查找,无论跳过列表如何实现,因为预计需要很少的节点。

    【讨论】:

    • 确定性跳过列表听起来很有趣,必须阅读那篇论文。
    猜你喜欢
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多