Предположим, у нас есть алгоритм, который принимает массив строк, сортирует каждую строку, а затем сортирует весь массив. Каким будет время выполнения?

Вопросы:

Предположим, у нас есть алгоритм, который принимает массив строк, сортирует каждую строку, а затем сортирует весь массив. Каким будет время выполнения?

Решение приведено ниже: Предположим, у нас есть алгоритм, который принимает массив строк, сортирует каждую строку, а затем сортирует весь массив. Каким будет время выполнения?

Что я нахожу странным в приведенном выше решении, так это: "You should also take into account that you need to compare the strings. Each string comparison takes O (s) time.There are O (a log a) comparisons, therefore this will take O (a*s log a) time."

Для чего нам нужны сравнения?

Чтобы отсортировать строку, потребуется s log s время. Скажите там a строк, следовательно, общее время будет a*s log s

Теперь проблема сузилась до простой сортировки заданного массива, которую вы можете сделать за a log a время, следовательно, общее время равно a*s log s + a log a = a (s log s + log a)

Где я ошибся в своем мыслительном процессе?

Вопрос взят из книги Интервью по кодированию

Each string comparison takes O(s) time. Это та часть, которую вы пропустили, рассуждая. Сравнение двух char занимает O(1), сравнение двух строк занимает O(length(shortest string)).
m.raynal 27.05.2019 11:25

Заявление о том, что «нельзя уменьшить его дальше», кажется, натянуто. Понятно, что тривиальное сравнение строк будет O(s) — но из этого сразу не следует, что сортировка строк в этом случае должна быть реализована именно так.

Hans Olsson 27.05.2019 18:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
1 062
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сортировка списка чисел предполагает, что сравнения происходят за O(1) постоянное время, что дает сложность nlogn с точки зрения количества сравнений. Однако, когда мы сортируем перечисляемое, члены которого требуют времени x для сравнения, время выполнения становится xnlogn. Это потому, что мы выполняем действие, которое требует x времени, nlogn раз.

Но я также должен утверждать, что строки являются прямой биекцией по основанию 26. Поскольку мы считаем, что сравнение по основанию 10 происходит за постоянное время, нет причин не распространить это на строки, которые по сути являются числами по основанию 26. Это действительно зависит от реализации механизма сравнения строк. Таким образом, в зависимости от того, как выполняется сравнение строк, мы получаем две возможные среды выполнения.

Вы правы, если и только если мы предполагаем, что строки сравниваются как числа в базе 26, и если это можно сделать за постоянное время.

В противном случае сортировка в целом занимает (время сравнения) x nlogn

Связано: Как мы можем предположить, что основные операции над числами занимают постоянное время? Тот же самый аргумент не применим к строкам.

Bernhard Barker 27.05.2019 10:44

Сложность сортировки обычно определяется количеством сравнений (по крайней мере, для сортировки на основе сравнений). В этом случае не нужно делать никаких предположений о сложности одного сравнения. Хотя окончательный вывод один и тот же.

Bernhard Barker 27.05.2019 10:47

Они просят время, а не количество сравнений. Хотя время произвольно, они, кажется, хотят что-то с точки зрения длин отдельных строк. Кроме того, я действительно не понял связанную ссылку, но я не вижу причин для того, чтобы это предположение не применялось к строкам, учитывая реализацию строк в виде массивов символов, которые по сути являются целочисленными массивами, как указано в вопросе

Confused Soul 27.05.2019 11:58

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

Bernhard Barker 27.05.2019 13:23

Понимаю. Предполагая, что строка является числом без верхних границ, тогда мы можем считать ее время сравнения равным (длина/параллельные процессы)?

Confused Soul 27.05.2019 13:25

Обычно сравнение не делается параллельно (насколько мне известно), так что это просто O(length). Вы также можете выполнять сравнение параллельно, если это необходимо, но вам понадобится алгоритм, чтобы узнать время выполнения — вам может потребоваться дополнительное время для сбора результатов от отдельных процессов — это можно сделать в O(log(parallel processes)), объединив 2 процесса за раз , что приведет к времени выполнения O(length/parallel processes + log(parallel processes)).

Bernhard Barker 27.05.2019 13:34

Хорошо, не стесняйтесь редактировать мой ответ, чтобы обновить его соответствующей информацией! Или опубликуйте этот обмен как самостоятельный ответ

Confused Soul 27.05.2019 13:41

Другие вопросы по теме