«Завершить» набор алгоритмически эффективно - PullRequest
0 голосов
/ 17 декабря 2018

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

Я выучил слово supervocalic (прилагательное, описывающее слово или фразу, содержащую каждый из пяти гласных - A, E, I, O и U - ровно один раз).Примерами являются «вопросительный знак», «амбидекстовый» и, конечно, «супервокальный».

Я написал небольшую программу на Python для определения супервокальных слов .Это было достаточно просто, и суть этого:

matches = {}
for w in words:
    pat = tuple(w.count(v) for v in vowels)
    if pat in matches:
        matches[pat].add(w)
    else:
        matches[pat] = {w}

words просто из большого моего списка слов (словарь скрэббл SOWPODS, около 270 тыс. Слов. Я могу просто определить супервокальные слова)с matches[(1,1,1,1,1)] ... т. е. каковы слова с ровно одним из каждого гласного. FWIW, vowels технически конфигурируем здесь, так что мой маленький скрипт может сделать эквивалентную вещь для любого подмножества символов (и любого списка слов).

Моя проблема в том, что я хотел бы найти все супервокальные нграммы . Слова 1 грамма. Что 2 грамма, 3 грамма и т. Д., Которые также делаютсупер-вокальные фразы. Оказывается, у меня 175 слов без AEIOU, так что технически каждый элемент powerset может быть добавлен к каждой ngram, которая не включает их. Это очень много.

Но игнорируя эти 2^ 175 дополнительных вариаций каждой «заполненной» супервокальной фразы, как мне объединить счетные числа. Есть много эквивалентных слов с точки зрения количества гласных, так что конечноКомбинации at, например:

pat: (1, 0, 1, 0, 0); numwords: 5499
pat: (0, 1, 0, 1, 1); numwords: 2703

Таким образом, любой из первой перечисленной группы и любой другой из второй перечисленной группы имеют право.Это 14,863,797 2 грамма прямо там.На самом деле, вдвое больше, так как любой порядок в порядке.

Давайте также предположим, что я выбросил каждый паттерн с любым элементом больше, чем одним, что было бы словами, которые нельзя включить ни в одну супервокальную фразу, потому что они слишком«богатые гласными» все сами по себе.

Я вижу по глазному яблоку, что (1, 0, 1, 0, 0) и (0, 1, 0, 1, 1) являются дополнительными паттернами, которые вместе будут «заполнять» пространство гласных (или любое пространство элементов в общей версии).проблемы).Для произвольных кортежей любой длины, как мне найти все коллекции кортежей N-размера, которые будут объединяться как «заполненные кортежи» (но не как переполненные)?

По сути, несмотря на предварительный вывод, этоМоя задача найти эти дополнительные коллекции кортежей N-размера ... наиболее эффективным способом, возможным для произвольной длины кортежа, а не только для длины 5. Несмотря на то, что я предпочитаю Python и мой короткий фрагмент кода, этот вопрос должен применяться к довольномного любого языка программирования.

...