Три было бы хорошим решением. Ваш набор данных будет выглядеть примерно так:
{"j":
{"a":
["jacob", "jane", ..],
{"o":
["john", "joesph", ..],
..
};
Вы должны индексировать символ за символом на столько уровней, насколько это разумно (чтобы самые внутренние массивы имели от 20 до 30 записей). Затем выполните простой поиск в массиве, хранящемся на самом внутреннем слое.
Вы можете сгенерировать это, просматривая вашу коллекцию имен, а затем проверьте, существует ли конкретная запись индекса. Если это так, пройдите вниз на один слой, проверьте, существуют ли следующие символы и т. Д., Пока не дойдете до самого глубокого уровня. Затем вставьте в массив или запустите новый массив, если его нет. Если уровень персонажа не существует во время добавления нового имени, создайте его. Тогда вы захотите кэшировать конечный результат, а не восстанавливать его при каждом запросе.