此功能的Big O符号是什么?

时间:2018-10-18 04:28:03

标签: python python-3.x algorithm optimization big-o

def scramble(s1, s2):
    arrs1 = list(s1)
    arrs2 = list(s2)

    if all(True if arrs2.count(item) <= arrs1.count(item) else False for 
item in arrs2):
        return True
    else:
        return False

我正在尝试创建一个函数,该函数可以测试是否可以重新排列一部分字符串字符(str1)以匹配另一个字符串(str2)。

这不是O(n)吗?

3 个答案:

答案 0 :(得分:3)

发布的代码实际上是O(n^2)

all(True if arrs2.count(item) <= arrs1.count(item) else False for item in arrs2)

all需要对输入进行一次传递,从而产生O(n)的时间复杂度。但是,每次通过时,itemarrs2中发生的次数必须为arrs1count的复杂度为O(n),因为还必须遍历列表对象以查找每次出现的期望值。 count方法被调用了两次,但是它的平均时间复杂度接近O(n)。因此,完整的表达式为O(n)*O(n) => O(n^2)

答案 1 :(得分:2)

要扩展Ajax的答案,不带all语句的代码应如下所示:

def scramble(s1, s2):
  arrs1 = list(s1)
  arrs2 = list(s2)

  are_counts_lte = []
  for item in arrs2:
    # this next "count" statement makes it O(n^2)
    if arrs2.count(item) <= arrs1.count(item):
      are_counts_lte.append(True)
    else:
      are_counts_lte.append(False)

  for b in are_counts_lte:
    if b is False: return False
  return True

这显然是 O(n ^ 2)

答案 2 :(得分:1)

如果您想要平均时间复杂度为O(n)的解决方案,则可以改用master

... new { htmlAttributes = new { @class = "form-control text-center lt-spinner number-quantity", @min ="0", @max = "4", ...