Общее доказательство эквивалентности двух FSMs в конечный промежуток времени?

Sergio:

необходимо использовать BLOB. Это довольно просто с JDBC.

проблемой со вторым кодом, который Вы отправили, является кодирование. Необходимо дополнительно закодировать байты для проверки ни одного в них сбои.

, Если Вы все еще хотите записать его в Строку, можно закодировать байты с помощью java.util. Base64.

Все еще необходимо использовать CLOB в качестве типа данных, потому что Вы не знаете, сколько времени сериализированные данные будут.

Вот образец того, как использовать его.

import java.util.*;
import java.io.*;

/** 
 * Usage sample serializing SomeClass instance 
 */
public class ToStringSample {

    public static void main( String [] args )  throws IOException,
                                                      ClassNotFoundException {
        String string = toString( new SomeClass() );
        System.out.println(" Encoded serialized version " );
        System.out.println( string );
        SomeClass some = ( SomeClass ) fromString( string );
        System.out.println( "\n\nReconstituted object");
        System.out.println( some );


    }

    /** Read the object from Base64 string. */
   private static Object fromString( String s ) throws IOException ,
                                                       ClassNotFoundException {
        byte [] data = Base64.getDecoder().decode( s );
        ObjectInputStream ois = new ObjectInputStream( 
                                        new ByteArrayInputStream(  data ) );
        Object o  = ois.readObject();
        ois.close();
        return o;
   }

    /** Write the object to a Base64 string. */
    private static String toString( Serializable o ) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream( baos );
        oos.writeObject( o );
        oos.close();
        return Base64.getEncoder().encodeToString(baos.toByteArray()); 
    }
}

/** Test subject. A very simple class. */ 
class SomeClass implements Serializable {

    private final static long serialVersionUID = 1; // See Nick's comment below

    int i    = Integer.MAX_VALUE;
    String s = "ABCDEFGHIJKLMNOP";
    Double d = new Double( -1.0 );
    public String toString(){
        return  "SomeClass instance says: Don't worry, " 
              + "I'm healthy. Look, my data is i = " + i  
              + ", s = " + s + ", d = " + d;
    }
}

Вывод:

C:\samples>javac *.java

C:\samples>java ToStringSample
Encoded serialized version
rO0ABXNyAAlTb21lQ2xhc3MAAAAAAAAAAQIAA0kAAWlMAAFkdAASTGphdmEvbGFuZy9Eb3VibGU7T
AABc3QAEkxqYXZhL2xhbmcvU3RyaW5nO3hwf////3NyABBqYXZhLmxhbmcuRG91YmxlgLPCSilr+w
QCAAFEAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cL/wAAAAAAAAdAAQQUJ
DREVGR0hJSktMTU5PUA==


Reconstituted object
SomeClass instance says: Don't worry, I'm healthy. Look, my data is i = 2147483647, s = ABCDEFGHIJKLMNOP, d = -1.0

ПРИМЕЧАНИЕ : для Java 7 и ранее Вы видите, что оригинал отвечает здесь

6
задан jldupont 31 October 2009 в 11:24
поделиться

2 ответа

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

Очистка моей памяти: в основном, существует уникальный минимальный DFA для данного DFA, и есть алгоритм минимизации, который всегда завершается. Сверните как A, так и B, и посмотрите, имеют ли они одинаковый минимальный DFA. Я не знаю сложности минимизации, хотя это не так уж плохо (я думаю, что это многочлен). Изоморфизм графов довольно сложно вычислить, но, поскольку есть специальный начальный узел, это может быть несколько проще. Если честно, вам может даже не потребоваться изоморфизм графов.

Но нет, вам никогда не нужно запускать DFA, просто анализируйте их структуру.

11
ответ дан 9 December 2019 в 20:46
поделиться

Предположим, у вас есть два конечных автомата с состояниями O ( n ). Затем вы можете создать автомат размера O ( n 2 ), который распознает только симметричное различие принимаемых языков. (Создайте конечный автомат, который имеет состояния, соответствующие паре состояний, по одному от каждого конечного автомата. Затем на каждом шаге обновляйте каждую часть пары одновременно. Состояние в новом автомате является состоянием принятия, если только одно из пары было состояние принятия.) Теперь минимизируйте этот автомат и посмотрите, совпадает ли он с тривиальным автоматом с одним состоянием, который все отвергает. Минимизация конечного автомата с состояниями m занимает время O ( m log m ), поэтому в целом вы можете сделать все за время O ( n 2 журнал n ).

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

1
ответ дан 9 December 2019 в 20:46
поделиться