Formalmente, lascia s ( U , Q ) = { V | V ∈ U e V ⊆ Q } dove U , Q e V rappresentano tutti gli insiemi e U , più specificamente, rappresenta un insieme di insiemi. Ad esempio, U potrebbe essere un insieme di (set di) ingredienti necessari per varie ricette in un libro di cucina con Q che rappresenta l'insieme di ingredienti che ho V rappresenta una ricetta che potrei fare con quegli ingredienti. La query s ( U , Q ) corrisponde alla domanda "Che cosa posso fare con questi ingredienti?"
Quello che sto cercando è una rappresentazione di dati che indicizzi U in modo tale da supportare query efficienti di s ( U , Q ) dove Q e tutti i membri di U saranno generalmente piccoli rispetto all'unione di tutti i membri di U . Inoltre, mi piacerebbe che fosse in grado di aggiornare in modo efficiente U (ad esempio, aggiungere o rimuovere una ricetta).
Non posso fare a meno di pensare che questo problema debba essere ben compreso, ma non sono stato in grado di trovare un nome o un riferimento per questo. Qualcuno sa di una strategia per risolvere questo in modo efficiente o un luogo dove posso leggere di più su di esso?
Per quanto riguarda il pensare a una soluzione, ho pensato di creare un albero decisionale per il set U . In ogni nodo dell'albero, la domanda "la tua lista degli ingredienti contiene x ?" verrebbe chiesto con x scelto per massimizzare il numero di membri di U che vengono eliminati dalla risposta. Quando U viene aggiornato, questo albero delle decisioni dovrebbe essere riequilibrato per ridurre al minimo il numero di domande richieste per trovare il risultato corretto. Un altro pensiero è quello di rappresentare U con qualcosa come n -dimensionale booleano "octree" (dove n è il numero di ingredienti unici).
Credo che "Quali ricette possono essere fatte con questi ingredienti?" si può rispondere prendendo il prodotto cartesiano dei (set di ingredienti richiesti per le) ricette nel ricettario con il powerset degli ingredienti che si hanno e filtrando le coppie ordinate risultanti per le coppie in cui entrambi gli elementi sono uguali, ma questo non è un soluzione efficiente, e quello che sto chiedendo è come ottimizzare questo tipo di operazione; come si potrebbe comporre questo in SQL in modo tale che sarebbe efficiente e cosa fa SQL che consente di essere efficiente?
Anche se uso l'illustrazione di un ricettario di ricette e una serie di ingredienti, prevedo che il numero di "ricette" e il numero di "ingredienti" saranno molto grandi (fino a centinaia di migliaia ciascuno), anche se il il numero di ingredienti in una determinata ricetta e il numero di ingredienti in un determinato set di ingredienti sarà relativamente piccolo (probabilmente circa 10-50 per una tipica "ricetta" e circa 100 per un tipico "set di ingredienti"). Inoltre, l'operazione più comune sarà la query s ( U , Q ), quindi dovrebbe essere la più ottimale. Ciò significa anche che un algoritmo a forza bruta che richiede il controllo di ogni ricetta o il funzionamento su ogni ingrediente sarebbe comunque indesiderabilmente lento da solo. Con il caching intelligente, penso che questo potrebbe non funzionare troppo male, però.