Если я вас правильно понял, вы ошиблись: не в узле хранится буква слова, а в ребре дерева; узлу соответствует строка, которую можно восстановить, возвращаясь вверх по дереву. На сколько я помню, такое дерево называется бором, или префиксным деревом.
Не факт — в словаре из слов русского языка узлов с одним чайлдом не так много. При этом, чтоб узлы объединять, нужно объединенные строки хранить. Т.е. видимо, это дополнительный указатель + байт-другой для длины на каждый узел.
Radix tree может память сэкономить, когда строк немного, или когда они длинные.
А у меня как минимум для первого дерева из статьи (если я всё правильно понял и не накосячил с тупой реализацией) получилось что одиночных чайлдов в районе 67% (такой код и такой словарь). Для префиксного возможно чуть похуже будет.
Понятно, что пройти путь самостоятельно интересно, но существуют уже готовые продвинутые решения.
Описанное в топике — это нечто похожее на конечный автомат. А вот, превратив его в конечный детерминированный автомат, можно получить предельно эффективное решение. Конечный детерминированный автомат используется во многих лингвистических продуктах: морфология, проверка орфографии, словари и пр. Различных реализаций детерминированного конечного автомата огромное множество на любых языках. Самое сложная часть — это «построитель» такого автомата (существует несколько алгоритмов), а та часть, которая использует уже готовый автомат, вообще состоит из 2 страниц кода, которую можно реализовать на любом языке за минимальное время.
Для примера, файл детерминированного конечного автомата, который состоит из 5 млн. русских слов (для использования проверки орфографии), занимает, как бы это было не удивительно, всего 2 МБ. Автомат можно загружать в память целиком, а можно «мэпить» в памяти. Второй случай идеально подходит для устройств с быстрым доступом к системе хранение (флеш память, например, телефоны и смартфоны) — он практически не требователен к ресурсам, а скорость для пользователя остаётся очень высокой. Это особенно актуально, когда нужно подключать несколько автоматов сразу (например, несколько языков).
Так решение фактически ничем не отличается от того, что предложил автор, только основа более продвинутая. Автомат состоит из слов, каждая буква — это переход между состояниями. Для работы с автоматом используется лишь одна базовая функция — поиск слов по шаблону со спецсимволом, например, "*". Т.е. на входе подаётся что-то типа "*п*ар***ур", а на выходе получаем все состояния автомата (слова), которые удовлетворяют этому шаблону.
Несколько лет назад тоже писал аналогичную программу, потому что надо было решать N на N, а найденные решения работали только в поле 5 на 5. Но у меня был совсем топорный и медленный алгоритм. С Вашим по скорости не сравнить! Но с поставленной задачей справлялся великолепно.
Я помню самое сложное было найти словарь именно существительных. Откуда у Вас словарь на 110 000 слов? И есть ли где-нибудь в открытом доступе специальные коллекции словарей?
Мне кажется логичным искать в AppStore по запросу «Балда»(буквально пару недель назад как раз искал решатель для айфона), но я не нахожу потому что у Вас в заголовке "… балды". Точнее нахожу Ваших конкурентов.
Может быть Вы теряете часть аудитории такой же как и я.
Алгоритм быстрого поиска слов в игре балда