我想在数组中找到最小和最大整数。我相对低效的方法是考虑max \ min的第一个整数。然后我将其与其他整数进行比较,如果将更大/更小的整数与当前最小或最大整数进行比较,则将其替换。这发生在阵列结束之前。根据我的计算,复杂性(基于最坏的情况)是n -1(n是数组的大小)。我的问题是我如何利用鸿沟并征服范式来提高效率?我试过把数组分成两部分,然后对两个部分做同样的算法,虽然这只会降低效率?根据我的计算,复杂性变为n + 1.
答案 0 :(得分:0)
我会考虑您使用的是一个帖子
如果数组未排序,则复杂性始终为O(n)
。但是,在我看来,你应该检查你是否只需要最大数量?或者第二个最大值,以及第三个最大值......
如果是这种情况,你最好构建一个最大堆(对应案例的最小堆),这需要O(nlogn)
时间,然后只需查看堆的查看。
答案 1 :(得分:0)
为了识别n
元素的最大值,算法必须从比较中获得足够的信息。假设最大值为array[i]
,您必须将array[i]
与array[0], ... array[i-1], array[i+1], ... array[n-1]
进行比较才能证明array[i]
是最大值。因此,所需的最小比较次数是n - 1
比较,以便找到最大值。为什么?因为数组中有n
个元素,算法必须从比较中获取足够的信息才能找到最大值。
# Divide-and-Conquer find max of alist
def dc_max(alist, start, end): # first call with start=0, end=len(alist)
if end - start == 1: # base case: list of 1 element
return alist[start]
mid = (start + end) // 2
x = dc_max(alist, start, mid)
y = dc_max(alist, mid, end)
if x > y:
return x
return y
# Iterative find max of alist
def it_max(alist):
current = alist[0]
for i in range(1, len(alist)):
if i > current:
current = i
return current
两种算法都进行了n - 1
次比较,并且是就地的,因此它们都具有Θ(n)时间复杂度和 O(1)空间复杂度
现在,性能取决于您的系统。见Is recursion ever faster than looping?
在我的情况下,找到2**20
个数字列表的最大值,使用递归方法 657ms ,使用迭代方法 111ms 。