使用Python在另一个列表中搜索列表

时间:2019-03-06 18:06:45

标签: python-3.x algorithm time-complexity sublist

我正在尝试使用Python编写子列表搜索算法。

供参考: https://www.geeksforgeeks.org/sublist-search-search-a-linked-list-in-another-list/

这是我的代码:

def sublist(arr1,arr2):
i = 0
j = 0
k = 0
if len(arr1) == 0:
    print('List1 Empty')
if len(arr2) == 0:
    print('List 2 Empty')
for j in range(0,len(arr2)):
    for i in range(0,len(arr1)):
        if arr1[i] != arr2[j]:
            break
        while arr1[i] == arr2 [j]:
            if i == len(arr1) - 1:
                return True
            i = i + 1
            j = j + 1
            if i == len(arr1):
                return False
        return False 

我确信此代码可以优化并减少时间复杂度。由于while循环,复杂度是否比O(m * n)增加?初学者在这里

2 个答案:

答案 0 :(得分:1)

我认为这种方法效果更好:

def sublist(arr1,arr2):
  "This fuction checks if arr1 is a sublist of arr2."
  for i in range(len(arr2)):
    part=arr2[i:] # part is a list which all the elements from i to the end of arr2
    if len(part)<len(arr1):
      return False
    if arr1==part[:len(arr1)]: # if arr1 is in the beginning of part return True
      return True
  return False

答案 1 :(得分:1)

以下内容将arr2的第一部分与arr1进行比较,以确定它们是否相等。如果是这样,或者对arr2的某个偏移量的任何递归调用都返回true,然后返回true。否则,如果原始arr2的子列表在任何时候都短于arr1,则返回False。

def sublist(arr1, arr2):
    if len(arr2) < len(arr1):
        return False
    return arr1 == arr2[:len(arr1)] or sublist(arr1, arr2[1:])