Как проще всего представить таблицу переходов DFA в коде C#? - PullRequest
1 голос
/ 28 мая 2020

Вот что я go до сих пор, так что в DFA у вас есть состояния, и у вас есть переходы между этими состояниями, к go от state A до state B вы потребляете symbol ex: 'a'. Теперь я пытаюсь написать DFA transition function, который принимает current state (int) and a transition symbol (char) and returns the next state (int). Теперь для этого у вас должен быть доступ к таблице переходов, теперь как лучше всего представить эту таблицу переходов? Вот что я получил до сих пор :

Dictionary<int, Dictionary<char, int>> transitionMap = new Dictionary<int, Dictionary<char, int>>();

это моя карта переходов, это словарь, где первые int key is current state и nested dictionary consists of symbol consumed and the other int is the next state that I have to return. Проблема, с которой я сталкиваюсь, заключается в том, что в словаре не может быть повторяющихся ключей (в этом case state), и DFA могут иметь несколько переходов для одного и того же состояния. Например, если я попытаюсь сделать это:

  Dictionary<char, int> dict = new Dictionary<char, int>();
  dict.Add('a', 1);  // 'a' here is the symbol consumed to go to state 1 from state 0
  transitionMap.Add(0, dict); // 0 is the current state

Теперь, когда я добавляю это, он работает, но когда я пытаюсь добавить еще один переход для состояния 0, этого не происходит, потому что словари не могут иметь дубликаты ключей, так что тут делать?

1 Ответ

2 голосов
/ 29 мая 2020

Да, так что у меня была проблема с пониманием словарей, теперь я понял:

if (transitionMap.ContainsKey(state))
{
      Dictionary<char, int> res = new Dictionary<char, int>();   
      transitionMap.TryGetValue(state, out res);
      res.Add(symbol, nextState);
      transitionMap[state] = res;
}

Мне просто нужно было проверить, существует ли это состояние, затем взять словарь, добавить к нему еще один переход и добавить в transitionMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...