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

时间:2011-10-04 01:33:13

标签: algorithm data-structures

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

  

S是一种支持Insert(x,S),Delete(x,S)和   Find_Smallest_Item(S)及时< = T(n)。证明T(n)的下限   例如Ω(logn)。

到目前为止,我的想法是:

我想我需要找到一个减少,我将把这个问题简化为一个更简单的问题,并证明它不能低于logn。我阅读了许多关于下界的教程,其中大部分将问题简化为排序,然后他们将排序用作黑盒子并证明算法不能低于nlogn。

但是在这里,我们正在处理logn,我不知道这样的算法要减少到。也许它必须对树结构的深度做一些事情,登录。但我无法弄清楚从哪里开始。

你可以给我一些提示吗?

编辑:实际上我想到了一些东西,但我不知道我是否应该用这样的技巧来证明下限。所以,我假设我有insert,delete和find_smallest操作,每个操作都有一个logn时间复杂度。

例如,要构建一个排序列表,我可以使用delete和find_smallest函数,例如我可以第一次运行find_smallest,在找到列表中的最小元素后,我将删除该元素。我将再次运行它,因此我将找到第二个最小的元素,依此类推。

因此,我可以使用delete和find_smallest函数实现排序。所以,如果我继续这样做n次,每次都会记录logn(删除)+ logn(查找最小),所以总体而言,排序将采用nlogn。

我不知道如何调整此插入内容。

编辑2:为了使用插入证明:在找到列表中的第i个最小元素后,如果我将其插入第i个位置怎么办?例如在通过上述过程找到第3个最小元素后,我可以将其插入到数据结构的第3个索引中。因此,最后我将获得一个排序数据结构。

6 个答案:

答案 0 :(得分:5)

将您的问题减少到另一个问题会在O()上绑定上限,而不是更低。

另一方面,如果您可以使用问题的任何解决方案来实现具有众所周知的下限的其他算法(有效地减少了您的问题),那么这可能会为您提供您正在寻找的下限


答案:

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

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 log N)的最坏情况。

这意味着有些情况下,上述排序中数据结构调用的平均时间为每次调用O(log N)。由于这与任何T()渐近地与log N不相容,因此您有下限。

一些注意事项:

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

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

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

答案 1 :(得分:1)

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

您指定的操作不必考虑所有n!输入的排列,只有O(n)作为SpeedBirdNine提到。使用它来绑定决策树的高度,从而导致叶子。

答案 2 :(得分:1)

您的第一次修改不正确。

  

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

运行Find_Smallest_Item(S)会找到 S 中的最小元素,而不是列表中的最小元素。在找到任何东西之前,你首先需要插入(列表中的元素,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进行排序(或制作另一个排序列表)的代码。为了证明下限,计算步骤(插入,删除和查找)并使用这样的事实:无论你编写什么代码,它都不能(最坏情况下)比O(nlogn)更快(对于比较排序)。这给出了一个下限,它必须至少是

答案 3 :(得分:1)

我认为你的答案非常接近。如果您想使用排序来证明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

现在,您总结了操作的时间。如果您的算法(以及您的结构)可以处理任何可以比较的项类型,我们就知道排序算法具有最差的案例复杂性Omega(n log n)。您假设(在问题陈述中)所有三个操作都具有复杂性&lt; = T(n),这意味着您的S可以按复杂性O(n T(n))排序。你只需比较边界......

答案 4 :(得分:0)

这是一个相当广泛的问题,Insert(x,S),Delete(x,S)和Find_Smallest_Item(S)的下限取决于用于存储项目的数据结构。插入等,就像你可以在O(1)中插入的数组一样,删除取决于找到该数组中的项目然后删除它(使用线性搜索它将是O(n)并使用二进制搜索它将是O (log n)),对于数组的Find_Smallest_Item,它是关于排序,如果数据是随机的,它是O(n)但你可以使用像变量这样的技巧来保存最小的,并在插入比较它最小的,如果不是,修改最小的,那么你可以在O(1)中返回那个最小的,如果你需要一个指针等到那个最小项目的确切位置,你可以在O(log)中找到它n)中。

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

那么什么数据结构S是很重要的,但是在这里你需要一个下界,即最低界限有多低,为此你需要看看你将如何证明无论做什么,插入不能有这个下限,delete有这个下界,而find_smallest有这个下限。这意味着您需要为所有方法提供下限,尽可能。

这是一个有趣的问题,并在此发布您的发现。只是为了兴趣,Bead sort理论上可以在O(1)中排序。

答案 5 :(得分:0)

Ω(logn)是下限的示例,您被要求证明T(n)具有下限,而不是其下限是Ω(logn)