Come faccio a sapere se una rete di confronto ordina?


9

Mi viene presentata una rete di confronto. Come posso determinare se la rete di confronto è una rete di smistamento? Nell'immagine seguente è riportato un esempio di una rete di ordinamento per selezione e ordinamento per inserzione. L'intenzione è quella di avere una rete di confronto e ordinare i valori numerici. Se collaudo 2 ^ n valori in questo caso 2 ^ 8. Questo è un sacco di lavoro | modo non efficiente per testarlo. Sto cercando un modello matematico / prova per verificare che questa sia una rete di smistamento valida. Una rete di ordinamento basata sull'ordinamento per inserzione


2
Cosa hai cercato, letto o provato? Cosa ti ha bloccato? Più precisa è la domanda, migliore è la risposta. La tua domanda su una rete di confronto arbitraria, ovvero una procedura generale per determinare se una rete di confronto arbitraria è una rete di smistamento? O è la tua domanda sul disgram dato.
babou,

2
È possibile utilizzare il principio zero one: una rete di ordinamento è corretta se funziona su tutti gli input zero one.
Yuval Filmus,

@YuvalFilmus Questo è un test esponenziale (in numero di input). È un problema NP completo.?
babou,

@babou non ne ho idea. In questo caso è pratico.
Yuval Filmus,

un'idea ovvia è un approccio empirico, basta considerare la sua azione su permutazioni casuali di [1..n], osservare il suo risultato, o fallirà o avrà successo, se ci riuscirai avrai un approccio quasi a prova di ...
vzn

Risposte:


10

In generale, verificare se una particolare rete di confronto sia effettivamente una rete di smistamento corretta è un problema completo di Co-NP. Se si desidera verificare mediante test, è necessario provare in modo esponenziale molti test.

In particolare, esistono reti di ordinamento che ordinano correttamente tutti tranne un singolo valore, quindi non puoi sperare di testare se la rete è corretta o meno semplicemente alimentandola con alcuni input.

Un metodo standard consiste nel verificare se ordina correttamente tutti i input composti esclusivamente da zero e uno. Se lo fa, si scopre che ordinerà tutti gli input (anche quelli che non si limitano a zero e uno). Tuttavia, ciò richiede esponenzialmente molti test. Inoltre, il numero di test non può essere ridotto in modo significativo: per zero-uno input, è possibile dimostrare che sono necessari almeno test, al punto che la rete di smistamento è corretta.2n2nn1

In alternativa, si possono usare i test in cui gli input sono permutazioni di . Ciò riduce un po 'il numero di test necessari, ma è comunque necessario esponenzialmente molti test. In particolare, i test sono necessari e sufficienti.1,2,,nC(n,n/2)1

Per prove di questi fatti, consultare i seguenti documenti:

Sulla complessità computazionale della verifica della rete di smistamento ottimale . Ian Parberry. Parle'91 Parallel Architectures and Languages ​​Europe, 1991.

Limita la dimensione dei set di test per l'ordinamento e le reti correlate . Moon Jung Chung e B. Ravikumar. Discrete Mathematics, vol 81, pp.1--9, aprile 1990.


6

Citando la tua domanda:

Sto cercando un modello / prova matematica per verificare che si tratti di una rete di smistamento valida.

Mentre la risposta (eccellente) di DW si occupa del caso generale, prenderò in considerazione il tuo esempio specifico. Una rete di questo modulo conn gli input possono essere mostrati come una rete di smistamento per induzione: (vedi immagine per l'illustrazione)

  1. n=1 l'input è sempre ordinato;
  2. Supponiamo che una rete di dimensioni n1 di questo modulo è una rete di smistamento e considera una rete di dimensioni n.
    1. La "diagonale" più a sinistra porterà sempre correttamente l'elemento più grande a n-th position (nel tuo caso, b8);
    2. Ti rimane una rete più piccola e simile con il resto n1 elementi;
    3. Questa rete più piccola ordinerà tutti gli elementi rimanenti in base all'ipotesi induttiva.

Illustrazione di prova


5

Quando guardi una rete di ordinamento generale, potresti non avere idea di come provare che ordina correttamente ogni sequenza di valori (con la giusta lunghezza per la rete di ordinamento). Ma ho imparato su questo bel trucco, come semplificare l'attività:

Il principio 0-1

Quando una rete di smistamento ordina ogni sequenza (con la giusta lunghezza) composta solo da "0" e "1" correttamente, allora ordina correttamente qualsiasi sequenza (con la giusta lunghezza). Naturalmente "0" e "1" sono segnaposto per qualsiasi elemento distinto nel dominio della rete di smistamento.

Quindi puoi costruire una prova come questa:

  1. Prendi due elementi distinti dal dominio della rete di ordinamento e chiamali "0" e "1", in modo che "0" <"1"
  2. Costruisci tutte le stringhe binarie con la lunghezza esatta della rete di ordinamento
  3. In queste stringhe sostituire lo 0-bit e l'1-bit con "0" e "1"
  4. Applicare queste stringhe alla rete di ordinamento
  5. Ogni stringa deve essere ordinata in modo simile a 000..01 ... 1

analisi 2n valori

Per un test esaustivo di una rete di smistamento di lunghezza ndi solito dovresti testare tutte le combinazioni di input. Ma con il principio 0-1 puoi abbassare questo2n test (test di tutte le stringhe binarie di lunghezza n).

Possiamo farlo più economico?

Sfortunatamente probabilmente non possiamo essere molto più economici dei test esaustivi, almeno non quando si utilizza una macchina Turing per costruire le prove. Ovviamente, quando cerchi una rete di smistamento specifica, potresti avere un'idea creativa su come fare una semplice prova. Ma in generale un algoritmo per costruire tali prove è molto probabilmente complesso quanto testare tutte le stringhe binarie. La ragione di ciò è che la rete di smistamento delle prove è correlata alla classe di complessità completa NP come indicato nelle altre risposte.

"Molto più economico" in questo contesto significa "tempo polinomiale". Potrebbe essere possibile trovare un algoritmo in grado di farlo "leggermente" più velocemente del tempo esponenziale ma che necessita ancora di più del tempo polinomiale. Vedere i commenti per un esempio: In esecuzione2n i passaggi sono (leggermente) più veloci del tempo esponenziale ma ancora (molto) più lenti del tempo polinomiale.

Prospetto / Outlook

Il tuo cervello è una macchina di Turing?

Una conseguenza filosofica è: quando credi di poter trovare una prova creativa per la correttezza di ogni rete di smistamento, allora stai anche credendo che il tuo cervello molto probabilmente non sia una macchina di Turing.

Ordinamento parallelo

Il "principio 0-1" viene utilizzato anche per provare la correttezza degli algoritmi di ordinamento in parallelo. Ho una (eventualmente) bella presentazione di questo su Github .

Correzione della rete di smistamento

Se una delle stringhe è ordinata in modo errato (quindi hai dimostrato che la rete di ordinamento è sbagliata), puoi usarla per costruire una rete di ordinamento senza quel bug. Aggiungi un ulteriore confronto sulla posizione del "bordo 1-0" nella stringa del risultato errata.


Nitpick: anche se P! = NP, completezza (co) NP non preclude l'esistenza di algoritmi sub-esponenziali, diciamo con un tempo di esecuzione in O(2n). (Tali algoritmi esistono per molti problemi NP-completi.)
Raffaello

@Raphael Se ho capito bene, P! = NP dovrebbe proibire solo soluzioni "polinomiali" per problemi (co) NP-completi, vale a dire soluzioni in cui runtime (e utilizzo della memoria) sono vincolati da un termine polinomiale per input lunghi arbitrari. Quindi devo solo verificare se il termine che hai dato è più grande di qualsiasi polinomio per valori arbitrari din. Giusto?
stefan.schwetschke,

Qualcosa del genere , sì. (Ho letto la tua risposta come "ecco come farlo in tempo esponenziale, e probabilmente non possiamo fare di meglio dal momento che è co-NP-difficile". Questo è un non sequitur, quindi il mio commento.)
Raphael
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.