Алгоритм Маркова
- import java.util.ArrayList;
- public class AlgorithmMarkov {
- public static void main(String[] args) {
- /* Исходные данные */
- // Слово
- String P = "213022";
- // Правила подстановки
- ArrayList<Replacement> rules = new ArrayList<>();
- rules.add(new Replacement("~0", "00~"));
- rules.add(new Replacement("~1", "01~"));
- rules.add(new Replacement("~2", "10~"));
- rules.add(new Replacement("~3", "11~"));
- rules.add(new Replacement("~", "", true)); // заключительная подстановка
- rules.add(new Replacement("", "~"));
- /* Реализация */
- int step = 0;
- boolean iterate = true;
- // Ограничение на 1000 итераций
- while(iterate && (step < 1000)) {
- String pref = P;
- for (int i = 0; i < rules.size(); i++) {
- Replacement current = rules.get(i);
- String replaceString = replaceFirst(P, current);
- // Если что-то изменилось в слове, то начинаем цикл заново с полученным словом
- if (!replaceString.equals(P)) {
- P = replaceString;
- step++;
- // Если произошла заключительная подстановка - выходим
- if (current.endless) iterate = false;
- break;
- }
- }
- if (pref.equals(P)) break; // Если ни одно правило не изменило слово - выходим
- System.out.println(step+" P=\""+P+"\"");
- }
- }
- private static String replaceFirst(String str, Replacement replace) {
- // Если заменяем пустой символ на что-то, то склеиваем что-то со словом.
- if (replace.from.length() == 0) return replace.to+str;// _ -> *
- // Заменяем первое вхождение
- return str.replaceFirst(replace.from, replace.to);
- }
- private static class Replacement {
- /* Что на что заменять */
- private String from, to;
- /* Заключительная подстановка */
- private boolean endless;
- private Replacement(String from, String to) {
- this(from, to, false);
- }
- private Replacement(String from, String to, boolean endless) {
- this.from = from;
- this.to = to;
- this.endless = endless;
- }
- }
- }
Пример перевода числа из четверичной системы счисления в двоичную с использованием нормального алгоритма Маркова.
Можно добавлять свои правила и менять исходные данные. Только в правилах подстановки не следует юзать регулярные символы, такие как *
Можно добавлять свои правила и менять исходные данные. Только в правилах подстановки не следует юзать регулярные символы, такие как *