2016-04-11 22 views
7

Mi sono imbattuto in a spreadsheet che spiega un metodo per ordinare sia le righe che le colonne di una matrice che contiene dati binari in modo che il numero di modifiche tra righe consecutive e colonne sia ridotto al minimo.Algoritmo per ordinare righe e colonne per somiglianza

Ad esempio, iniziando con:

initial table

Dopo 15 operazioni manuali descritte nelle schede della spreadsheed, la seguente tabella si ottiene:

final result

desidero know:

  1. qual è il nome comune di questo algoritmo o metodo?
  2. come applicarlo alla tabella più grande (dove 2^n traboccherebbe ...)
  3. come generalizzare a dati non binari, ad esempio utilizzando la distanza di Levenshtein?
  4. se c'è qualche link per il codice (Excel VBA, Python, ...) già l'applicazione del presente (altrimenti lo scrivo ...)

Grazie!

+1

Questo è il percorso hamiltoniano euclideo in {0,1}^n; Penso che potrebbero esserci algoritmi di approssimazione a fattore costante dal momento che hampath è strettamente correlato a TSP (sia Hapath che TSP sono np-hard per i grafici generali), e abbiamo algoritmi di approssimazione per TSP, ma non aspettatevi di risolverlo in modo ottimale - sebbene Non sono del tutto sicuro che esista una prova di durezza per questo specifico spazio, sarei sorpreso se fosse in P. Non so cosa può fare VBA, quindi non posso dirvi se è possibile implementare un'approssimazione algoritmo lì. –

+2

Avendo un secondo sguardo, la distanza non è in realtà euclidea, ma la distanza di Hamming; Non conosco prove di durezza o algoritmi di approssimazione per quello, ma probabilmente esistono. –

+1

Correlati: [Codici grigi] (https://en.wikipedia.org/wiki/Gray_code), disponibili anche come varianti n-ari. – Norman

risposta

2

È possibile rappresentare ogni riga da un vettore L = [1, 1, 0, ... 1], e quindi definire la distanza tra due linee d(L0, L1) per il numero di elementi in posizioni che sono diversi tra L0 e L1 corrispondente. Questo è noto come binario Hamming distance. Se avessi dati non binari, potresti semplicemente estendere la tua definizione di distanza e sì, la distanza di Levenshtein sarebbe un'opzione.

Una volta definita la distanza, il resto del problema riduce la distanza tra le righe consecutive. Questo è esattamente lo Traveling salesman problem, che è noto per essere NP-hard (http://www.diku.dk/hjemmesider/ansatte/jyrki/Paper/EKP85.pdf).

La soluzione diretta (visitare tutte le permutazioni) è O (n!), Ma è possibile fare meglio facilmente utilizzando la programmazione dinamica, ad esempio Held–Karp_algorithm. Esistono anche algoritmi approssimativi, come lo Nearest_neighbour_algorithm che calcola rapidamente una soluzione non ottimale.

Infine, per le implementazioni si può facilmente google "commesso viaggiatore excel/python" e trovare molti tutorial ed esempi.

Problemi correlati