Background: Chao Xu ha postato la seguente domanda qualche tempo fa: " Esistono algoritmi di ordinamento comparativo noti che non si riducono alle reti di ordinamento, in modo tale che ogni elemento venga confrontato volte? ". Sembra che siamo un po 'bloccati dal problema; Ho discusso dello stesso problema con Valentin Polishchuk nel 2009 e non siamo riusciti da nessuna parte.
Per avere alcune idee originali, ho cercato di formulare la domanda più semplice possibile che avesse un sapore simile e non fosse del tutto banale. Da qui la seguente domanda.
Domanda: vengono forniti due elenchi ordinati, ciascuno con elementi. Riesci a unire gli elenchi in modo che ogni elemento venga confrontato solo O ( 1 ) volte?
Naturalmente, l'uscita dovrebbe essere un elenco ordinato che contiene tutti i elementi.
[Questo si è rivelato banale, la risposta è "no".]
Domanda 2: ti vengono dati due elenchi ordinati, ognuno con elementi. Puoi unire gli elenchi in modo che ogni elemento venga confrontato solo O ( 1 ) volte, se ti è permesso di scartare una piccola frazione di elementi ?
Più precisamente, l'output dovrebbe essere un elenco ordinato che contiene e un "cestino" che contiene elementi T ( n ) . Quanto è piccolo il valore T ( n ) ? Ottenere T ( n ) = n è banale. Qualcosa come T ( n ) = n / 100 dovrebbe essere fattibile in modo semplice. Ma puoi ottenere T ( n ) = o ( n ?
Appunti:
Usiamo il modello di confronto qui. Solo algoritmi deterministici, siamo interessati alle garanzie nel caso peggiore.
Nota che entrambi gli elenchi hanno esattamente elementi. Se avessimo una lista con n elementi e un'altra con 1 elemento, la risposta è chiaramente "no"; tuttavia, se entrambi gli elenchi sono lunghi, sembra che si possa essere in grado di eseguire un "bilanciamento del carico".
Questa volta è valido qualsiasi tipo di algoritmo. Se il tuo algoritmo utilizza le reti di ordinamento come blocco predefinito, va perfettamente bene.
Per iniziare, ecco un semplice algoritmo che confronta ogni elemento per un massimo di 200 volte: basta usare l'algoritmo di unione standard, ma mantenere i contatori per i capi delle liste. Una volta raggiunti 200, scarta l'elemento. Ora per ogni elemento che hai scartato, hai inserito correttamente 200 elementi nel tuo array di output. Quindi hai raggiunto .