Что такое Конечные автоматы и почему программист должен знать о них?

Чтобы все URL имели косую черту.

Приведенное ниже правило переадресует https://myurl.com/en в https://myurl.com/en/ с косой чертой в конце.

https://myurl.com/ru - https://myurl.com/en/

blockquote>

[1115 ] Установка конечной косой черты для всех ваших URL-адресов в вашем доменном имени.

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ https://myurl.com/$1/ [L,R=301]

Приведенное ниже правило применимо только для определенного сегмента URL:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^en$ /en/ [R=301,NC,L]

Очистить кеш браузера

[ 1113] После внесения каких-либо изменений в файл .htaccess необходимо очистить кэш браузера перед повторной попыткой или открыть его в новом режиме просмотра в режиме инкогнито, чтобы проверить свои изменения, большинство современных браузеров обычно кэшируют веб-страницу, поэтому вы не можете увидеть действие, если вы не очистили кеш браузера.

6
задан 2 revs 12 December 2008 в 22:14
поделиться

12 ответов

Короткий ответ, это - техника, которую можно использовать для выражения систем конкретными состояниями (в противоположность квантовым состояниям / распределения вероятностей).

Заключение в кавычки статьи Wikipedia:

Конечный автомат (FSM) или конечный автомат (множественное число: автоматы) или просто конечный автомат, модель поведения, состоявшего из конечного числа состояний, переходов между теми состояниями и действий. Конечный автомат является абстрактной моделью машины с примитивной внутренней памятью.

Так, что это значит для Вас? Помещенный просто, это - эффективный способ представить путь (пути) от начального состояния в конец состояние (состояния) системы, о которой Вы заботитесь. Используя регулярные выражения как довольно легкое для понимания примера давайте посмотрим на шаблон AB+C (предположите, что это плюс является верхним индексом). Я ожидал бы к этому шаблону принимать строки, такие как "ABC", "ABBC", "ABBBC", и т.д. В запуске, C в конце, некотором числе B в середине (больше, чем или равный одной).

Если Вы думаете об этом, почти легче думать об этом с точки зрения изображения. Фальсифицируя ее с текстом (и что мои круглые скобки являются петлевой дугой), Вы видите, что (слева), начальное состояние, и C (справа) является конечным состоянием справа.

      _
     ( ) 
A --> B --> C

От FSAs можно продолжить поездку в вычислительную сложность путем заголовка в землю Машин Тьюринга.

Однако можно также использовать конечные автоматы для представления реальных поведений и систем. В моем мире мы используем их для моделирования определенного рабочего процесса фактических людей, работающих с компонентами, которые чрезвычайно нетерпимы к ошибкам в государственном заказе. Как в, "Должен произойти прежде C или будет очень серьезная проблема. Заставьте это не быть возможным прямо сейчас".

13
ответ дан 8 December 2019 в 02:18
поделиться

Вы могли искать его, но что, черт возьми. Интуитивно, конечный автомат является абстракцией чего-то, что имеет некоторое конечное число состояний и управляет, которым можно пойти в зависимости от государства. Состояние - что-то, для которого может быть сделан истинный или ложный оператор, и правило является способом, которым Вы изменяетесь от одного состояния до другого. Так, у Вас могло быть, скажем, два состояния: "Я дома" и "я работаю" и два правила, "перейдите к работе" и "пойдите домой".

Оказывается, что можно посмотреть на машины как это математически и найти, что существуют вещи, они могут и не могут сделать. Регулярные выражения являются в основном способом описать конечный автомат, в котором состояния являются рядом различных строк, и правила перемещают Вас в зависимости от государства на основе следующего символьного чтения. Можно доказать это. Но можно также доказать, что никакой конечный автомат не может сказать, подобраны ли круглые скобки в выражении (с помощью насосной леммы для FSAs.)

Причина, которую необходимо узнать о FSAs, состоит в том, что они могут использоваться для решения многих проблем: сопоставление строк, управление систем, описаний бизнес-процесса, дизайна цифровой схемы. Они также по сути симпатичны.

Официально, FSA является алгебраической структурой F = 〈 Σ, S, s0, F, δ 〉, где Σ является входным алфавитом, S является рядом состояний, s0 ∈ S является конкретным начальным состоянием, F ⊆ S является рядом состояний принятия, и δ:S×Σ → S является функцией изменения состояния.

9
ответ дан 8 December 2019 в 02:18
поделиться

в терминах ООП: если у Вас есть объект с методами, что Вы обращаетесь к определенным событиям, и некоторые (другие) методы, которые имеют другое поведение в зависимости от предыдущих вызовов...., удивляют! у Вас есть конечный автомат!

теперь, если Вы знаете теорию, Вы не должны заново продумать все это. Вы просто говорите: "кусок пирога, это - просто конечный автомат", и продолжите реализовывать его.

если Вы не будете знать теорию, то Вы будете думать об этом некоторое время, записать некоторые умные взломы и получить что-то, что это трудно объяснить и зарегистрировать..., потому что у Вас нет слов для описания этого

6
ответ дан 8 December 2019 в 02:18
поделиться

Вам нужны конечные автоматы каждый раз, когда необходимо выпустить поток перед завершением операции.

Так как веб-сервисы часто не с сохранением информации, Вы обычно не видите это в веб-сервисах - Вы перестраиваете свой URL так, чтобы каждый URL соответствовал единственному пути через код.

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

Вы часто видите его когда вход обработки. Необходимо выпустить поток, прежде чем вход был все завершен, таким образом, Вы устанавливаете высказывание флага, "вводит происходящий" или что-то как этот. При выполнении Вы устанавливаете флаг на "ожидание входа". Тот флаг является Вашим монитором состояния.

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

Хорошая вещь о FSM состоит в том, что можно сделать состояние частью данных, а не кода. Предположите, что необходимо заполнить 1 000 объектов в базе данных. Входящие данные обратятся к одному из этих 1 000 объектов, но у Вас обычно нет достаточного количества данных для завершения операции.

Без FSM у Вас могли бы быть сотни потоков, ждущих остальную часть данных, таким образом, они могут завершить обработку и записать результаты в DB. С FSM Вы пишете состояние в DB, затем выходите из Вашего потока. В следующий раз можно проверить входящие данные, считать состояние из потока, и это должно дать Вам достаточно информации для определения что код работать.

Почти каждая операция FSM МОГЛА быть сделана путем выделения потока ему, но вероятно не также (Сложность умножается на основе количества состояний, тогда как с конечным автоматом повышение сложности более линейно). Кроме того, существуют некоторые концептуальные вопросы проектирования - исследование Вашего кода на государственном уровне в некоторых случаях намного легче, чем исследование его в строке уровня кода.

2
ответ дан 8 December 2019 в 02:18
поделиться

Хорошие ответы выше. Я только добавил бы, что FSA является, прежде всего, интеллектуальным инструментом, не методом программирования. То, что делает их полезными, у них есть хорошие свойства и что-либо, что действует как, у каждого есть те свойства. Если можно думать о чем-то как о FSA, существует много способов, которыми можно создать его:

  • как регулярное выражение

  • как таблица изменения состояния

  • как while-switch-on-state цикл

  • как goto-сеть (ужасы!)

  • как простой структурированный код программы

и т.д. и т.д.

Если кто-то говорит, что что-то - FSA, можно сразу знать то, что они говорят о, неважно, как он создается.

2
ответ дан 8 December 2019 в 02:18
поделиться

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

Типичным примером является игра AI, где NPCs имеют различные состояния, которые изменяются согласно тому, где плеер, что-то как:

  • NPC_STATE_IDLE
  • NPC_STATE_ALERT (плеер на уровне меньше чем 100 метров)
  • NPC_STATE_ENGAGE (игрок напал на NPC),
  • NPC_STATE_FLEE (низко на здоровье)

где FSM может описать легко переходы, и справка выполняют комплекс, рассуждающий о системе, которую описывает FSM.

2
ответ дан 8 December 2019 в 02:18
поделиться

Важный: Если Вы - "визуальный" ученик стиля, остановите все, что Вы делаете и переходите к этой ссылке... Прямо сейчас.

Если Вы - "визуальный" ученик, вот превосходная ссылка, которая дает очень доступное введение.

Reanimator Oliver Steele

Похоже, что Вы уже утвердили ответ, но если Вы цените "визуальное" введение в новые понятия, как распространено, действительно необходимо проверить ссылку. Это является просто выдающимся.

(Примечание: ссылка указывает на обсуждение DFA и NDFA в контексте регулярных выражений - с анимированными интерактивными диаграммами),

2
ответ дан 8 December 2019 в 02:18
поделиться

Да! Вы могли искать его!

http://en.wikipedia.org/wiki/Finite_state_machine

1
ответ дан 8 December 2019 в 02:18
поделиться

Тому, что это, лучше отвечают на других сайтах (таких как Википедия), потому что уже существуют довольно обширные ответы там.

Почему необходимо знать их: Поскольку Вы, вероятно, уже реализовали их.

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

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

1
ответ дан 8 December 2019 в 02:18
поделиться

Один объект, который не был упомянут до сих пор, является семантической эквивалентностью конечных автоматов и регулярных выражений. Регулярное выражение может быть скомпилировано в конечный автомат (это - то, как regex библиотеки работают), и наоборот.

1
ответ дан 8 December 2019 в 02:18
поделиться

FSAs являются большими структурами данных для понимания, потому что любой шанс, необходимо реализовать их, Вы работаете на самом низком уровне вычислительной сложности на иерархии Chomsky. Яркий пример находится в морфологии слова (как части слов объединяются). Большая работа была сделана, чтобы показать, что даже самые серьезные случаи могут быть проанализированы в этой чрезвычайно быстрой аналитической платформе. Смотрите на работу Karttunnen и Beesley из PARC.

FSAs являются также великолепным местом, чтобы начать узнавать о понятиях машинного обучения как скрытые модели Маркова, потому что во многих отношениях, проблема может быть сломана с помощью тех же идей и словаря.

1
ответ дан 8 December 2019 в 02:18
поделиться

FSA (включая DFA и NFA) очень важен для информатики, и они - использование во многих полях включая многие поля. Например, скрытые поля Маркова для распознавания речи также регулярные выражения преобразовываются в FSA, прежде чем они будут интерпретированы программным обеспечением и обработкой естественного языка (Обработка естественного языка), AI (игровое программирование), Робот, Программирующий и т.д.

Один из недостатка FSA, они являются обычно медленными и обычно твердыми реализовать и трудно понять или визуализировать при чтении кода, но они хороши, потому что они обычно предоставляют универсальные решения проблем, и они известны с большим количеством исследований FSA.

1
ответ дан 8 December 2019 в 02:18
поделиться
Другие вопросы по тегам:

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