【问题标题】:My Approach is Brute-Force or Linear Search?我的方法是蛮力搜索还是线性搜索?
【发布时间】:2021-06-07 00:07:21
【问题描述】:

我的问题如下:

给定一个整数值序列,确定序列中是否有一对不同的数字,其乘积为奇数。请提供两个 Python 函数,oddpair_bf() 和oddpair_linear() 来解决这个问题。该函数将给定的整数序列作为列表。 oddpair_bf() 函数使用蛮力方法并依次检查可能的对。当存在乘积为奇数的pair时,返回True;否则,它报告 False。第二个,oddpair_linear(),使用线性扫描方法,将访问每个元素一次。请有办法通过线性扫描来确定这一点。

我尝试自己解决它并得到:

def oddpair_bf(list):
    for i in list:
        for j in list:
            if i != j:
                product = i*j
                if product & 1:
                    return True
    return False

现在我的问题是,这是一种蛮力方法还是“线性扫描”方法?我需要如何以不同的方式处理它?

【问题讨论】:

  • 这是蛮力,您可以通过更改第二个迭代器来删除半大小写(对称)。

标签: python python-3.x list brute-force linear-search


【解决方案1】:

你的方法是蛮力的,因为它探索了所有可能的组合

很好地使用了& 运算符而不是经典的(x % 2) == 1

蛮力

我建议对您的代码进行两项改进:

  • 不要使用list作为变量名,因为它是列表的保留语言关键字。
  • 将测试减半,因为乘法是可交换的(对称的)。

它导致:

def oddpair_bf(seq):
    n = len(seq)
    for i in range(n):
        for j in range(i+1, n):
            if seq[i]*seq[j] & 1:
                return True
    return False

可以使用itertools进行压缩:

def oddpair_bf2(seq):
    for x, y in itertools.combinations(seq, 2):
        if x*y & 1:
            return True
    return False

这个新版本仍在O(n^2) 中,以防万一。但是您可以通过从n^2(正方形,两个大小为n 的嵌套循环)中删除n + n*(n-1)/2(对角线和下三角形)案例来避免不必要的比较,这仅仅是因为乘法是可交换的:我们不需要另外检查y*x x*y.

线性

在蛮力版本之前降低复杂性通常是通过突出系统的固有属性来完成的,该属性使计算更容易、更少密集并因此更易于处理。

对于线性版本,使用问题的一个众所周知的性质:任何偶数的乘积将始终是偶数,因为它至少有一个来自偶数的 2 因子。

因此,解决这个问题相当于检查列表中是否至少有两个奇数。这可以写成:

def oddpair_linear(seq):
    n = 0
    for x in seq:
        if x & 1:
            n += 1
        if n >= 2:
            return True
    return False

这个sn-p在最坏的情况下是O(n)(一个大小为n的循环)。 @pakpe 将这张支票很好地浓缩成一条线。

【讨论】:

    【解决方案2】:

    这是一个简洁的线性函数,它检查序列中是否有多个奇数(这将给出至少一个奇数乘积)并返回 True。

    def oddpair_linear(seq):
        return len([x for x in seq if x & 1]) > 1
    

    【讨论】:

      【解决方案3】:

      既然你说不同,你可以使用集合:

      def oddpair_linear(seq):
          return len({s for s in seq if s&1})>1
      

      或者更好的方法

      def oddpair_linear(seq):
          found=0
          for s in seq:
              if s&1:
                  if not found:
                      found=s
                  else:
                      return True
          return False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-08
        • 2014-11-05
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        • 2012-05-24
        相关资源
        最近更新 更多