我在下面有一个脚本,该脚本可以找到整数数组中的最小和最大值。目标是在少于 1.5 x N 个比较中完成此任务,其中 N 是输入数组的长度 n_list 。我想问几个问题。
1 :(在 for 循环内)正在将变量最小或最大与 n 进行比较数组比较?在下面的脚本中,我将其视为一个。如果是这样,为什么会这样呢?我能够找到的定义是,数组比较是在两个数组之间进行的,IMO并不是我真正在做的。
2:如果我没有正确计数,那我在做什么错了?
3:什么是解决此问题的更好方法?
非常感谢,希望您白天/晚上过得愉快:)
def findExtremes(n_list):
smallest = n_list[0]
largest = n_list[0]
counter = 2 # See above
for n in n_list:
if n > largest:
largest = n
counter += 1
continue
elif n < smallest:
smallest = n
counter += 1
continue
else:
counter += 1
continue
return(counter)
答案 0 :(得分:1)
您只计算成功的比较。
当第一个if
成功执行时,您已经进行了一次比较,并且正确执行了counter += 1
。
但是如果您进入elif
,则完成了两个比较:n > largest
和n < largest
,因此您需要进行{{1} }。
如果比较失败,您仍然已经进行了两次比较,因此您还需要在counter += 2
块中进行counter += 2
。
您无需在开始时初始化else
,应将其设置为counter = 2
。您将使用循环中列表的第一个元素来计算两次比较。
实际上,您可能只想跳过这些元素,因为结果是已知的。您可以这样做:
0
跳过它们。如果您应该计算这些不必要的比较,那么初始化for n in n_list[1:]:
是有意义的。
您关于“数组比较”的问题似乎根本不相关。在此问题中,与比较数组无关,您只是在将数组元素与同一数组的其他元素进行比较。
您的算法执行N + 1到2 * N个比较。最好的情况是将数组从最小到最大排序-对每个元素更新counter = 2
的测试成功完成,因此不必更新largest
。最坏的情况是当其以相反的顺序排序或所有数字都相同时:所有smallest
测试均失败,因此它必须测试每个元素以查看其是否为新的largest
。平均而言,随机数据趋向于接近最坏的情况,约为1.95 * N。