Re[32]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 03:26
Оценка: :)
Здравствуйте, ylp, Вы писали:

ylp>Понятно, если вы предполчитаете не отвечать на прямо поставленые вопросы о том, что у вас за p в формуле оценки числа сравнений


Я ответил. За риталином, бегом — марш!
Гудбай.
Re[3]: Кстати, про Гугель
От: white_znake  
Дата: 07.11.18 08:32
Оценка: :)
Здравствуйте, CoderMonkey, Вы писали:

CM>Здравствуйте, white_znake, Вы писали:


_>>Ну как бы Radix Sort работает только для целых положительных чисел.


CM>Тут есть такой нюанс — на компьютере, абсолютно любые данные представляют собой набор байтов. То есть — положительных целых чисел. Странно, что так много программистов этого не понимают.


Да но, тут ньюанс в том, что строки бывают переменной длинны, алгоритм поразрядной сортировки дает сложность: O(k * n), где к — кол-во разрядов в сортируемых элементах, т.к. все сортируемые элементы должны иметь одинаковое кол-во разрядов, то получается, что к — константа, поэтому сложность O(n).

Если же применить алгоритм поразрядной сортировки к строкам переменной длинны, то получается, что перед самой сортировкой, строки надо будет выровнять, но само выравнивание сложнее чем O(n) ("решение в лоб" — O(n*n)). Поэтому алгоритм поразрядной сортировки для строк переменной длинны будет иметь сложность > O(n).

В тоже время quick sort отсортирует и строки переменной длинны и числа — за то же самое O(n * log n).
Re[7]: Кстати, про Гугель
От: B0FEE664  
Дата: 07.11.18 08:55
Оценка:
Здравствуйте, CoderMonkey, Вы писали:

CM>Легко. И, кстати, реально написал в одном из старых проектов.

CM>Сумеешь сообразить сам или надо разжевать?

надо.
И каждый день — без права на ошибку...
Re[11]: Кстати, про Гугель
От: Zhendos  
Дата: 07.11.18 10:34
Оценка:
Здравствуйте, CoderMonkey, Вы писали:

CM>Здравствуйте, Zhendos, Вы писали:


> И вместо C1 * O(N) ты получишь C2 * O(N), где C2 < C1

Z>>Поэтому операция умножения O(N) на константу очень странно выглядит.

CM>Нет, не выглядит. Читать учебники.


Учебники это комиксы про программистов или может быть твитер какого-то XYZ?

Согласно D.E. Knuth http://www.phil.uu.nl/datastructuren/09-10/knuth_big_omicron.pdf
"O(f(n)) denotes the set of all..."

Поэтому

> И вместо C1 * O(N) ты получишь C2 * O(N)


можно прочитать как

"И вместо O(N) ты получишь O(N)",
что для меня звучит бредово
Re[8]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 15:23
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>надо.


Если i >= str.Length для данной строки, возвращаем специально зарезервированный номер бакета
Re[4]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 15:23
Оценка:
Здравствуйте, white_znake, Вы писали:

_>т.к. все сортируемые элементы должны иметь одинаковое кол-во разрядов


Нет, не должны.

_>Если же применить алгоритм поразрядной сортировки к строкам переменной длинны, то получается, что перед самой сортировкой, строки надо будет выровнять


Нет, не нужно.

_>В тоже время quick sort отсортирует и строки переменной длинны и числа — за то же самое O(n * log n).


А ты думаешь, что сравнение строк большой длины в квиксорте магическим образом будет таким же быстрым, как и коротких?
Re[12]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 15:26
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Учебники это комиксы про программистов или может быть твитер какого-то XYZ?


Учебники — это любые учебники. Только надо не только читать, а еще и понимать смысл.

Z>"И вместо O(N) ты получишь O(N)",

Z>что для меня звучит бредово

Это очень плохо, что для тебя это так звучит. Как бы намекает на уровень понимания. Потому что алгоритмы с формально одинаковым O(N) запросто могут различаться на порядки по реальной производительности.
Просвещайся: http://pages.cs.wisc.edu/~vernon/cs367/notes/3.COMPLEXITY.html#constants
Отредактировано 07.11.2018 15:31 CodeMonkey . Предыдущая версия .
Re[9]: Кстати, про Гугель
От: B0FEE664  
Дата: 07.11.18 15:55
Оценка: 15 (1)
Здравствуйте, CoderMonkey, Вы писали:

BFE>>надо.

CM>Если i >= str.Length для данной строки, возвращаем специально зарезервированный номер бакета

Если у нас в массиве три строки, длинной 2, 200 и 201, то количество сравнений будет 200? Так?
И каждый день — без права на ошибку...
Re[10]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 16:05
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Если у нас в массиве три строки, длинной 2, 200 и 201, то количество сравнений будет 200? Так?


Зачем?
Re[11]: Кстати, про Гугель
От: B0FEE664  
Дата: 07.11.18 16:20
Оценка:
Здравствуйте, CoderMonkey, Вы писали:

BFE>>Если у нас в массиве три строки, длинной 2, 200 и 201, то количество сравнений будет 200? Так?

CM>Зачем?

А как? А зачем тогда специальная корзина?
И каждый день — без права на ошибку...
Re[12]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 16:35
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>А как? А зачем тогда специальная корзина?


Что-то я вообще не понимаю, что ты хочешь сказать.
Re[13]: Кстати, про Гугель
От: B0FEE664  
Дата: 07.11.18 16:44
Оценка:
Здравствуйте, CoderMonkey, Вы писали:

BFE>>А как? А зачем тогда специальная корзина?

CM>Что-то я вообще не понимаю, что ты хочешь сказать.

Какой смысл вот этого:
CM>Если i >= str.Length для данной строки, возвращаем специально зарезервированный номер бакета
Что это значит?
И каждый день — без права на ошибку...
Re[14]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 16:49
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Что это значит?


Простой способ "что делать, если строка короче остальных".
Уточняющий вопрос — ты уверен, что вообще понимаешь, как работает алгоритм?
Re[15]: Кстати, про Гугель
От: B0FEE664  
Дата: 07.11.18 16:55
Оценка:
Здравствуйте, CoderMonkey, Вы писали:

BFE>>Что это значит?


CM>Простой способ "что делать, если строка короче остальных".

CM>Уточняющий вопрос — ты уверен, что вообще понимаешь, как работает алгоритм?
Нет, я не понимаю, как работает алгоритм.

Я правильно понимаю, что если строка короче какой-то другой строки, то мы используем специальный бакет. Бакет — это корзина. Так?
И каждый день — без права на ошибку...
Re[16]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 17:10
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Нет, я не понимаю, как работает алгоритм.

BFE>Я правильно понимаю, что если строка короче какой-то другой строки, то мы используем специальный бакет. Бакет — это корзина. Так?

У нас есть набор строк разной длины в случайном порядке.
1. Сначала смотрим по первому символу и раскидываем строки по корзинам, в каждой корзине — все строки начинаются на один тот же символ. (это на самом деле скорее Bucket sort и этот вариант сравнительно неэффективен, но зато он самый простой для понимания).
2. Если в корзине <=1 символа, то делать с ней больше ничего не нужно.
3. Если >1, то проделываем со строками в корзине рекурсивно ту же операцию, но уже по второму символу в строке, и распределяем их по под-корзинам. И так далее.
Как нетрудно сообразить, операция распределения по под-корзинам продожается, только пока в текущей корзине есть строки с одинаковыми префиксами. Как только у строк разные символы в текущей позиции — всё, стоп, дальше делать ничего не нужно.

И собственно ответ на твой вопрос "зачем специальный бакет".
abc
abdef
abcxy

В этом случае, когда мы доходим до символа с i=3, нужен специальный бакет для строки abc, поскольку никакого символа в этой позиции там уже нет.
Re[17]: Кстати, про Гугель
От: B0FEE664  
Дата: 07.11.18 18:22
Оценка:
Здравствуйте, CoderMonkey, Вы писали:

CM>У нас есть набор строк разной длины в случайном порядке.

CM>1. Сначала смотрим по первому символу и раскидываем строки по корзинам, в каждой корзине — все строки начинаются на один тот же символ. (это на самом деле скорее Bucket sort и этот вариант сравнительно неэффективен, но зато он самый простой для понимания).
CM>2. Если в корзине <=1 символа, то делать с ней больше ничего не нужно.
CM>3. Если >1, то проделываем со строками в корзине рекурсивно ту же операцию, но уже по второму символу в строке, и распределяем их по под-корзинам. И так далее.
CM>Как нетрудно сообразить, операция распределения по под-корзинам продожается, только пока в текущей корзине есть строки с одинаковыми префиксами. Как только у строк разные символы в текущей позиции — всё, стоп, дальше делать ничего не нужно.

Это блочная сортировка, а не Radix Sort.
И каждый день — без права на ошибку...
Re[18]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 19:50
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Это блочная сортировка, а не Radix Sort.


Разница между ними — чисто косметическая. В случае с MSD radix, практически вся разница — что нужно не раскладывать по корзинам, а считать элементы в них, и раскладывать уже потом
Хотя, есть много разных вариантов.
Re[19]: Кстати, про Гугель
От: B0FEE664  
Дата: 07.11.18 21:03
Оценка: -1 :)
Здравствуйте, CoderMonkey, Вы писали:

BFE>>Это блочная сортировка, а не Radix Sort.

CM>Разница между ними — чисто косметическая. В случае с MSD radix, практически вся разница — что нужно не раскладывать по корзинам, а считать элементы в них, и раскладывать уже потом
Нет, насколько я понимаю. Для Radix Sort надо начинать с последнего символа строки, а не с первого.

CM>Хотя, есть много разных вариантов.

И все они называются по разному.
И каждый день — без права на ошибку...
Re[20]: Кстати, про Гугель
От: CoderMonkey  
Дата: 07.11.18 21:09
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Нет, насколько я понимаю. Для Radix Sort надо начинать с последнего символа строки, а не с первого.



То есть про разницу между LSD и MSD вариантами ты никогда не слышал.
Re[14]: Кстати, про Гугель
От: lintik  
Дата: 07.11.18 21:25
Оценка: +4 :)
Ну что, кто-то все еще считает, что спрашивать стандартные вопросы про сортировки это бесполезная трата времени.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.