算法:
发布列表是单个链接列表,每个节点都有一个额外的跳转字段。跳转字段指向任何其他节点。跳转列表排序是我们总是首先跟随跳转字段,如果它导致先前未探索过的节点,然后从“下一个位置的节点”搜索。编写一个递归例程,该例程采用过帐列表并计算跳转优先顺序。
这是作者的解决方案(非常简单):
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行之后弹出)。那么为什么这是最糟糕的情况?
答案 0 :(得分:1)
您似乎引用了书Elements of Programming Interviews: The Insiders' Guide,第9.5节。
它正确地指出该算法的时间复杂度为 O(n)。当谈到最坏的情况时,它是关于空间复杂性,而不是时间复杂性(没有特别糟糕的情况,正如您正确推理的那样):
递归实现的最大调用堆栈深度为 n ,...最坏情况输入是每个节点的跳转和下一个节点相等的输入。
请注意此引文的上下文:这是堆栈大小(空间)的最坏情况。