【问题标题】:How to calculate space and time complexity for this code如何计算此代码的空间和时间复杂度
【发布时间】:2021-01-20 04:57:39
【问题描述】:
public static int desc(int number) {

        // Time complexity = 2n+n2
        // space complexity = ?

        int i, j, temp;
        int array[] = new int[Integer.toString(number).length()];
        for (i = 0; i < array.length; i++)
            array[i] = Integer.toString(number).charAt(i) - '0';

        for (i = 0; i < array.length - 1; i++) {
            for (j = 0; j < array.length - i - 1; j++) {
                if (array[j] < array[j + 1]) {
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;

                }

            }
        }
        StringBuilder strNum = new StringBuilder();
        for (int k : array) {
            strNum.append(k);
        }

        int finalInt = Integer.parseInt(strNum.toString());
        System.out.println(finalInt);
        return finalInt;

    }

这是我的代码 per 我的理解我能够计算时间复杂度请建议时间复杂度是否正确,并帮助我计算这个程序的空间复杂度我有点对如何计算空间复杂度感到困惑。

【问题讨论】:

    标签: java data-structures


    【解决方案1】:

    首先让我们从以下方面优化您的代码:

    int array[] = new int[Integer.toString(number).length()];
    for (i = 0; i < array.length; i++)
        array[i] = Integer.toString(number).charAt(i) - '0';
    

    到:

    String to_number = Integer.toString(number);
    int array[] = new int[to_number.length()];
    for (i = 0; i < array.length; i++)
         array[i] = to_number.charAt(i) - '0';
    

    无需多次致电Integer.toString(number)

    作为N参数number中的位数(Integer.toString(number).length()),时间复杂度可以计算为如下:

    String to_number = Integer.toString(number);
    

    时间复杂度为N,对于:

    for (i = 0; i < array.length; i++)
         array[i] = to_number.charAt(i) - '0';
    

    后续双循环:

     for (i = 0; i < array.length - 1; i++) {
         for (j = 0; j < array.length - i - 1; j++) {
             if (array[j] < array[j + 1]) {
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
             }
         }
     }
    

    是一个well-know for beingN(N-1)/2,可以简化为O(N^2)的时间复杂度。下一个循环

    for (int k : array) {
         strNum.append(k);
    }
    

    时间复杂度为N。最后,

    int finalInt = Integer.parseInt(strNum.toString());
    

    也是N。所以时间复杂度为N + N + N^2 + N + N,简化为O(N^2)时间复杂度,也称为二次时间复杂度。

    现在让我们看看空间复杂度

    int array[] = new int[Integer.toString(number).length()];
    

    在这种情况下N,并且

     for (int k : array) {
         strNum.append(k);
      }
    

    还有N,所以空间复杂度是2N,简化为O(N)

    【讨论】:

    • 等等,我很困惑。数组的大小不是number,而是位数。所以你所做的一切都是 100% 正确的。抱歉,别管我。
    • @KonradRudolph 没问题,感谢您花时间解释反对意见。
    猜你喜欢
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2019-09-27
    • 2021-06-23
    相关资源
    最近更新 更多