کمینهسازی DFA
حالتهای همارز یک ماشین قطعی را یکی میکند: از تقسیم به پذیرش و غیرپذیرش شروع میکند و دستهها را تا جایی میشکند که دیگر شکستنی نباشند.
دو حالت همارزند اگر برای هر رشتهی ورودی، هر دو به پذیرش برسند یا هیچکدام. حالتهای همارز را میشود یکی کرد؛ نتیجه ماشین کمینه است که برای هر زبان منظم (بهجز نامگذاری حالتها) یکتاست.
ادامهی توضیح ↓- زمان:
O(n²) here (O(n log n) with Hopcroft's method) - حافظه:
O(n) - جانسونباو، فصل ۱۲
- گریمالدی، فصل ۶
ماشینی ۵ حالته برای «با ab تمام میشود»؛ حالت ۳ با ۰ و حالت ۴ با ۱ همارز است و DFA کمینه ۳ حالت دارد. هر سطر: [بعد از a، بعد از b، پذیرش].
def minimize(delta):# delta: one row per state: [state after a, state after b, accepting (1) or not (0)].n = len(delta)if any(t >= n for row in delta for t in row[:2]):return Noneblock = [1 if row[2] else 0 for row in delta]table = [[q, delta[q][0], delta[q][1], block[q]] for q in range(n)]while True:# Two states stay together only if their blocks agree and so do the blocks they go to.signature = [(block[q], block[delta[q][0]], block[delta[q][1]]) for q in range(n)]kinds = sorted(set(signature))new = [kinds.index(sig) for sig in signature]for q in range(n):table[q][3] = new[q]if len(kinds) == len(set(block)):breakblock = newreturn len(set(block))
شروع اجرا
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
delta list
Call stack
- minimize()خط 1
توضیح
ایده
دو حالت همارزند اگر برای هر رشتهی ورودی، هر دو به پذیرش برسند یا هیچکدام. حالتهای همارز را میشود یکی کرد؛ نتیجه ماشین کمینه است که برای هر زبان منظم (بهجز نامگذاری حالتها) یکتاست.
ریز کردن افراز (روش مور)
- حالتها را به دو دسته تقسیم کن: پذیرش و غیرپذیرش (رشتهی تهی آنها را جدا میکند).
- هر دسته را بشکن: دو حالت با هم میمانند فقط اگر با
aبه یک دسته بروند و باbهم به یک دسته. - تا وقتی دستهای شکست، تکرار کن. وقتی هیچ دستهای نشکست، هر دسته یک حالت ماشین کمینه است.
هزینه
حداکثر n دور، هر دور O(n): O(n²). روش هاپکرافت با انتخاب زیرکانهی دستهها به O(n log n) میرسد.
ورودی
هر سطر یک حالت است: [بعد از a، بعد از b، پذیرش (۱) یا نه (۰)]؛ حالت شروع ۰ است.