Algorithm 如何证明数据结构的下限logn?

Algorithm 如何证明数据结构的下限logn?,algorithm,data-structures,Algorithm,Data Structures,我有一个家庭作业问题,如下所示(请注意,我不是在寻找准确的答案,只是在寻找简单的建议继续前进) S是一种支持插入(x,S)、删除(x,S)和 查找时间上最小的项目这是一个相当广泛的问题,插入(x,S)、删除(x,S)和查找最小的项目的下界将取决于用于存储插入的项目的数据结构,等等,就像在O(1)中插入的数组一样,delete取决于在该数组中找到项,然后将其删除(使用线性搜索,它将是O(n),使用二进制搜索,它将是O(logn)),对于数组的Find_minimable_项,它将是关于排序的,如果

我有一个家庭作业问题,如下所示(请注意,我不是在寻找准确的答案,只是在寻找简单的建议继续前进)

S是一种支持插入(x,S)、删除(x,S)和
查找时间上最小的项目这是一个相当广泛的问题,插入(x,S)、删除(x,S)和查找最小的项目的下界将取决于用于存储插入的项目的数据结构,等等,就像在O(1)中插入的数组一样,delete取决于在该数组中找到项,然后将其删除(使用线性搜索,它将是O(n),使用二进制搜索,它将是O(logn)),对于数组的Find_minimable_项,它将是关于排序的,如果数据是随机的,它将是O(n),但您可以使用变量之类的技巧来保存最小值,在插入时,比较最小的,如果不是,修改最小的,然后你可以在O(1)中返回最小的,如果你需要一个指针,指向最小的项目的确切位置,你可以在O(logn)中找到它

对于树来说,这是一个完全不同的故事

因此,什么样的数据结构很重要,但这里需要一个下限,即下限可以有多低,为此,您需要看看如何证明,无论做什么,Insert都不能有这个下限,delete有这个下限,而find_最小的有这个下限。这意味着您需要尽可能为所有方法提供一个下限


这是一个有趣的问题,请在这里发布您的发现。仅出于兴趣,理论上可以按O(1)排序。

Ω(logn)
是一个下界的例子,你被要求证明
T(n)
有一个下界,而不是它的下界是
Ω(logn)

将你的问题减少到另一个下界会给你O()的上界,而不是下界

另一方面,如果您可以使用问题的任何解决方案来实现具有已知下限的其他算法(有效地将该问题简化为您的问题),则可能会给出您所寻找的下限


答复:

正如其他人所建议的,您可以使用数据结构来实现排序:

for i in range(input):
    Insert(S, input[i])
for i in range(input):
    x = Find_Smallest_Item(S)
    output[i] = x
    Delete(S, x)
对于大小为N的输入,此算法对三个操作中的每一个都进行N次调用。然而,我们知道,任何通用排序算法都必须具有O(N logn)的最坏情况

这意味着在某些情况下,上述排序中的数据结构调用的平均时间为每次调用O(logn)。因为这与任何T()不相容,渐近地优于logn,所以有了下界

一些注意事项:

  • 问题中描述的数据结构类型称为

  • 由于您试图证明任何可能的优先级队列的下限,因此无法对实现进行假设。仅仅因为特定的数据结构提供了特定的O()性能,并不意味着某些完全不同的数据结构就再好不过了

  • 有许多优先级队列数据结构满足所有调用的O(logn),因此这实际上是一个严格的下限


基于比较的排序是Ω(n*log(n)),因为该问题可以表述为决策树问题,在每个内部节点上比较列表中的两个元素。算法必须能够达到输入的任何排列,因此决策树上的叶子数至少为n!。二叉树中的叶数最多为2^h,其中h是高度,因此n!=log_2(n!)是Ω(n*log(n))


<>你指定的操作不必考虑所有n!输入的置换,如SpeedBirdNine所述,只有O(n)。使用此选项可以绑定通向叶子的决策树的高度。

您的第一次编辑不正确

我可以第一次运行find_minimen,在列表中找到最小元素后

运行
Find_minimable_Item
将在S中找到最小的元素,而不是列表中的最小元素。您首先需要插入(列表中的元素),然后才能找到任何内容

也许你应该试着写一些代码,比如:

List l = [1,25,4,3,7]
S S         // empty
List sorted // empty
//now we can do:
insert(l[0],S)
//or
delete(25,S)
//magic goes here
...
//and l is sorted!

诀窍是写下对l排序的代码(或生成另一个排序列表)。为了证明下限,计算步骤(插入、删除和findmins)并使用这样一个事实:无论您编写什么代码,它都不能(最坏情况)比
O(nlogn)
快(用于比较排序)。这给出了一个下限,它必须至少这么慢。

我想你已经得到了非常接近的答案。如果要使用排序证明S的运算下界,只需实现排序算法:

sort_with_S(items)
  S s
  add all items to s .............. < n*T_insert
  while s nonempty
    output find_smallest .......... < n*T_find_smallest
    remove the smallest element ... < n*T_remove
sort_with_S(项目)
S S
将所有项目添加到sn*T_插入
虽然它不是空的
输出查找最小值………

现在,总结一下操作的时间。如果您的算法(以及您的结构)可以处理任何可以比较的项目类型,那么我们知道排序算法具有最坏情况复杂性
Omega(n log n)
。假设(在问题的陈述中)所有三个操作的复杂性都更为具体:考虑使用这种数据结构来实现3×N数据结构操作中的n个项目的排序……例如,如果我使用平衡树作为数据结构并解释每个操作(例如,为了找到最小元素,我们必须向下运行到树的最左边的脊椎,它取O(logn),等等)这会证明下限吗?我对证明下限感到困惑,因为我描述的听起来不像是证明。实际上,你需要给出所有数据结构的下限(因为问题并没有提到任何数据结构),所以您需要给出一些