Durezza nel trovare una parola di lunghezza al massimo


10

Dichiarazione problema :

Sia un automa pushdown (potenzialmente non deterministico) e lascia che sia il suo alfabeto di input. C'è una parola st accettato da ?A w A | w | k MMAwA|w|kM

Questo problema è NP-completo? È stato studiato? Esiste un algoritmo che consente di trovare una parola del genere?


L'algoritmo di Djikstra non dovrebbe fare il trucco? (Probabilmente sto fraintendendo qualcosa qui!)
alpoge

"lunghezza al massimo "? k
alpoge

Prego, Kaveh. Sì, ho dimenticato "al massimo", ho modificato di nuovo.
Lamine,

1
La risposta è semplice: è una domanda da fare?
Sariel Har-Peled,

Abbiamo accesso alla descrizione degli automi o l'abbiamo solo come scatola nera?
Raphael,

Risposte:


9

Calcola l'intersezione della tua lingua CFG con la lingua normale (ciò equivale a moltiplicare il numero di stati per k e aggiungere uno stato "vicolo cieco"). Ora controlla se il risultato è vuoto: converti in una grammatica (penso che il risultato avrà dimensioni polinomiali) e "backtrack" dalle produzioni epsilon.i=0kAkk

Modifica: Kaveh ha detto che questo è polinomiale in , quindi se k è dato come input, l'algoritmo è esponenziale in | k | . Tuttavia, Kaveh ha trovato il modo di risolverlo. Convertire l'automa originale in un CFG e sostituire tutti i terminali con un terminale fisso. Ora usa un algoritmo iterativo per trovare la dimensione minima di una parola generata da ciascun non terminale, come segue.kk|k|

AatBiO ( n ) nf(A)=min(f(A),t+f(Bi))O(n)n


Penso anche che la trasformazione PDA CFG sia polinomiale. Grazie! Quindi il problema è in . PP
Lamine,

Ok, dato che esiste un modo per calcolare direttamente la lunghezza più bassa,non è un input. Ma non capisco perché sostituire tutti i terminali con uno fisso. L'algoritmo dovrebbe funzionare correttamente con i terminali originali. |k|
Lamine,

Hai ragione, in realtà non importa.
Yuval Filmus,

5

Cambia tutti i caratteri alfabetici in un singolo carattere specifico. Ora, hai PDA definito su un singolo carattere. La sua lingua è una grammatica senza contesto. Tuttavia, la grammatica libera dal contesto su un singolo personaggio è regolare. Quindi, converti il ​​CFG in una lingua normale, quindi controlla se contiene una parola di lunghezza k.

Ora, tutte queste conversioni tendono a richiedere tempo esponenziale, ma mi sembra improbabile che il problema sia NP completo. Soprattutto se si concede il tempo polinomiale in .k

Potrei sbagliarmi, e mi scuso per la mia risposta iniziale snippy ...

A proposito, il fatto che un CFG su una singola lettera sia regolare segue dal teorema di Parikh. Sebbene una prova diretta non sia troppo dura. Vedi il link per maggiori dettagli sul teorema di Parikh - è un bel risultato ... http://www8.cs.umu.se/kurser/TDBC92/VT06/final/3.pdf


No, non sono studente. Il problema che ho citato inizialmente è un problema di rete modellato come automa. Vorrei solo sapere se vale la pena cercare una soluzione polinomiale o no.
Lamine,

5
Questa risposta non dovrebbe essere un commento?
Oleksandr Bondarenko,

2
Sì dovrebbe. Sariel, potresti spostare questo in un commento o fornire una risposta?
Suresh Venkat,

@Suresh: potresti esserne consapevole, ma ora i moderatori possono trasformare una risposta in un commento .
Tsuyoshi Ito,

Ho spostato la risposta originale in un commento. Questa è una nuova risposta
Suresh Venkat,

0

kk

EDIT: quanto sopra funziona solo per NFA! Mi dispiace per quello.


(ma sicuramente poli-tempo!)
alpoge

Non sono sicuro che l'algoritmo di Dijkstra possa risolvere il problema. Può trovare il percorso più breve tra lo stato iniziale e quelli finali. Naturalmente, una parola che può essere accettata attraverso questi percorsi può essere generata. Ma questi percorsi sono elementari e le parole possono essere accettate attraverso percorsi non elementari; altrimenti il ​​problema di determinare se una grammatica senza contesto in grado di generare qualsiasi parola sarebbe decidibile, ma non lo è.
Lamine,

Il test di vuoto per CFL è decidibile, no?
alpoge

(Scusatemi di nuovo se non capisco!)
alpoge

Bene, si può usare un algoritmo di 'marcatura' per fare questo (dato il CFG) - marcare i terminali, quindi marcare le cose che ne derivano, quindi marcare le cose che hanno derivato le cose che sono marcate, ecc. Fino al termine del processo, e quindi controllare se la variabile iniziale è contrassegnata. Inoltre, ignora la mia risposta: ecco cosa dovresti fare per un NFA (certamente non per un PDA!).
alpoge,
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.