Data una serie di coppie di valori ordinati, quale algoritmo troverà i duplicati inversi? [Converse significa gli stessi valori, ma nell'ordine opposto.]
Cioè, dato [ab, ac, ad, bc, bd, ca, db] c'è un modo efficiente per trovare ca e db, essendo i duplicati inversi per ac e bd?
L'applicazione è abbastanza semplice: le coppie ordinate sono spigoli in un grafico diretto e se c'è un bordo opposto allora si deve disegnare un singolo fronte doppio anziché un bordo in ogni direzione. I valori sono stringhe, essendo nomi di nodi.
Può essere visto come una ricerca in una matrice sparsa. Date le coordinate (a, b), controllate se (b, a) esiste. Tuttavia, i linguaggi di programmazione comuni non forniscono (sembrano) array sparsi di 2d.
Ho scritto una soluzione in ruby usando hash-of-hash, ma sono circa 20 righe di codice scomodo e un risultato insoddisfacente. Scrivere lo stesso codice in una lingua come C # o Java sarebbe più lungo. Si cerca una soluzione migliore, in pseudocodice o una descrizione (passaggi) dell'algoritmo. Ad ogni modo, sto cercando una risposta che descriva come trovare la soluzione, nonché i vantaggi e gli svantaggi dell'algoritmo specifico.
Non ho tentato di definire "efficiente" o "migliore" e le prestazioni non sono una considerazione prioritaria per un disegno di poche centinaia di nodi.
I nodi non sono ordinati, quindi l'algoritmo predefinito sarebbe, per ogni coppia, per formare la ricerca inversa e forza bruta nella metà precedente. Una ricerca binaria richiederebbe un ordinamento precedente. Una soluzione basata sull'indicizzazione hash dovrebbe essere molto più veloce.