Esto me recuerda a un prefijo mutado tree/trie que hice una vez. Ligeramente diferente, pero podría funcionar. Puede no funcionar si tiene límites grandes/sin límites o si no puede convertirlo a su idioma (código I en C++).
Así que, básicamente, en un trie usualmente almacena niños correspondientes a la siguiente letra, pero lo que hice fue almacenar niños correspondientes a la frecuencia de cada letra.
En esencia, la pregunta (desde mi punto de vista) es: "¿Hay juegos que tengan la misma o más letras que en el subconjunto?"Por ejemplo, si el subconjunto es {A, D, E, E}, entonces necesita encontrar si hay un conjunto con al menos una A, una D y dos E.
Entonces, para el trie que tiene algo como esto
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"
Básicamente toda la ... 's representan un montón de cosas que sería largo para mostrar la /, |. y \ representar relación padre-hijo y MAX representa la frecuencia máxima de una carta
Así que lo que haces, es que tiene una estructura (I código en C++) de algún tipo como:
struct NODE {
NODE *child[MAX + 1]; // Pointers to other NODE's that represents
// the frequency of the next letter
};
Cuando crea un nodo, debe inicializar todos sus elementos secundarios a NULL. Usted puede hacer ya sea esto a través de un constructor (en C++) o una función makeNode() como
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
};
Al comienzo, el trie es sólo una raíz
NODE* root = new NODE;
Cuando se agrega un conjunto de la trie, obtienes la frecuencia de cada letra y pasas por el trie. Si en un nodo particular, el niño que corresponde a la siguiente letra es NULO, simplemente crea un nuevo NODO.
Cuando busca en el trie, busca todos los elementos secundarios de cada nodo que corresponda a la frecuencia de la letra en el subconjunto o superior. Por ejemplo, si el subconjunto tiene 3 A, busca todas las opciones root-> child [3] luego root-> child [4] luego ... luego root-> child [MAX].
Es probable que sea demasiado complicado y confuso por lo que 1) Si usted piensa que no estoy loca, por favor, comentar sobre lo que es confuso y 2) Es posible/probable que desee simplemente encontrar un método más simple
suena como usted necesita estar buscando el software anagrama para ejemplos. – Orbling
Es curioso que lo menciones; esto es para una especie de anagramas; sin embargo, necesito encontrar "casi-anagramas" o anagramas parciales. es decir, necesito encontrar anagramas reorganizando y agregando letras de un conjunto determinado. – PBJ