Первая часть вашего алгоритма - подсчет символов - это просто генерация ключей для сортировки.
Если вы знаете, что используете только алфавитные символы [A-Za-z] *, тогда вы можете оптимизировать свой алгоритм, уменьшив количество используемых ведер, но это лишь незначительная настройка.
Вторая часть - это просто стабильный вид - есть много способов сделать это - wikipedia page on sorting дает хорошее резюме.Если вас интересует только тот персонаж, который имеет наименьшее значение, то метод («Phase 2»), который вы описываете, вероятно, настолько эффективен, насколько вы можете получить.
Единственный способ, с помощью которого я могу улучшить это, - это то, что вы можете разделить свои буквы на фиксированное количество ведер (например, 16) равномерно по диапазону символов, а затем рекурсировать на каждом ковше. Любые ведра без символов могут быть выброшены, что сократит время на этапе сканирования/сортировки. Аналогично, если у ковша есть один символ, это делается. Вы также хотите убедиться, что вы разделите ведро на 16 больше, когда знаете, что в нем больше одного персонажа.
Используя тест слово в качестве примера (при условии, 4 ведра и только строчные символы:
- генерируют 4 ведра (AG, HM, NT, UZ)
- разделить тест слово:
- рекурсию к другим ковшей - (AG имеет один символ - это должно быть по меньшей мере таким образом мы можем остановить
- Если бы это было не так (Что касается слова «семенников»), мы можем увидеть HM и UZ пусты, поэтому нам нужно было бы только проверить NT (который будет содержать tsts).
- Мы создаем 4 ведра (N-O, P-Q, R-S и T).
- Разделить буквы
- т.д.
Преимущество этого метода заключается в том, что мы не должны были проверять каждую букву. Если диапазон символов имеет тот же размер, то оба этих метода в лучшем случае O (n), где n - длина строки (это неизбежно, так как мы всегда должны смотреть на каждый символ), хотя и строит списки символов в мой пример может сделать алгоритм столь же плохим, как O (n^2). Однако по мере увеличения диапазона символов, особенно для коротких строк, использование вспомогательных ведер значительно увеличит производительность. Для строки в Юникоде вы можете использовать гибридный подход - например, разделение всех символов не-ascii на первом этапе и использование вашего более простого метода для части ascii.
Вы пытаетесь найти, сколько раз каждый символ встречается в строке? Или получить полный список символов (a-zA-Z) и сколько раз каждый из них встречается в строке? Или что-то еще? – 2008-10-10 08:45:21
подсчитывают общее количество событий каждого символа в некотором тексте. поэтому «текст» будет t = 2, e = 1, x = 1. – 2008-10-10 08:47:36
ted, вы должны отредактировать это существенное разъяснение в своем вопросе, нажав «edit» выше – 2008-10-10 08:49:34