Confronto grafico personalizzato?

3

Sto provando a confrontare due grafici usando il valore hash (cioè, al momento del confronto, cerca di evitare di attraversare il grafico) C'è un modo per fare una funzione tale che i valori di hash messi a confronto possano anche determinare a quale altezza i grafici differiscono? Il confronto tra due grafici deve essere fatto confrontando i bambini a un certo livello. Un modo per confrontare i grafici è avere un valore hash finale per il nodo radice e confrontarli, ma ciò non rifletterebbe direttamente a quale livello i grafici differiscono, dal momento che i loro figli immediati potrebbero essere gli stessi (o qualsiasi altro caso). / p>     

posta vsrao 27.06.2012 - 16:41
fonte

2 risposte

1

Una soluzione accartocciata:

Probabilmente potresti unire insieme qualcosa in cui ogni livello del grafico ha influenzato una porzione diversa del valore hash. In pratica, ciò che dovresti fare è creare un valore hash separato per ogni livello e aggiungerli in sequenza.

es. Per un hash a 32 bit e grafici con 8 livelli, ogni livello potrebbe essere hash a 4 bit: 1 ° livello = > bit 1-4; 2 ° livello = > bit 5-8; ecc.

Se il numero di livelli nei tuoi grafici non è corretto / noto, dovrai avvolgerlo. Questo non ti direbbe esattamente quale livello era diverso, ma ridurrebbe le tue opzioni.

es. Per un hash a 32 bit e grafici con un numero sconosciuto di livelli, ogni livello poteva ancora hash a 4 bit: i bit 1-4 sarebbero influenzati dai livelli 1, 9, 17, ...; i bit 5-8 sarebbero influenzati dai livelli 2, 10, 18, ...; e così via.

Perché è probabilmente una cattiva idea:

  • La funzione di hash che ho descritto è una funzione di hashing della spazzatura . Prevedo che produrrebbe molti scontri e una scarsa distribuzione.
  • Utilizzare i valori hash per rilevare le differenze è più rapido se c'è una differenza. hash(A) != hash(B) ti dice che A e B sono diversi, ma hash(A) == hash(B) fa non ti dice che sono gli stessi. Nel secondo caso, dovrai fare un confronto completo per essere sicuro.

Alcuni altri approcci possibili:

  • Prendi un altro approccio. Se i confronti sono troppo lenti, esegui un profiler e vedi se ci sono altri modi per velocizzare il confronto: prova a utilizzare una struttura dati diversa per archiviare i tuoi grafici, ecc.
  • Prova un compromesso:
    • Crea un valore hash separato per ogni livello e uno per l'intero grafico. Confrontare i valori hash per ogni livello sarà ancora più veloce rispetto al confronto di ogni singolo nodo.
    • Invece di usare un valore hash per accelerare i tuoi confronti, crea due oggetti con metadati sui grafici (ad esempio # di livelli, # di nodi su ogni livello, ecc.) e confrontali.
risposta data 28.06.2012 - 10:28
fonte
2

No, non c'è modo di fare ciò che stai chiedendo, lo scopo di un valore hash è prendere qualcosa e renderlo un altro senza una relazione apparente con quello che era. Ciò significa che i valori hash sono utili solo per dirti se le cose sono le stesse, non ciò che è diverso tra loro.

In teoria è possibile decodificare la sorgente di un hash, e si può usare la fonte per trovare le differenze, ma questo è sia dispendioso dal punto di vista computazionale che del tutto inutile quando si ha a disposizione la fonte con un modo molto più veloce di generarlo.

    
risposta data 27.06.2012 - 17:47
fonte

Leggi altre domande sui tag