Algorithm 在摊销次线性时间内,是否有可能计算一组数与给定数模的最小值?
是否有一个数据结构,表示一大组(64位)整数,该整数以空开头,并支持以下两种操作: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(
将编号insert(s)
插入s
李>s
返回minmod(m)
中的编号s
,使s
最小s mod m
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