链表搜索时间复杂度的数学递归方程

Mathematical Recursive Equation for Time complexity of Linked list Search

如何为使用递归在链表中搜索整数 x 的 'time complexity' 制定数学方程式。递归方程显然应该以 n 为单位(其中 n = 链表中元素的总数)。下面是链表中递归搜索的Java实现。

public static int search(Node head, int x) {
  if(head==null)
    return -1;
  else if(head.data==x)
     return 1;
  else {
     int res=search(head.next,x);
     if(res==-1)
        return -1;
     else 
        return res+1;
  }
}

我知道时间复杂度显然是 O(n),因为它在最坏的情况下遍历每个元素进行搜索,但我想从递归方程中得出相同的结果。

定义 , 作为执行搜索的时间复杂度,当具有目标数据的第一个节点位于具有节点的列表中的位置(从 1 开始)时。为了在没有匹配时获得有用的值,让我们定义为列表中最长前缀中没有匹配节点的节点数,...加 1。所以当没有匹配时,我们将有= + 1.

然后:

1, 0 表示空列表的情况,其中(显然)没有这样的节点。
1,表示头节点有目标数据的情况

然后我们有这些等式:

1, 0 = O(1)
1,当 > 0
时,
= O(1) , = O(1) + −1, −1 当 > 1 且 > 0

最后一个等式反映递归调用是用 head.next 进行的:该调用处理的列表比短一个节点,因此涉及的 size ()和匹配position()少一个

首先启动哪个基本案例取决于如何关联。如果 = + 1,则第一个基本案例将启动。在所有其他情况下,第二个基本案例将启动。

递归关系将因此解析为:

, = O() 当 <=
, = O(1 + ) 当 = + 1

所以在这两种情况下:

, = O()

...在最坏的情况下是 O(1 + ) = O()。