最糟糕的案例输入链表算法

时间:2018-05-22 14:23:26

标签: python algorithm recursion

算法:

  

发布列表是单个链接列表,每个节点都有一个额外的跳转字段。跳转字段指向任何其他节点。跳转列表排序是我们总是首先跟随跳转字段,如果它导致先前未探索过的节点,然后从“下一个位置的节点”搜索。编写一个递归例程,该例程采用过帐列表并计算跳转优先顺序。

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

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的跳转指针及指向next的{​​{1}}指针,那么node B会在node C之前进行探索,最终,node B会将node B放回递归堆栈(它会在第3行之后弹出)。那么为什么这是最糟糕的情况?

1 个答案:

答案 0 :(得分:1)

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

它正确地指出该算法的时间复杂度为 O(n)。当谈到最坏的情况时,它是关于空间复杂性,而不是时间复杂性(没有特别糟糕的情况,正如您正确推理的那样):

  

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

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