172 похожих чатов

Добрый день. У меня есть детерминированный полный конечный автомат. Мне нужно

с помощью этого автомата читать входную последовательность символов, получаемых из итератора.

В текущей имплементации я делаю это так. Я завел мутабельную переменную текущего состояния, которая инициализируется начальным состоянием автомата. Затем в цикле я читаю каждый следующий символ входной последовательности и делаю паттерн-матчинг пары из текущего состояния и входного символа по паттернам всех возможных пар транзиций автомата, меняя переменную состояния в теле матчинга.

Это решение, на первый взгляд, является избыточным с точки зрения производительности. Поскольку в каждый следующий момент, зная состояние в котором мы находимся, нам нужно сравнивать только символы алфавита для определения следующего перехода из данного состояния, а не сравнивать по всем парам вида (<произвольное состояние>, <символ алфавита>).

Поскольку автомат является конечным, то есть набор состояний конечен и наперед задан, возникает мысль избавиться от переменной состояния, и вместо этого использовать метки и безусловные переходы, где метки будут означать текущие состояния.

В Расте нет оператора goto, но есть циклы с метками.

В связи с этим у меня есть два вопроса:

1. На ваш взгляд, насколько разумным была бы такая оптимизация вообще?
2. Как всё-таки можно организовать систему безусловных переходов по меткам?

2 ответов

5 просмотров

А в чём проблема-то? Проседает производительность?

1. В таком вопросе всегда стоит выбор между экспоненциальным расходом памяти и линейной сложностью/сложностью, домноженной на константу. Так что для 2, скорее всего, надо по-хитрому уже компилировать в идеале, что на практике отнимет больше времени и неприменимо. Локально никто не запрещает ухватиться за оптимизицию отдельных видов переходов, но имхо часто не стоит траты времени.

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
How to create an OS in C? what to study?
Linus
18
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Карта сайта