Ответ 1
Это напоминает мне мутированный префикс tree/trie, который я сделал один раз. Немного отличается, но это может сработать. Он может не работать, если у вас большие/нет ограничений или если вы не можете преобразовать его на свой язык (код на С++).
Итак, в принципе, вы обычно храните детей, соответствующих следующей букве, но я сделал, что я хранил детей, соответствующих частоте каждой буквы.
В основном вопрос (с моей точки зрения) заключается в следующем: "Существуют ли какие-либо множества, которые имеют одну или более букв, чем в подмножестве?" Например, если подмножество {A, D, E, E}, то вам нужно найти, есть ли набор с хотя бы одним A, одним D и двумя E.
Итак, для trie у вас есть что-то вроде этого
Root
/ | \
/ /|\ \
/ / | \ \
1 2 ... MAX <-- This represents the frequency of "A"
/|\ ..... /|\
1..MAX 1..MAX <-- Frequency of "B"
...............
...............
...............
1 ... ... ... MAX <-- Frequency of "Y"
/|\ .... .... / | \
1..MAX ...... 1 .. MAX <-- Frequency of "Z"
В основном все... представляют множество вещей, которые слишком долго будут отображаться. /, | и\представляют дочерние отношения родителей, а MAX представляют максимальную частоту буквы
Итак, что вы делаете, есть у вас структура (код я в С++) вроде:
struct NODE {
NODE *child[MAX + 1]; // Pointers to other NODE that represents
// the frequency of the next letter
};
При создании node вам нужно инициализировать все его дочерние элементы до NULL. Вы можете сделать это через конструктор (в С++) или функцию makeNode(), например
NODE* makeNode() {
NODE* n = new NODE; // Create a NODE
for(int i = 0;i <= MAX;i++) // For each child
n->child[i] = NULL; // Initialize to NULL
};
В начале, trie - это просто корень
NODE* root = new NODE;
Когда вы добавляете набор в trie, вы получаете частоту каждой буквы и проходите через trie. Если в определенном node дочерний элемент, соответствующий следующей букве, равен NULL, вы просто создаете новый NODE.
Когда вы выполняете поиск в trie, вы выполняете поиск всех дочерних элементов каждого node, который соответствует частоте буквы в подмножестве или больше. Например, если подмножество имеет 3 A, вы выполняете поиск по всему корню- > дочернему [3], затем root- > child [4], затем... затем root- > child [MAX].
Это, вероятно, слишком сложно и запутанно, так что 1) Если вы думаете, что я не сумасшедший, пожалуйста, прокомментируйте, что сбивает с толку, и 2) Вы можете/возможно хотите просто найти более простой метод