【问题标题】:Is it possible to compute the minimum of a set of numbers modulo a given number in amortized sublinear time?是否可以在摊销的亚线性时间内计算一组数字的最小值?
【发布时间】:2013-07-25 07:25:55
【问题描述】:

是否有一个数据结构表示一个大集合S(64 位)整数,它开始为空并支持以下两个操作:

  • insert(s)将数字s插入S
  • minmod(m)S 中返回数字s,使得s mod m 最小。

一个例子:

插入(11) 插入(15) minmod(7) -> 答案是 15(mod 7 = 1) 插入物(14) minmod(7) -> 答案是 14(mod 7 = 0) minmod(10) -> 答案是 11(其中 mod 10 = 1)

我有兴趣最小化花费在n 此类操作序列上的最大总时间。显然可以只为S 维护一个元素列表,并为每个minmod 操作迭代它们;那么insert是O(1),minmod是O(|S|),这将花费O(n^2)时间进行n操作(例如,n/2insert操作,然后是n/2minmod操作大约需要n^2/4操作)。

那么:对于一系列n 操作,是否有可能比O(n^2) 做得更好?也许O(n sqrt(n))O(n log(n))?如果这是可能的,那么我也很想知道是否有数据结构另外允许从S 中删除单个元素,或者删除一个区间内的所有数字。

【问题讨论】:

  • 如果n 是数组中元素的数量,那么这肯定是O(n) 吗?对于每个元素,计算x % m,并跟踪当前最小值。
  • 抱歉,需要动态插入查询,在线回答查询,插入查询操作海量。
  • 我已经编辑了问题以使其清楚。
  • 模数有界吗?
  • @MatthewStrawbridge 我不认为他们都可以是 O(1) 你可能误解了这个问题

标签: algorithm data-structures


【解决方案1】:

另一个基于平衡二叉搜索树的想法,如Keith 的回答。

假设到目前为止所有插入的元素都存储在平衡 BST 中,我们需要计算 minmod(m)。将我们的集合S 视为数字子集的并集,位于 [0,m-1]、[m, 2m-1]、[2m, 3m-1] .. 等区间. 答案显然是我们在每个间隔中拥有的最小数字。因此,我们可以因此查找树以找到该间隔的最小数量。这很容易做到,例如如果我们需要在 [a,b] 中找到最小的数,如果当前值大于 a,我们将向左移动,并且否则,跟踪我们迄今为止遇到的 [a,b] 中的最小值。

现在如果我们假设 m[1, 2^64]均匀分布,让我们计算我们需要的查询数量的数学期望。

对于 [2^63, 2^64-1] 中的所有 m,我们需要 2 个查询。发生这种情况的概率是 1/2
对于 [2^62, 2^63-1] 中的所有 m,我们需要 4 个查询。发生这种情况的概率是 1/4
...
对于 [1,64] 中的 k,数学期望将是 sum[ 1/(2^k) * 2^k ],这是 64 个查询。

因此,总而言之,平均minmod(m)查询复杂度将是O(64*logn)。一般来说,如果我们 m 有未知的上限,这将是 O(logmlogn)。众所周知,BST 更新是 O(logn),因此 n 个查询的总体复杂度将是 O(nlogm*logn).

【讨论】:

  • 好吧,我没看懂,但这似乎是一个很好的解决方案。我想确认您是否输入错误,即“位于 [0,m-1 区间], [m, 2m-1], [2m, 2m-1]",位于第三行。
  • 抱歉,如果我不清楚,请告诉我您没有很好理解的部分,我会澄清。
  • 非常感谢,我已经明白了。但是这个算法似乎只适合随机m,如果给定特殊输入,它可能会运行得很慢。
  • 是的,我特别提到了均匀分布。当然可以给出这样的 m 来最大化查询数。但是,我认为没有比检查所有数字更好的算法了,比方说,如果有人想减慢您的速度,而每一步都选择了错误的 m。
  • 非常好的答案。我还想指出,如果您需要检查的间隔数大于1/log(n),您可以跟踪树的大小并回退到线性搜索。这将解决@algodynamic 关注的潜在问题。
【解决方案2】:

部分答案太大,无法评论。

假设您将S 实现为平衡二叉搜索树。

当你寻找 S.minmod(m) 时,你天真地走在树上,成本是 O(n^2)。

但是,在步行期间的给定时间,您获得了迄今为止最好(最低)的结果。在以下情况下,您可以使用它来避免检查整个子树:

bestSoFar < leftChild mod m

rightChild - leftChild < m - leftChild mod m

只有当集合中数字的公共间距小于m 的公共值时,这才会有很大帮助。

第二天早上更新...

Grigor 更好、更全面地表达了我的想法,并展示了它如何适用于“大型”m。他还展示了“随机”m 通常是如何“大”的,因此效果很好。

Grigor 的算法对于大的m 非常有效,以至于需要考虑小得多的m 的风险。 所以很明显,您需要考虑m 的分布,并在需要时针对不同的情况进行优化。 例如,可能值得简单地跟踪非常小的m 的最小模数。

但是假设m ~ 2^32?然后搜索算法(当然是给定的,但也不是)需要检查2^32间隔,这可能相当于搜索整个集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多