Ваш алгоритм имеет временную сложность O (mn log m), в которой преобладает время, необходимое для сортировки каждой из строк в массиве; так что ваш анализ верен. Однако ваш результат отличается от того, который вы цитировали не потому, что цитата неверна, а потому, что ваш алгоритм отличается от того, который был проанализирован в цитате. Обратите внимание, что цитата гласит:
Мы можем отсортировать массив строк так, чтобы все анаграммы собрались вместе.
Ваш алгоритм этого не делает; он вообще не сортирует массив строк, а сортирует символы в каждой строке по отдельности. Вот реализация в Python алгоритма, о котором говорится в этой цитате:
from itertools import groupby
NO_OF_CHARS = 256
def char_freqs(word):
count = [0] * NO_OF_CHARS
for c in word:
count[ord(c)] += 1
return count
def print_anagrams_together(words):
words = sorted(words, key=char_freqs)
for _, group in groupby(words, key=char_freqs):
print(*group, sep=', ')
Сложность по времени можно определить следующим образом:
char_freqs
принимает O ( m) время из-за итерации по строке длиной m. - Сортировка занимает O (mn + n log n) времени, потому что ключевая функция занимает O (m) времени и вызывается для n строк, а затем строки отсортированы за O (n log n) времени. Сравнения в сортировке выполняются в списках длиной
NO_OF_CHARS
(константа), поэтому сравнения занимают постоянное время. - Группировка слов вместе занимает время O (mn), потому что доминирует повторный вызов
char_freqs
n раз; это может быть улучшено до O (n) путем повторного использования уже вычисленных ключей из сортировки, но в любом случае в этой части преобладает сортировка.
Это дает общую сложность времени O (mn + n). log n), что не совпадает с кавычками, но вы получите O (mn log n), если ключевая функция char_freqs
вызывается для каждого сравнения , а не один раз для каждого элемента и кэшируется. Например, если вы выполнили сортировку в Java, используя что-то вроде:
// assuming that charFreqs returns something comparable
Collections.sort(words, Comparator.comparing(Solution::charFreqs));
Тогда сравнение заняло бы время O (m) вместо времени O (1), и общая сложность времени была бы O (mn log n). Таким образом, цитата не ошибочна, она просто говорит о алгоритме, отличном от того, о котором вы думали, и предполагает его неоптимальную реализацию.