使用分而治之的范式提高算法效率

时间:2017-09-13 21:35:27

标签: algorithm search time-complexity divide-and-conquer

我想在数组中找到最小和最大整数。我相对低效的方法是考虑max \ min的第一个整数。然后我将其与其他整数进行比较,如果将更大/更小的整数与当前最小或最大整数进行比较,则将其替换。这发生在阵列结束之前。根据我的计算,复杂性(基于最坏的情况)是n -1(n是数组的大小)。我的问题是我如何利用鸿沟并征服范式来提高效率?我试过把数组分成两部分,然后对两个部分做同样的算法,虽然这只会降低效率?根据我的计算,复杂性变为n + 1.

2 个答案:

答案 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个元素,算法必须从比较中获取足够的信息才能找到最大值。

Python中的示例代码

# 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