Самый длинный общий префикс — анализ сложности подхода «разделяй и властвуй»

Я пытаюсь понять, как была получена сложность времени и пространства для подхода D & C к поиску самого длинного общего префикса из массива строк. Пример: массив строк ["leet", "leetcode", "leeds","le"] и вывод будет "le" Это проблема с leetcode 14

Код:

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";    
        return longestCommonPrefix(strs, 0 , strs.length - 1);
}

private String longestCommonPrefix(String[] strs, int l, int r) {
    if (l == r) {
        return strs[l];
    }
    else {
        int mid = (l + r)/2;
        String lcpLeft =   longestCommonPrefix(strs, l , mid);
        String lcpRight =  longestCommonPrefix(strs, mid + 1,r);
        return commonPrefix(lcpLeft, lcpRight);
   }
}

String commonPrefix(String left,String right) {
    int min = Math.min(left.length(), right.length());       
    for (int i = 0; i < min; i++) {
        if ( left.charAt(i) != right.charAt(i) )
            return left.substring(0, i);
    }
    return left.substring(0, min);
}

Анализ сложности, как указано на их веб-сайте. Временная сложность: O(S), где S — количество всех символов в массиве, S = mn. Временная сложность равна T(n) = 2 T(n/2) + O(m). Следовательно, временная сложность равна O(S). Пространственная сложность: O(mlog(n))

Я понял ту часть, где T(n) = 2 T(n/2) + O(m), но откуда они получили m*n как временную сложность. Я думаю, что для пространственной сложности мы рассматриваем высоту дерева рекурсии, время стоимости каждого рекурсивного вызова.

n — количество строк в массиве, а m — длина префикса.


person Jiraya    schedule 22.03.2018    source источник
comment
Что такое m и n в этом продукте?   -  person Prune    schedule 22.03.2018
comment
@Prune Спасибо за указание. Я отредактировал вопрос. n — общее количество строк в массиве, а m — длина префикса. В лучшем случае m будет minLength.   -  person Jiraya    schedule 22.03.2018
comment
Вам возможно повезет, спросив об информатике.   -  person    schedule 22.03.2018
comment
Если вы не используете распараллеливание, я не вижу абсолютно никакой выгоды от разделяй и властвуй по сравнению с вертикальным сканированием, которое легче понять и требует меньше места.   -  person maraca    schedule 22.03.2018
comment
@maraca Ты прав! Это просто для понимания парадигмы D&C и анализа ее сложности.   -  person Jiraya    schedule 23.03.2018


Ответы (1)


Сложность m*n исходит из этого термина O(m). Он реплицируется (выполняется) n раза: на каждой итерации вы делите список пополам (по количеству строк, n), копаясь до тех пор, пока ваш базовый вариант не будет выполнен один раз для каждой из n строк. Каждый из них выполняет операцию O(m).

Кроме того, каждое слияние выполняет O(m) операцию, всего 2*n-1 из них. 2*n-1 равно O(n). O(m) * O(n) равно O(mn).

Это достаточно ясно?

person Prune    schedule 22.03.2018
comment
Спасибо! Это имеет смысл, но как мы вычислили 2*n-1? - person Jiraya; 23.03.2018
comment
Обработано n строк, затем (n-1) объединяется. - person Prune; 23.03.2018