【问题标题】:Josephus Flavius on segment treeJosephus Flavius 在分段树上
【发布时间】:2016-03-18 05:44:36
【问题描述】:

我想使用分段树解决 Joseph Flavius 问题。我几乎可以肯定简单的模拟(即行列式列表)是O(n^2)。我想要实现的是在特定距离的数组上跳跃,取自段树。换句话说,段树将保留有关已删除元素数量的信息,并从树中获取一些信息将允许在 O(1) 中找到下一个要删除的元素。问题是我不知道如何在段树中存储信息以使其适用于 Joseph Flavius 问题。

在每个节点中保留了某种额外的值?但是如何查询下一个元素呢?

【问题讨论】:

  • 你已经编码了吗?
  • 唯一基于链表的方案,复杂度太大。
  • 这个问题最简单的解决方案根本不使用数据结构。它从结束位置(当只剩下一个人时)开始,循环计算之前执行的人的位置。第二个最简单的解决方案从 n 个人开始,并使用递归。当 n 很大时,这会使用太多堆栈,但您始终可以实现自己的堆栈并将递归作为循环进行。

标签: arrays algorithm data-structures segment-tree josephus


【解决方案1】:

我的第一个想法是二进制搜索 + sement 树的总和给出 O(log^2(n))

从 L 跳转到 R 具有以下性质:

R - L + 1 - sum(L, R) == skip_value

您可以使用 bin-search 轻松找到具有此属性的 R。 当你绕一个完整的圆圈时会变得有点复杂,但我相信你明白了。

如果有什么不清楚的欢迎随时提问。

(我也会考虑log(n)解决方案)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2018-11-19
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多