Struttura dei dati per l'ordinamento in base a più attributi

1

Ho una lista di coppie di numeri interi. Il valore di questa lista è la somma dei valori massimi di ciascuna coppia.

Per

(0, 5) (20, 5) (6, 8)

il valore sarebbe

5 + 20 + 8 = 33

Dato un elenco come questo, ho bisogno di massimizzare il suo valore. L'unica operazione che posso fare è scambiare un elemento di una coppia con un altro elemento di una coppia diversa.

Modifica : giusto per chiarire, ho bisogno di fare questa operazione tutte le volte che è necessario per ottenere il valore massimo, non solo una volta.

Per l'esempio sopra posso farlo

(6, 8) <> (0, 5)

L'elenco diventerebbe

(0, 6) (20, 5) (5, 8) => value = 6 + 20 + 8 = 34

Quindi per aumentare il valore avrei bisogno di trovare 2 coppie (a,b) (c,d) con min(a,b) > max(c,d) e poi scambiare min(a,b) con max(c,d) , giusto? Se non esistono coppie di questo tipo, non possiamo aumentare il valore della lista.

Soluzione:
Ho bisogno di mantenere le coppie ordinate in ordine decrescente dal valore minimo e in ordine crescente dal valore massimo perché ho bisogno di confrontare la coppia con il minimo maggiore con quella con il minimo più piccolo.

Ho pensato di utilizzare due heap per questo, un minheap che ordini in base ai massimi e un maxheap che ordini in base ai minimi. In questo modo, ogni volta che ho bisogno di confrontare posso semplicemente confrontare le radici dei due heap.

Il problema è che ho anche bisogno di aggiornare questi valori, scambiando il valore minimo di 1 coppia con il valore massimo di un'altra coppia e poi riordinando gli heap, quindi dovrei tenere anche informazioni aggiuntive per ogni nodo di heap per il posizione nell'altro heap. Qualcosa come Dual heap nella coda di priorità Double-ended .

È questo il modo migliore per affrontare questo problema, o ci sono strutture dati migliori che posso usare?

    
posta Adrian 08.12.2015 - 11:16
fonte

3 risposte

1

Penso che potresti pensarci troppo o cercare di complicarlo più del necessario.

Quando una coppia deve essere modificata, rimuovila da entrambi gli heap, modificala, quindi aggiungila a entrambi gli heap.

Un piccolo problema che potresti incontrare è che una volta che hai trovato in un heap una coppia che vuoi modificare, come trovare quella coppia nell'altro heap. Se le coppie sono uniche, questo non è un problema. Se le coppie sono non univoche, potrebbe essere necessario aggiungere un campo per identificarle in modo univoco. A meno che la lingua che stai usando fornisce già un qualche tipo di identità. (Ad esempio, in Java, è possibile confrontare per riferimento.)

    
risposta data 08.12.2015 - 12:50
fonte
0

Il tuo problema può essere suddiviso in due parti:

  • un algoritmo di ordinamento che prende un value da un dato elemento
  • un metodo per scegliere quale value estrarre, dato un nome di funzione

Quindi qualcosa come (pseudocodice simile a Python):

data = new MyDataStructure()
#Insert some values into it..
#...

def extract_feature(myObject, feature_name):
   return myObject.getFeature(feature_name)


print sorted(data, (key=lambda x: extract_feature(x))

Ri: il tuo commento Stai parlando di strutture dati, ma quello che sei veramente dopo ... è un algoritmo di ordinamento in grado di prendere un tipo di oggetto e modificare al volo la chiamata di a.compareTo(b) . In altre parole, qualsiasi datastructure farà. Il tuo algoritmo di ordinamento ha solo bisogno di sapere come calcolare la chiave con cui verrà eseguito l'ordinamento.

Esempio: link

    
risposta data 08.12.2015 - 11:31
fonte
0

Quello che stai cercando veramente è la somma del 50% più alto degli elementi.

Dato un insieme di coppie n , ci sono 2 elementi n . Dividiamo questi elementi in due sequenze (non insiemi, elementi possono verificarsi più volte), s e t contenenti ciascuno elementi n . Scambiamo elementi finché è vero che per ogni elemento e in s e f in t , che e < = f .

Ora riassumi semplicemente gli elementi in t , dandoci il risultato. Questo è molto simile all'ordinamento degli elementi in ogni coppia, scartando la metà degli elementi più piccoli e sommando il resto.

Il modo più semplice per ottenere questi risultati è il seguente algoritmo:

  1. Dividi ogni coppia in n in due numeri e inseriscili nella lista t .
  2. Ordina l'elenco t in ordine decrescente.
  3. Somma i primi c / 2 elementi in cui c è il numero di elementi nell'elenco (garantito pari).
risposta data 08.12.2015 - 19:19
fonte

Leggi altre domande sui tag