радикальная сортировка на двоичных строках произвольной длины - PullRequest
3 голосов
/ 31 января 2010

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

скажи, что у меня есть {"001", "10101", "011010", "10", "111"}, как мне сделать радикальную сортировку на них? Спасибо!

Ответы [ 3 ]

2 голосов
/ 31 января 2010

Вы можете дополнить их все до одинаковой длины, но нет реальной причины запускать алгоритм сортировки, чтобы определить, что число длины 5 в двоичном формате больше, чем число длины 2. Скорее всего, вы получите лучшую производительность, сгруппировав числа по длине и выполнив сортировку по осям в каждой группе. Конечно, это зависит от того, как вы их группируете, а затем от того, как вы сортируете свои группы.

Примером того, как вы могли бы сделать это, было бы запустить все элементы один раз и выбросить их все в хеш-таблицу (длина -> числа этой длины). Это занимает линейное время, а затем, скажем, nlogn время, чтобы получить к ним доступ по порядку. Радикальная сортировка выполняется за время O (nk), где n - количество элементов, а k - их средняя длина. Если у вас большое k, тогда разница между O (nk) и O (nlogn) будет приемлемой.

2 голосов
/ 31 января 2010

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

0 голосов
/ 31 января 2010

Если создание тонны новых экземпляров строки оставляет неприятный вкус, напишите сравнение самостоятельно.

Сравните, какая длина строк будет без начальных 0 (т.е. найдите firstIndexOf("1")); длинная строка больше.
Если оба имеют одинаковую длину, продолжайте сравнивать их, посимвольно, пока не найдете два отличающихся символа - строка с «1» будет больше.

...