【问题标题】:search a list in another list using Python使用 Python 在另一个列表中搜索列表
【发布时间】:2019-03-06 18:06:44
【问题描述】:

我正在尝试使用 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)增加?初学者在这里

【问题讨论】:

  • 您确定此代码有效吗?如果您只是在每次迭代之前制作i = 0,似乎您不需要第二个 for 循环。
  • @Yonlif 你是对的。第二个 for 循环实际上不需要迭代,因为它遍历假定的子列表,因此如果第一个索引不匹配,则无需进一步遍历列表,因为第一个 if 有 break 语句.所有其他代码路径都返回,因此循环永远不会被执行超过一次。本质上,for 循环只是重置i = 0 的奇特方式。

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


【解决方案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:])

【讨论】:

    【解决方案2】:

    我认为这样效果更好:

    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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多