Algorithm 在摊销次线性时间内,是否有可能计算一组数与给定数模的最小值?

Algorithm 在摊销次线性时间内,是否有可能计算一组数与给定数模的最小值?,algorithm,data-structures,Algorithm,Data Structures,是否有一个数据结构,表示一大组(64位)整数,该整数以空开头,并支持以下两种操作: insert(s)将编号s插入s minmod(m)返回s中的编号s,使s mod m最小 例如: insert(11) insert(15) minmod(7) -> the answer is 15 (which mod 7 = 1) insert(14) minmod(7) -> the answer is 14 (which mod 7 = 0) minmod(

是否有一个数据结构,表示一大组(64位)整数,该整数以空开头,并支持以下两种操作:

  • insert(s)
    将编号
    s
    插入
    s
  • minmod(m)
    返回
    s
    中的编号
    s
    ,使
    s mod m
    最小
例如:

insert(11) insert(15) minmod(7) -> the answer is 15 (which mod 7 = 1) insert(14) minmod(7) -> the answer is 14 (which mod 7 = 0) minmod(10) -> the answer is 11 (which mod 10 = 1) 插入(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/2
insert
操作,然后是
n/2
minmod
操作大约需要
n^2/4
操作)


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

部分答案对于注释来说太大

假设您将
S
实现为一个平衡的二进制搜索树

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

但是,在步行过程中的某个特定时间,您将获得迄今为止最好(最低)的结果。在以下情况下,可以使用此选项避免检查整个子树:

bestSoFar < leftChild mod m
bestSoFar

rightChild-leftChild
只有当集合中的数字小于公共值
m
时,这才有很大帮助

第二天早上更新…

Grigor更好、更全面地阐述了我的想法,并展示了它如何适用于“大型”
m
。他还展示了一个“随机的”
m
通常是“大的”,因此工作得很好

Grigor的算法对于较大的
m
非常有效,因此需要考虑较小的
m
的风险。 因此,很明显,您需要考虑
m
的分布,并在需要时针对不同的情况进行优化。 例如,只需跟踪非常小的
m
的最小模量可能是值得的


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

另一个基于平衡二叉搜索树的想法,如中的答案

假设到目前为止所有插入的元素都存储在平衡BST中,我们需要计算
minmod(m)
。把我们的集合<代码> s /代码>作为数字子集的一个结合,位于区间[<强>0,M-1,[m,2M-1 ],[2m,3M-1 ] < /强>…答案显然是我们在每个时间间隔内的最小数量。因此,我们可以通过查找树来找到间隔的最小数目。这很容易做到,例如,如果我们需要在[a,b]中找到最小值,如果当前值大于[a,b],我们将向左移动,否则将向右移动,跟踪到目前为止我们遇到的[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,即64查询,数学期望值为sum[1/(2^k)*2^k]


因此,总之,平均
minmod(m)
查询复杂度将是O(64*logn)。通常,如果我们m有未知的上界,这将是O(logmlogn)。众所周知,BST更新是O(logn),因此n查询的总体复杂性将是O(nlogm*logn)

如果
n
是数组中的元素数,那么这肯定是O(n)?对于每个元素,计算
x%m
,并跟踪当前最小值。抱歉,它需要动态插入和查询,并在线回答查询,还有大量的插入和查询操作。我对问题进行了编辑,以澄清问题。模上有界吗?@matthewstrobbridge我认为它们不可能都是O(1)你可能误解了这个问题。我不明白,但这似乎是一个很好的解决办法。我想确认你是否犯了打字错误,即“间隔[0,m-1],[m,2m-1],[2m,2m-1]”,位于第三行。对不起,如果我不清楚,请告诉我你不理解的部分,我会澄清的。非常感谢。我已经理解了。但似乎该算法只适合随机m,并且在给定特殊输入时可能运行得非常慢。是的,我特别提到了均匀分布。当然,有可能给出这样的m,这将是maxim
rightChild - leftChild < m - leftChild mod m