【问题标题】:Time complexity of both the approaches (one is using dict and other list)两种方法的时间复杂度(一种使用 dict 和其他列表)
【发布时间】:2020-08-17 12:45:50
【问题描述】:

给定一个数组 A 和 B。根据数组 A 定义的顺序对 B 进行排序。B 是数组 A 的子集。 例如:

Input:
a = [52,23,34,1,98,2,57,6,12,89,176,45, 90, 35 ]
b = [12,52,1,35]
Output = [52, 1, 12, 35]

解释- 因为 52 在数组 A 中排在第一位,因此我们先打印它,然后是 1,依此类推...

解决方案1在python3中使用Hashmap/dictionary:

a = [52,23,34,1,98,2,57,6,12,89,176,45, 90, 35 ]
b = [12,52,1,35]
d ={}
j =0

for i in b:
    d[i]= j
    j = j+1
   

for i in a:
    if i in d:
        print(i)

使用数组的解决方案 2:

a = [52,23,34,1,98,2,57,6,12,89,176,45, 90, 35 ]
b = [12,52,1,35]

for i in a:
    if i in b:
        print(i)

所以我的问题是解决方案 1 和解决方案 2 的时间复杂度不同吗? 还是 O(n^2) 对于这两种解决方案......或者是解决方案 1 的 O(n) 和解决方案 2 的 O(n^2) ......还是任何其他复杂性

【问题讨论】:

  • 技术上您的第一个解决方案是显示 O(n+m) 或 O(2n),因为第一个循环需要 n 次迭代,第二个循环需要 m,然后是时间复杂度为 O(n + m),而第二种解决方案仅为 O(n)。
  • 但是解决方案 2 中的 IF 语句不是 O(n) 复杂的.. 因为 If 基本上是在列表中搜索..@FishingCode
  • 如果是嵌套的 for 循环,则为 O(n^2),但事实并非如此。在b 中找到该元素的最佳情况是 O(1) 但最坏情况是 O(n) 大小 n 常数。

标签: python arrays dictionary time-complexity


【解决方案1】:

实际上在列表中搜索一个值是 O(n) 复杂度,所以第二个解决方案更糟糕,因为它的 O(n^2) 在字典中搜索键是 O(1) 所以第一个解决方案是 O(n)

【讨论】:

    【解决方案2】:

    解决方案 1:O(|a| + |b|)
    方案二:O(|a| * |b|)

    并且解决方案 1 应该使用集合,而不是字典。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2020-03-05
      相关资源
      最近更新 更多