如何解决我的方法是蛮力搜索还是线性搜索?
我的问题如下:
给定一个整数值序列,确定序列中是否有一对不同的数字的乘积为奇数。请为此问题提供两个 Python 函数,oddpair_bf() 和oddpair_linear()。该函数将给定的整数序列作为列表。 oddpair_bf() 函数使用蛮力方法并连续检查可能的对。当有对的乘积为奇数时,返回 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
现在我的问题是,这是一种蛮力方法还是“线性扫描”方法?我需要如何以不同的方式处理它?
解决方法
你的方法是蛮力,因为它探索了所有可能的组合。
很好地使用了 &
运算符而不是经典的 (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 + n*(n-1)/2
(正方形,两个大小为 n^2
的嵌套循环)中删除 n
(对角线和下三角形)情况来避免不必要的比较,因为乘法是可交换的:我们不需要选中 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
在最坏的情况下(大小为 O(n)
的单个循环),此代码段是 n
。这张支票已被@pakpe 很好地压缩成一行。
这是一个简洁的线性函数,用于检查序列中是否存在多个奇数(这将给出至少一个奇数乘积)并返回 True。
Index key1 | key2 | key3 | value1 | value2
0 1 | 3 | 4 | 6 | 7
2 1 | 2 | 3 | 8 | 11
,
既然你说distinct,你可以用一个集合:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。