Попытка понять пространственную сложность этого алгоритма

Я вижу много статей в Интернете, объясняющих временную сложность, но не нашел ничего хорошего, что хорошо объясняет пространственную сложность. Я пытался решить следующий вопрос интервью

У вас есть два числа, представленные связанным списком, где каждый узел содержит одну цифру. Цифры хранятся в обратном порядке, так что цифра Ts находится во главе списка. Напишите функцию, которая складывает два числа и возвращает сумму в виде связанного списка.

ПРИМЕР

Ввод: (7 -> 1 -> 6) + (5 -> 9 -> 2). То есть 617 + 295.

Вывод: 2 -> 1 -> 9. То есть 912.

Мое решение для этого следующее:

private Node addLists(Node head1, Node head2) {
    Node summationHead = null;
    Node summationIterator = null;
    int num1 = extractNumber(head1);
    int num2 = extractNumber(head2);
    int sum = num1 + num2;

    StringBuilder strValue = new StringBuilder();
    strValue.append(sum);
    String value = strValue.reverse().toString();
    char[] valueArray = value.toCharArray();
    for (char charValue : valueArray) {
        Node node = createNode(Character.getNumericValue(charValue));
        if (summationHead == null) {
            summationHead = node;
            summationIterator = summationHead;
        } else {
            summationIterator.next = node;
            summationIterator = node;
        }
    }
    return summationHead;
}

private Node createNode(int value) {
    Node node = new Node(value);
    node.element = value;
    node.next = null;
    return node;
}

private int extractNumber(Node head) {
    Node iterator = head;
    StringBuilder strNum = new StringBuilder();

    while (iterator != null) {
        int value = iterator.element;
        strNum.append(value);
        iterator = iterator.next;
    }
    String reversedString = strNum.reverse().toString();
    return Integer.parseInt(reversedString);
}

Может ли кто-нибудь вывести космическую сложность для этого? Спасибо.


person prajaktaP    schedule 10.02.2016    source источник
comment
Вы сами пробовали решить эту проблему?   -  person Scott Hunter    schedule 10.02.2016
comment
Я бы решил это по-другому: используя рекурсию и с третьим параметром, указывающим алгоритму, следует ли его нести. Таким образом, вместо того, чтобы преобразовывать списки в числа, добавлять число и преобразовывать результат обратно в список, он все время будет работать только со списками и однозначными числами.   -  person tobias_k    schedule 10.02.2016
comment
Вроде не имеет отношения к вашему вопросу или к тому, чтобы сделать ваш вопрос лучше, но: я подозреваю, что вы намеревались реализовать дополнение самостоятельно...   -  person Daniel Wagner    schedule 10.02.2016
comment
Скотт Хантер: Спасибо, что спросили... но это МОЕ решение... а не то, что я нашел в Интернете.   -  person prajaktaP    schedule 11.02.2016
comment
tobias_k: Да, я знаю, как решить это с помощью рекурсии. Но я специально пытаюсь понять концепцию космической сложности для приведенного выше решения по сравнению с альтернативной реализацией. Но спасибо, что ответили на мой вопрос.   -  person prajaktaP    schedule 11.02.2016


Ответы (1)


Пространственная сложность означает, «как асимптотически изменяется объем памяти, необходимый для запуска этого алгоритма, по мере увеличения входных данных»?

Итак, у вас есть два списка длины N и M. Результирующий список будет иметь длину max(N,M), возможно, +1, если есть перенос. Но этот +1 является константой, и мы не рассматриваем его как часть большого О, поскольку большее из значений N или M будет доминировать.

Также обратите внимание, что этот алгоритм довольно прост. Нет промежуточных вычислений, требующих больше линейного пространства.

Сложность пространства равна max(N,M).

person Carlos    schedule 10.02.2016