【问题标题】:How to find number of comparisons and complexity of a given algorithm如何找到给定算法的比较次数和复杂度
【发布时间】:2021-07-20 00:34:56
【问题描述】:

我正在尝试确定比较的总数(不计算循环的停止条件)以及复杂性如何随 N 增长。

1. 
for (int ind = 0; ind < N; ind++)
{
    if (arr[ind] < 0)
        arr[ind] = arr[ind] * 2;
}
2. 
bool there_are_duplicates = false;
for (int ind1 = 0; ind1 < N; ind1++)
{
    for (int ind2 = 0; ind2 < N; ind2++)
        if (ind1 != ind2 && arr[ind1] == arr[ind2])
            there_are_duplicates = true;
}
3. 
for (int ind = 0; ind < N; ind++)
{
    int sum = 0;
    int nb = 0;
    for (int n = 0; n < 4; n++)
    {
        if (ind >= n)
        {
            sum = sum + arr[ind - n];
            nb++;
        }
    }
    arr[ind] = sum / nb;
}

对于第一个,复杂度为 N,比较次数也为 N 或刚好等于一

对于第二个,复杂度为 N^2,比较次数为 2(N^2) 还是刚好等于 2?

对于第二个,复杂度为 N,比较次数也为 4N 还是刚好等于 1 或 4?

【问题讨论】:

    标签: arrays c algorithm time-complexity


    【解决方案1】:

    让我们数一数:

    1. 你比较数组的每个项,所以你有N比较和O(N)复杂度

    2. 您有嵌套循环,您将每个项(其中N)与除它们自己之外的所有其他项(即与N - 1 项)进行比较。您有N * (N - 1) 比较和O(N^2) 复杂性

    3. 在这里,您处理每个4 次。所以,你有4 * N 比较和O(N) 复杂度

    【讨论】:

    • 谢谢,这个呢:for (int ind = 0; ind 20 && arr[ind] % 2 == 0) arr[ind] = arr[ind] + arr[ind / 2]; }
    • @Jordan:再次测试每个项目:N 比较,O(N) 复杂性
    • 对不起,我们不认为在if语句中我们有3次比较,被调用N次,所以比较次数是3N?
    • @Jordan:我们只有一个if一个条件(当然它可能很复杂);如果您想计算术语arr[ind] &lt; 0arr[ind] &gt; 20 等。在最坏的情况下您将拥有3 * N,在最好的情况下将拥有N
    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 2022-01-13
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多