Algoritmo deterministico semplice e pratico, tempo di esecuzione complicato


18

Molto spesso, se il tempo di esecuzione di un algoritmo è un'espressione complicata, anche l'algoritmo stesso è complicato e poco pratico. Ciascuno delle radici del cubo e dei fattori nel tempo di esecuzione asintotico tende ad aggiungere complessità all'algoritmo e anche fattori costanti nascosti al tempo di esecuzione.loglogn

Abbiamo esempi eclatanti in cui questa regola empirica fallisce?

Ovviamente è facile trovare esempi di algoritmi che sono molto difficili da implementare anche se hanno un tempo di esecuzione nel caso peggiore molto semplice. Ma che dire del contrario?

Abbiamo esempi di algoritmi deterministici molto semplici e pratici che sono facili da implementare ma che hanno un'espressione molto complicata come il suo tempo di esecuzione asintotico nel peggiore dei casi?

Si prega di notare le parole chiave "deterministico" e "caso peggiore"; l'analisi di semplici algoritmi randomizzati porta abbastanza facilmente a espressioni complicate.

Naturalmente ciò che è "complicato" è una questione di gusti. Comunque, preferirei vedere un'espressione troppo brutta per inserire il titolo del tuo articolo. E preferirei una complicata funzione di un parametro naturale (dimensione di input, numero di nodi, ecc.).


PS. Pensavo che non avrei trasformato questa in una "grande domanda", e non in CW. Vorrei trovare un unico eccellente esempio (se esiste affatto). Quindi pubblica un'altra risposta solo se pensi che sia "migliore" di qualsiasi risposta finora.


2
L'algoritmo di test di primalità AKS si qualifica come una risposta? Sto esitando perché la "complicità" del suo tempo di esecuzione è, in un certo senso, il risultato della pseudo casualità della distribuzione dei numeri primi ...
arnab

La mia sensazione è che il caso peggiore sia nella maggior parte dei casi qualcosa che causa "corre su tutto" e tutto è la cosa in cui misuriamo il tempo di esecuzione. Quindi, naturalmente, gli algoritmi semplici hanno un tempo di esecuzione del WC facile. Runtime complicati sorgono se proviamo a radere un po 'fuori da qualche trucco. Ma la tua domanda è interessante; Sono certamente curioso di vedere se la mia sensazione è giusta.
Raffaello

@arnab: grazie, AKS è una buona idea. Ma non sono sicuro che possiamo chiamarlo "pratico"?
Jukka Suomela,

Gli schemi di passaggio dei messaggi come la propagazione del rilievo, la propagazione dei vincoli o il TRW sequenziale vengono considerati "algoritmi"? Facile da implementare, il runtime è difficile da prevedere
Yaroslav Bulatov,

Oops, mi piace sempre il metodo rho di Pollard, è semplice e pratico, e l'analisi è davvero difficile, ma la casualità dell'algoritmo lo rende non qualificato come risposta al post ...
Hsien-Chih Chang 張顯 之

Risposte:


20

Il miglior esempio a cui riesco a pensare è un algoritmo (descritto di seguito) per calcolare il livello in una disposizione di n linee nel piano, cioè la linea poligonale formata dai punti che hanno esattamente k linee verticalmente sopra di esso. Questo non è l'algoritmo più efficiente noto per il problema. Esistono algoritmi più efficienti con complessità più semplici, ma credo che questo sia più pratico della maggior parte (se non di tutti) di loro. L'analisi non è probabilmente stretta, perché utilizza la complessità k -level, che è un famoso problema aperto (penso che tutti gli altri termini dell'analisi siano stretti). Tuttavia, dubito che limiti migliorati per k -level renderebbero il tempo di esecuzione molto più semplice. Presumo k =knkkk per scrivere la complessità in funzione di n solo.k=n/2n

L'algoritmo si basa sul paradigma dello sweep di linea e utilizza due tornei cinetici -ary come code cinetiche di priorità. Inserimenti ed eliminazioni vengono eseguiti quando una linea supera o scende il livello k , spostando una linea da un torneo cinetico all'altro. Pertanto, vi sono O ( n 4 / 3 ) inserzioni e delezioni (utilizzando vincolato per il Dey k complessità-level). Ogni evento viene elaborato in O ( log n ) tempo e ci sono O ( n 4 / 3 α ( n(logn)kO(n4/3)kO(logn) eventi (il α ( n ) deriva dalla complessità dell'inviluppo superiore delle disposizioni dei segmenti di linea, mentre il log n / log log n proviene dall'altezza di un albero ( log n ) -ary ). Il tempo di esecuzione totale èO(n4/3α(n)logn/loglogn)α(n)logn/loglogn(logn)

O(n4/3α(n)log2n/loglogn).

Per maggiori dettagli e riferimenti, consultare il manoscritto di Timothy Chan http://www.cs.uwaterloo.ca/~tmchan/lev2d_7_7_99.ps.gz . Il fattore può essere rimosso usando un torneo cinetico binario (intead of ( log n ) -ary), ma in realtà accelera la coda di priorità cinetica nei test che ho eseguito. La complessità dovrebbe diventare un po 'più brutta e peggiore (mentre l'algoritmo sarà ancora pratico) se viene usato un heap cinetico invece di un torneo cinetico ( dovrebbe apparire un log all'interno di una radice quadrata).1/loglogn(logn)log


Ottimo esempio, grazie! Questo non sarà facile da battere. :)
Jukka Suomela,

1
Questo algoritmo è più lento nella pratica rispetto agli algoritmi randomizzati, che sono abbastanza facili da implementare (come qualcuno che ha implementato uno di questi algoritmi (vedi il mio articolo "Fare una passeggiata in una disposizione planare").
Sariel Har-Peled,

Ho accettato questa risposta in quanto sembra essere il più vicino a ciò che avevo in mente. Ma se qualcuno ha qualche idea nuova, sarei felice di sentirlo!
Jukka Suomela,

24

Le operazioni della struttura dei dati di unione-find sembrano soddisfare i tuoi criteri:

http://en.wikipedia.org/wiki/Disjoint-set_data_structure


2
In effetti, ho pubblicato la stessa risposta ma l'ho cancellata dopo aver notato che mi hai battuto. :) Algoritmo semplice ed elegante che un non teorico potrebbe persino scoprire, ma inverte la complessità ammortizzata di Ackermann.
Warren Schudy,

Beh, il tempo non sembra che "complicato", se lo si confronta con O ( n 4 / 3 α ( n ) log 2 n / log log n ) in risposta di Guilherme. :)O(α(n))O(n4/3α(n)log2n/loglogn)
Jukka Suomela,

Il rapporto tra lunghezza dell'algoritmo e complessità della prova per union-find è probabilmente imbattibile: tutte e tre le operazioni sono cosa, nove righe di codice?
Neel Krishnaswami,

1
Non penso che la domanda riguardi un algoritmo semplice e pratico con analisi complesse . Penso che la domanda riguardi un algoritmo semplice e pratico con un tempo di esecuzione complesso , ovvero l'espressione effettiva ottenuta per il limite superiore.
Guilherme D. da Fonseca,

6

Algoritmo simplex. Facile da implementare e funziona meravigliosamente in pratica, ma è un casino da analizzare teoricamente.


n

in realtà è noto che il simplex impiega tempo esponenziale nel peggiore dei casi tramite la costruzione Klee-Minty. Non è, credo, un esempio di ciò che Jukka sta chiedendo
Suresh Venkat,

1
Forse avrei dovuto dire il metodo simplex piuttosto che l'algoritmo simplex. Il cubo Klee-Minty e le sue varianti funzionano per alcune regole pivottanti alla vaniglia. Ma, ad esempio, la regola di rotazione casuale delle facce ha un limite superiore folle e (recente) inferiore. Gil Kalai ha pubblicato un bel post sul blog sui risultati recenti. gilkalai.wordpress.com/2010/11/09/…
Mohit Singh,

buon punto, Mohit. Anche io ero confuso.
Suresh Venkat,

2

Non sono sicuro se lo consideri "pratico" ma è un famoso problema aperto. Paul Erdos ha detto della congettura di Collatz: "La matematica non è ancora pronta per tali problemi"

x=1


E qual è il problema risolto da questo algoritmo ...?
Jukka Suomela,

Suggerisce la ricerca di nuove tecniche di analisi di runtime.
Mohammad Al-Turkistany,

2
si potrebbe quindi affermare che una ricerca della forza bruta per una prova della congettura di Collatz motiva anche "nuove tecniche di analisi del runtime"; in entrambi i casi l'algoritmo sta esplorando semplicemente un digraph. La congettura di Collatz è divertente, ma non credo che questo sia un esempio interessante di "un algoritmo".
Niel de Beaudrap,

2

Questo esempio, pur non incontrando la lettera della tua richiesta, può essere interessante perché porta una certa affinità spirituale. In particolare, la questione dell'ordinamento di pile di pancake e pancake bruciati per inversioni.

http://en.wikipedia.org/wiki/Pancake_sorting

Un campo di applicazione è la biologia computazionale (genetica) in cui si possono porre domande sui riarrangiamenti del genoma in termini di distanza tra permutazioni usando inversioni di pezzi delle permutazioni soggette a varie regole.

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.