簡體   English   中英

使用有限自動機作為容器的鍵

[英]Using finite automata as keys to a container

我有一個問題,在這里我真的需要能夠使用有限自動機作為關聯容器的鍵。 每個鍵實際上應該代表一個等價的自動機類,這樣,當我搜索時,即使該自動機在結構上不相同,我也會找到一個等效的自動機(如果存在這樣的鍵)。

當然,一種顯而易見的最后解決方法是對每個檢查的鍵使用線性搜索和等效測試。 我希望可以做得更好。

我一直在嘗試強加一個任意但一致的排序,並推導一個排序比較算法。 第一原則涉及自動機代表的字符串集。 為每個自動機評估可能的第一個標記的集合,並基於這兩個集合應用排序。 如有必要,請繼續使用可能的第二個令牌,第三個令牌等的集合。天真地這樣做的一個明顯問題是,在證明等價性之前,要檢查的令牌集合數量是無限的。

我一直在考慮一些模糊的想法-首先最小化輸入自動機並使用某種閉包算法,或者轉換回常規語法,其中一些想法涉及生成樹。 我得出的結論是,我需要放棄令牌集的詞法排序,但是到目前為止,我得出的最重要的結論是,這並非微不足道,我最好還是繼續讀下去。別人的解決方案。

我已經從CiteSeerX下載了一篇論文- 關於子組和子集的總排序 -但是我的抽象代數甚至還不足以知道這是否相關。

我也想到可能有某種方法可以從自動機中獲取哈希值,但是我還沒有考慮太多。

誰能推薦一篇好論文來閱讀? -或者至少讓我知道我下載的是不是鯡魚?

我相信您可以從最小化的自動機中獲得規范形式。 對於任何兩個等效的自動機,它們的最小化形式是同構的(我相信這來自Myhill-Nerode定理)。 這種同構關系涉及邊緣標簽,當然也涉及節點類(開始,接受,不接受)。 這比未標記的圖形同構更容易。

我認為,如果您從起始狀態開始構建最小化自動機的生成樹,並按其邊緣對輸出邊緣進行排序,那么您將獲得自動機的規范形式,然后可以對其進行哈希處理。

編輯:非樹邊緣也應考慮在內,但是它們的標簽也可以規范地排序。

這是1992年的論文形式,在其中他們產生了規范的最小化自動機: 非確定性有限自動機的最小化

擁有規范的表單后,您可以輕松地對其進行哈希處理,例如,通過對狀態和過渡進行深度優先枚舉,並對通過編碼狀態編號(按其首次出現的順序對它們進行編碼)而獲得的字符串進行哈希處理三重

<from_state, symbol, to_state, is_accepting_final_state>

這應該可以解決問題。

當問題似乎無法解決時,解決方案通常是公開宣布您認為問題有多困難。 然后,您將立即意識到這個問題是微不足道的,並且您只是使自己看起來很白痴-基本上這就是我現在的位置;-)

正如問題中所建議的,要按詞法對兩個自動機進行排序,我需要考慮兩件事。 兩組可能的第一個標記,以及兩組可能的所有其他標記。 尾部可以表示為有限自動機,並且可以從原始自動機派生。

因此,比較算法是遞歸的-比較頭部,如果結果不同,則相同,然后遞歸比較尾部。

問題是證明常規語法的等效性需要無限的序列。 如果在比較期間重復出現一對自動機(相當於您先前檢查過的一對),則證明您具有等效性,則可以停止檢查。 有限自動機的本質是必須以有限的步驟進行。

問題是我仍然有相同形式的問題。 為了確定我的終止條件,我需要將當前的自動機對與到目前為止在比較期間發生的所有過去的自動機對進行比較。 那就是讓我頭疼的事情。

事實證明,該論文是相關的,但可能只使我走了這么遠。 常規語言可以使用連接運算符組成一個組,而左邊的coset與我一直在考慮的head:tail有關。

我是個白痴的原因是因為我施加了過於嚴格的終止條件,我應該早就知道了,因為這不是WRT自動機算法的問題。

我不需要在自動機對的第一次復發時停止。 我可以繼續下去,直到找到更容易檢測到的復發-既具有結構上的等效性又具有邏輯上的等效性。 只要我的“自動尾部自動機”算法是理智的(尤其是如果我在每個步驟進行最小化並執行其他清除操作),在比較期間,我就不會生成無限個等價但外觀不同的自動機對序列。 結構變化的唯一來源是原始的兩個自動機和尾部自動機算法,兩者都是有限的。

關鍵是,如果我比較太多的詞匯術語並沒有多大關系-我仍然會得到正確的結果,盡管我稍后會終止,但仍會在有限的時間內終止。

這應該意味着我可以使用對自動機的結構敏感的哈希或有序比較來進行不可靠的重復檢測(允許某些假陰性)。 這是一個比不敏感結構的比較簡單的問題,我認為這是我需要的關鍵。

當然,仍然存在性能問題。 基於此處涉及的問題,使用標准等效算法進行線性搜索可能是一種更快的方法。 當然,我希望這種比較比現有算法效率更低,因為它正在做更多的工作-非等價情況的詞法排序。 真正的問題是基於關鍵字的搜索的整體效率,這可能需要進行一些令人頭痛的分析。 我希望非等價自動機趨向於快速比較這一事實(檢測到前幾個步驟中的差異,就像傳統的字符串比較一樣)將使這種方法變得實用。

另外,如果到達懷疑等效性的程度,則可以使用標准等效性算法進行檢查。 如果該檢查失敗,我將繼續比較上次中斷的順序,而無需檢查重復的尾部語言-我知道我將在有限的步驟中找到不同之處。

如果您只能做==或!=,那么我認為您必須在添加每個成員之前檢查每個集合成員。 太慢了 (編輯:給定問題的標題,即使您繼續使用比較函數直接比較兩個有限自動機,我想您也已經知道了。)

我試圖用系統發育樹來做到這一點,但很快就遇到了性能問題。 如果要構建沒有重復項的大型集,則需要一種轉換為規范形式的方法。 然后,您可以檢查哈希,或以字符串表示形式為鍵插入二叉樹。

另一位提出了將樹轉換為規范代表的方法的研究人員使用Patricia樹來存儲唯一的樹以進行重復檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM