【问题标题】:Complexity of the min-max algorithmmin-max 算法的复杂性
【发布时间】:2017-08-13 09:21:35
【问题描述】:

我有以下代码。它应该保持什么样的递归关系以及它的复杂性是什么。如果你能帮我找到它的复杂性,用替换方法解决递归关系,那就太好了。

存储多个返回值的节点变量

struct node
{
    int MAXX;
    int MINN;
}NODE;

从给定数组中找到最小和最大数字的递归函数

struct node partition(int a[], int first, int last)
{
    int MAX, MIN;
    int low = first;
    int high = last;
    struct node left, right;

    /*If there is a single variable */
    if (low==high)
    {
        NODE.MAXX = a[low];
        NODE.MINN = a[low];
        return(NODE);
    }
    /*If there exists only 2 elements*/
    else if (high==low+1)
    {
        if (a[high]>a[low])
        {
            NODE.MAXX = a[high];
            NODE.MINN = a[low];
        }
        else
        {
            NODE.MAXX = a[low];
            NODE.MINN = a[high];
        }
        return NODE;
    }
    /*If there exists more than 2 elements */
    int mid = (low + high) / 2;
    left=partition(a, low, mid);
    right=partition(a, mid+1, high);
    if (left.MAXX > right.MAXX)
        NODE.MAXX = left.MAXX;
    else
        NODE.MAXX = right.MAXX;
    if (left.MINN < right.MINN)
        NODE.MINN = left.MINN;
    else
        NODE.MINN = right.MINN;

    return NODE;

}

主要功能

int _tmain(int argc, _TCHAR* argv[])
{
    struct node N;
    int a[] = { 70, 50, 111, 69, 4, 7, 80, 100 }; 
    N=partition(a, 0, 7);
    cout << "Maximum = " << N.MAXX << endl;
    cout << "Minimum = " << N.MINN << endl;
}

【问题讨论】:

    标签: algorithm time-complexity


    【解决方案1】:

    partition 的每次调用都会执行固定数量的工作,外加 2 次额外的递归调用,每次调用都有 一半 的输入索引范围。因此,我们可以为时间复杂度函数构造一个递归关系

    T(n) = 2T(n/2) + C

    这扩展为几何级数C * (1 + 2 + 4 + ... ),并持续到log n 项(因为在每个递归级别,输入大小减半,因此它以几何方式减小到停止条件n = 2)。从标准公式来看,这相当于O(n)


    编辑:改进先前解释的方程式:

    【讨论】:

    • 能否请您扩展上述公式并证明它是O(n)?
    • 我认为每次都会添加 C...请检查一下...对于第 k 步应该是 Ck。
    • @Navdeep 不。每个调用确实与 C 成正比,但每次调用有 2 个递归调用,这意味着添加的 C 的数量呈指数增长,因此是几何级数。
    • 你能不能再解释一下..除了这个,我什么都理解得很清楚。谢谢。
    • @Navdeep 我不知道如何才能比我已经拥有的更清楚地解释,但让我们一步一步地尝试。在第一次调用中,您执行 C 工作,并递归调用两次。这两个调用每个都工作 C 并且每个调用两次,给 4 个额外的调用和额外的工作 2C。接下来的 4 个调用确实起作用 4C 并进行 8 个额外调用,依此类推
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 2017-09-23
    • 2019-10-05
    相关资源
    最近更新 更多