È davvero possibile dimostrare limiti inferiori?


24

Dato qualsiasi problema computazionale, il compito di trovare limiti inferiori per tale calcolo è davvero possibile? Suppongo che si riduca al modo in cui viene definito un singolo passo computazionale e quale modello utilizziamo per la prova, ma dato ciò, dimostriamo davvero un limite inferiore quindi in generale? Ciò che intendo è che possiamo dimostrare qualcosa come "il problema non può essere risolto più velocemente del tempo " piuttosto che "il problema può essere risolto in t (X) tempo o più veloce"?t ( X ) X t ( X )Xt(X)Xt(X)

Ho cercato di trovare informazioni specifiche sui limiti inferiori e le relative prove, ma non riesco davvero a trovare alcun interesse, alcuna raccomandazione su libri / documenti / siti Web sull'argomento?

Risposte:


19

Possiamo assolutamente provare queste cose.

Molti problemi hanno limiti inferiori banali, come ad esempio trovare il minimo di un insieme di n numeri (che non sono ordinati / strutturati in alcun modo) richiede almeno Ω(n) tempo. La dimostrazione è semplice: un ipotetico algoritmo che gira in tempo o(n) non può esaminare tutti i numeri nell'input. Quindi, se avessimo eseguito l'algoritmo su alcuni input, potremmo osservare che non ha mai esaminato un particolare elemento dell'input. Modificando questo elemento al minimo, possiamo far fallire l'algoritmo.

Un limite inferiore meno banale è il limite inferiore Ω(nlogn) per l'ordinamento nel modello basato sul confronto. La prova di ciò va lungo le seguenti righe: dato un input di n numeri, ci sono n!possibili output (l'input può essere qualsiasi permutazione dell'elenco ordinato, quindi anche output può essere qualsiasi permutazione dell'ingresso). Se ci limitiamo a fare solo confronti, allora il nostro algoritmo (in media) deve eseguire almeno confronti log2(n!)=Ω(nlogn) per poter dare n!uscite diverse.

I limiti inferiori possono essere ancora più forti. Esistono diversi problemi (in particolare i problemi -hard) per i quali esiste un limite inferiore esponenziale. I problemi in questa classe includono il calcolo di strategie ottimali per giochi come scacchi (generalizzati), pedine e giochi. La prova di ciò è attraverso il Teorema della Gerarchia del tempo , che afferma (soggetto ad alcune restrizioni su ):fEXPTioMEf

Data una funzione , esiste un problema computazionale che può essere risolto nel tempo ma non può essere risolto nel tempo .O ( f ( n ) ) o ( f ( n )fO(f(n))o(f(n)logn)

Quindi, fondamentalmente, se riesci a pensare a una funzione , esiste un problema che richiede molto tempo per essere risolto.f

Infine, un'altra strada per non dimostrare necessariamente un limite inferiore ma qualcosa di ancora più forte sta mostrando l'indecidibilità di un problema (es. Arresto, post-corrispondenza).


Le dimensioni dell'input o dell'output sono i limiti inferiori più comuni.
Raffaello

14

Si è possibile. L'esempio classico è il fatto che qualsiasi algoritmo di ordinamento basato sul confronto richiede confronti per ordinare un elenco di lunghezza .nΩ(nlogn)n

Tuttavia, i limiti inferiori sembrano essere molto più difficili da dimostrare rispetto ai limiti superiori. Per dimostrare che esiste un algoritmo di ordinamento che richiede confronti , devi solo esibire un tale algoritmo (unisci ordinamento - voilà !). Ma per un limite inferiore, devi in ​​qualche modo dimostrare che nessun algoritmo in una particolare classe può risolvere il tuo problema. La difficoltà di farlo è illustrata dal fatto che sappiamo solo che anche se sappiamo che almeno una di queste inclusioni è rigorosa ( dal teorema della gerarchia spaziale) e la maggior parte delle persone pensa che siano tutte rigorose.O(nlogn)

LNLPNPPSPUNCE,
LPSPUNCE

D'altra parte, Ryan Williams ha un bel documento (e discorsi, che ho sentito un paio di volte) chiamato Algorithms for Circuits and Circuits for Algorithms , in cui sostiene che trovare limiti inferiori e trovare algoritmi non sono fondamentalmente tutti così diverso. Ad esempio, cita la prova dell'indecidibilità del problema di arresto come esempio di un algoritmo (la macchina di Turing universale) utilizzato esattamente per dimostrare un limite inferiore (indecidibilità).


Penso che sia quello che sto cercando ".. in qualche modo devi dimostrare che nessun algoritmo in una determinata classe può risolvere il tuo problema", questa è la parte che trovo un po 'confusa dal momento che non riesco davvero a vedere intuitivamente come si potrebbe fare tale cosa, almeno in generale. Come @ Tom van der Zanden ha descritto il numero minimo di ricerca che capisco, ma questo approccio è generale? Intendo generale come avere quel tipo di argomento quando si costruiscono le prove? Grazie anche per il link.
hsalin,

1
@ user1288420 Non sei solo. Se qualcuno potesse vedere intuitivamente come dimostrare che nessun algoritmo in una determinata classe è in grado di risolvere alcuni problemi, avremmo molti più risultati con limiti inferiori! In genere, è necessario elaborare alcune proprietà di ogni algoritmo della classe e dimostrare che tale proprietà impedisce la risoluzione di alcuni problemi. Ad esempio, ogni macchina Turing che gira in tempo sublineare ha la proprietà di non poter nemmeno leggere tutto il suo input. Ciò significa che non può risolvere la maggior parte dei problemi. È banale; sfortunatamente, casi più interessanti sembrano essere incredibilmente difficili.
David Richerby,

3

Per fare un esempio banale, non è possibile trovare il numero più grande da un insieme di numeri senza controllarli tutti che richiedono tempo lineare. Nessuna grande prova. Ma ci sono algoritmi che non richiedono sempre la lettura di tutti i dati. Un buon esempio è la ricerca di tutte le occorrenze di un pattern in una stringa, che potrebbe non richiedere la lettura dell'intera stringa (algoritmo di Boyer-Moore). Ma non dovrei ripetere ciò che è già stato risposto, probabilmente meglio di quanto farei.n

Tuttavia, c'è un punto nella domanda che richiede alcune ulteriori osservazioni relative al limite inferiore (o ai limiti di complessità in generale).

In realtà la scelta di ciò che è un singolo passo computazionale è irrilevante, purché si possa considerare che i passi computazionali abbiano un limite superiore costante (e limite inferiore). Il risultato della complessità sarà lo stesso poiché è definito fino a una costante. Prendere 3 confronti come operazioni unitarie, o solo una singola, non fa differenza.

Lo stesso vale per la dimensione dei dati che serve da riferimento per valutare il costo del calcolo. Prendere un singolo numero intero o due numeri interi come unità di misura non fa differenza.

Tuttavia, le due scelte devono essere correlate.

Si può considerare che un numero è una singola unità di dati se si considera che le operazioni su numeri interi, come l'addizione o il confronto, sono operazioni di unità. Puoi anche considerare che si tratta di unità di dati poiché ci vogliono cifre per rappresentare un numero. Quindi, naturalmente, l'aggiunta e il confronto non sono più operazioni unitarie e il loro costo dipende dai valori degli operandi.nlognO(logn)

Il fatto che un'operazione possa essere considerata con un costo unitario è strettamente correlato a quali dati possono essere considerati di dimensioni unitarie. E questo dipende dal livello di astrazione che scegli per il tuo modello di calcolo.


Trovare banalmente tutte le occorrenze di un pattern in una stringa richiede di leggere l'intera stringa: se il pattern è "a", non è possibile trovare tutte le occorrenze senza controllare se ogni singolo carattere della stringa.
David Richerby,

1
@DavidRicherby In realtà non sempre. L'algoritmo di Boyer-Moore inizia dalla fine del pattern, saltando così nella corda. Se la corrispondenza tentata ha esito negativo, non è necessario leggere l'inizio della stringa. E ha anche un'ottimizzazione simile all'algoritmo Knuth-Morris-Pratt per saltare i tentativi che sono falliti a causa della struttura del modello. Naturalmente, ci sono schemi che richiedono la lettura dell'intera stringa.
babou,

@DavidRicherby Perché me l'hai chiesto, lo sapevi?
babou,

Non capisco il tuo secondo commento. La tua risposta originale conteneva un reclamo errato. Ovviamente sapevo che non era corretto: è così che sono stato in grado di segnalarlo! Altre persone potrebbero non sapere che non era corretto, quindi sarebbe stato confuso per loro lasciare la risposta com'era.
David Richerby,

1
@DavidRicherby Il punto è che hai capito cosa intendevo dire. Avrei dovuto dire che non piuttosto che no . Questo non ha richiesto uno stile di commento per far credere ai lettori che stavo parlando senza senso. E mentre lo facevi, hai fatto esattamente lo stesso errore negligente: affermando " Trovare banalmente tutte le occorrenze di un pattern in una stringa richiede leggere tutta la stringa ", quando avresti dovuto dire " Trovare tutte le occorrenze di un pattern in una stringa potrebbe richiedere leggendo l'intera stringa ". Intendevo solo affermare che la lettura dell'input potrebbe non essere sempre necessaria, per mitigare il mio esempio precedente.
babou,
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.