【问题标题】:Worst case input of linked list algorithm链表算法的最坏情况输入
【发布时间】:2018-05-23 04:39:39
【问题描述】:

算法:

发布列表是一个单链表,每个节点都有一个额外的跳转字段。跳转字段指向任何其他节点。跳转列表排序是如果跳转字段指向之前没有探索过的节点,我们总是首先跟随跳转字段,然后从下一个位置的节点开始搜索。编写一个递归例程,获取帖子列表并计算跳转优先顺序。

这是作者的解决方案(非常简单):

def search_postings_list(L):
  def search_postings_list_helper(L):
    if L and L.order == -1:
      L.order = order[0]
      order[0] += 1
      search_postings_list_helper(L.jump)
      search_postings_list_helper(L.next)
  order = [0]
  search_postings_list_helper(L)

我的问题:

根据解决方案,最坏情况输入是每个节点的跳转节点和下一个节点相等。我不确定我是对还是错。

如果是这种情况,堆栈大小确实会达到 N max 并且每个节点都被触摸两次,但是……即使不是这种情况,每个节点也会被触摸两次。例如,如果node A 有一个指向node C 的跳转指针及其指向node Bnext 指针,那么node C 将在node B 之前被探索,但最终,node B 会将node C 放回递归堆栈(它只会在第 3 行之后弹出)。那么为什么这是最坏的情况呢?

【问题讨论】:

  • 你的意思是时间或空间上的最坏情况还是两者兼而有之?

标签: python algorithm recursion


【解决方案1】:

您似乎引用了 Elements of Programming Interviews: The Insiders' Guide 的书,第 9.5 节。

正确地说明了这个算法的时间复杂度是O(n)。当谈到最坏的情况时,它是关于空间复杂度,而不是时间复杂度(您正确推理没有特别的最坏情况):

递归实现的最大调用堆栈深度为 n,... 最坏情况的输入是每个节点的跳转和下一个节点都相等。

注意这句话的上下文:这是堆栈大小(空间)的最坏情况。

【讨论】:

  • 如果每个节点的跳转都是前一个节点,第一个跳到最后一个,那不是也造成了n的堆栈深度吗?
  • 是的,但是书中只提到了一个例子(“最坏的情况”,而不是“最坏的情况”)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多