这是在线性时间中找到数组中两个最远数字的正确算法吗?
lowest = INT_MAX
highest = 0
for i in inputarray:
if (i < lowest) lowest = i
if (i > highest) highest = i
return (lowest, highest)
我称之为线性时间,因为它只通过数组一次。
答案 0 :(得分:1)
是的,您的算法处于线性时间,但正如@Tushar在2N比较中正确指出的那样。
首先,这里是你的算法的改编,比较少,没有构建[0,n]数组。
def minmax(inputarray):
lowest = highest = inputarray[0]
for i in inputarray:
if (i < lowest):
lowest = i
elif (i > highest):
highest = i
return (lowest, highest)
然后,这是一个1.5N比较和生成器的实现,因此我们在内存上很便宜:
from itertools import islice, izip
def minmax(inputarray):
mid = len(inputarray) / 2
lowest = highest = inputarray[mid]
iseven = mid * 2 == len(inputarray)
left = islice(inputarray, 0, mid)
right = islice(inputarray, mid + (0 if iseven else 1), len(inputarray))
for x, y in izip(left, right):
l, h = (x, y) if x < y else (y, x)
if l < lowest:
lowest = l
if h > highest:
highest = h
return (lowest, highest)
结果(后一种算法):
>>> minmax([0., -1.2, -33, 25, 1.4, 0])
(-33, 25)
>>> minmax([0., -1.2, -33, 25, 1.4])
(-33, 25)
答案 1 :(得分:0)
您在算法中遵循的方法具有 2 * n个比较次数(n是数组中的数字总数),因为您在数组上进行迭代并将每个数字与最低和最高,然后相应地更新最低或最高数字。
您可以通过比较对中的数字使这个算法略微更好,然后将最大数字和最小数字与最低数字进行比较。因此,对于一个数字对,您最终会进行3次比较。因此,比较总数将 1.5 * n 。
您可以在以下位置找到更多详情: FindMinMax
答案 2 :(得分:0)
您也可以对数组进行排序,然后选择第一个和最后一个数字。这需要NlogN时间。程序员时间最便宜肯定:)