Algorithm 最坏情况下具有相同界限的等效数据结构(与摊销数据结构相比)

Algorithm 最坏情况下具有相同界限的等效数据结构(与摊销数据结构相比),algorithm,data-structures,complexity-theory,time-complexity,amortized-analysis,Algorithm,Data Structures,Complexity Theory,Time Complexity,Amortized Analysis,抱歉,我不能让我的标题很有描述性 是否每个数据结构都支持某些具有一定摊销运行时间的操作,而另一个数据结构在最坏情况下支持相同运行时间的相同操作?我对迭代的、季节性的数据结构和函数性的数据结构都感兴趣 我肯定这个问题以前一定有人问过。我似乎找不到正确的搜索关键字(在Google,SO,TCS中)。我在{yes,no,open}中寻找引用的答案。no,至少在n个元素的数量需要时间Ω(n logn)的模型中 考虑下面的数据结构,我使用Python描述了它 class SpecialList:

抱歉,我不能让我的标题很有描述性

是否每个数据结构都支持某些具有一定摊销运行时间的操作,而另一个数据结构在最坏情况下支持相同运行时间的相同操作?我对迭代的、季节性的数据结构和函数性的数据结构都感兴趣


我肯定这个问题以前一定有人问过。我似乎找不到正确的搜索关键字(在Google,SO,TCS中)。我在{yes,no,open}中寻找引用的答案。

no,至少在n个元素的数量需要时间Ω(n logn)的模型中

考虑下面的数据结构,我使用Python描述了它

class SpecialList:
    def __init__(self):
        self.lst = []
    def append(self, x):
        self.lst.append(x)
    def rotationalsimilarity(self, k):
        rotatedlst = self.lst[k:] + self.lst[:k]
        count = sum(1 if x == y else 0 for (x, y) in zip(self.lst, rotatedlst))
        self.lst = []
        return count
显然,
追加
旋转相似性
(因为它清除了列表)按O(1)摊销。如果
rotationalsimilarity
是最坏的O(1),那么我们可以提供一个O(1)
undo
操作,将数据结构恢复到其先前的状态。因此,我们可以在时间O(n)内实现元素区分

def distinct(lst):
slst=SpecialList()
对于lst中的x:
slst.append(x)
对于范围(1,len(lst))中的k:
返回错误
slst.undo()
其他:
返回真值

这是一个非常有趣的问题!我知道的每一个数据结构都有一个很好的摊销界限,它们都有一些其他的数据结构,具有相同的最坏情况时间界限,但我不确定是否总是能够保证这一点。是的,通常是一个更复杂的数据结构!我之所以有兴趣问这个问题,是因为对这个问题的每一个可能的答案都会让我感到非常惊讶:),除了可能是公开的。我对此表示怀疑。我想分期偿还真的给你买了些东西。例如,我不知道如何制作一个O(1)最坏情况下的添加,O(1)最坏情况下的访问可调整大小的数组。您可能想看看-听起来像是在寻找证据,而不是工程。@rrenaud-这样的数据结构是存在的!它被称为可扩展数组。我在这里有一个Java实现:你能证明为什么旋转相似性是O(1)摊销的吗?这似乎不正确,因为它做的第一件事是O(n)操作来构建旋转列表。X追加和y rotsim调用一起是最坏的情况O(X+y)。我为最终的大删除预付了一笔费用,每次追加一枚硬币,然后我只花了rotsim呼叫中那些硬币价值的操作费用。我不知道rotsim和undo是如何一起摊销的。我能强迫你用一系列的rotsim和Undo做很多工作吗?@rrenaud这是在假设(导致矛盾)下的,即rotsim被重新实现为O(1)最坏情况。如果是这样,我所要做的就是在rotsim呼叫期间写入的O(1)内存位置上进行写时复制。
def distinct(lst):
    slst = SpecialList()
    for x in lst:
        slst.append(x)
    for k in range(1, len(lst)):  # 1 <= k < len(lst)
        if slst.rotationalsimilarity(k) > 0:
            return False
        slst.undo()
    else:
        return True