Algoritmo per identificare le differenze tra due serie di dati ordinati

0

DICHIARAZIONE PROBLEMA : stampa gli elementi che differiscono tra i seguenti due gruppi di dati ordinati a sinistra e a destra:

A       A
B       C
C       D
D       E
G       F
H       EOF
EOF

La soluzione proposta dovrebbe essere stampata:

B E F G H

Ecco la mia implementazione basata sui dati di questo algoritmo in pseudo-codice. Sembra che produca i risultati desiderati, quindi le mie domande sono:

  • Ci sono dei difetti in termini di logica, efficienza o qualsiasi altra cosa che usi questo approccio?
  • Questo approccio si chiamerebbe progettazione basata sui dati o sarebbe classificato con un nome diverso?

Ecco lo pseudo-codice:

METHOD PRINT_DIFFERENCES
    LEFT_DATA_NOT_EOF = CALL READ_LEFT_RECORD()
    RIGHT_DATA_NOT_EOF = CALL READ_RIGHT_RECORD()

    WHILE LEFT_DATA_NOT_EOF AND RIGHT_DATA_NOT_EOF
        WHILE LEFT_DATA_NOT_EOF AND RIGHT_DATA_NOT_EOF AND LEFT_KEY IS LESS THAN RIGHT_KEY
            PRINT LEFT_KEY
            LEFT_DATA_NOT_EOF = CALL READ_LEFT_RECORD()
        LOOP

        WHILE LEFT_DATA_NOT_EOF AND RIGHT_DATA_NOT_EOF AND RIGHT_KEY IS LESS THAN LEFT_KEY
            PRINT RIGHT_KEY
            RIGHT_DATA_NOT_EOF = CALL READ_RIGHT_RECORD()
        LOOP

        WHILE LEFT_DATA_NOT_EOF AND RIGHT_DATA_NOT_EOF AND LEFT_KEY IS EQUAL TO RIGHT_KEY
            LEFT_DATA_NOT_EOF = CALL READ_LEFT_RECORD()
            RIGHT_DATA_NOT_EOF = CALL READ_RIGHT_RECORD()
        LOOP
    LOOP

    WHILE LEFT_DATA_NOT_EOF
        PRINT LEFT_KEY
        LEFT_DATA_NOT_EOF = CALL READ_LEFT_RECORD()
    LOOP

    WHILE RIGHT_DATA_NOT_EOF
        PRINT RIGHT_KEY
        RIGHT_DATA_NOT_EOF = CALL READ_RIGHT_RECORD()
    LOOP
METHOD END

METHOD READ_LEFT_RECORD
    RESULT = MOVE TO NEXT LEFT RECORD

    IF RESULT IS EQUAL TO TRUE THEN
        SET LEFT_KEY FROM CURRENT LEFT CURSOR    
    END IF

    RETURN RESULT
METHOD END

METHOD READ_RIGHT_RECORD
    RESULT = MOVE TO NEXT RIGHT RECORD

    IF RESULT IS EQUAL TO TRUE THEN
        SET RIGHT_KEY FROM CURRENT RIGHT CURSOR    
    END IF

    RETURN RESULT
METHOD END
    
posta Constantin 27.10.2017 - 14:12
fonte

1 risposta

3

Semplificherei

WHILE LEFT_DATA_NOT_EOF AND RIGHT_DATA_NOT_EOF
    IF LEFT_KEY IS LESS THAN RIGHT_KEY
        PRINT LEFT_KEY
        LEFT_DATA_NOT_EOF = CALL READ_LEFT_RECORD()

    ELSE IF RIGHT_KEY IS LESS THAN LEFT_KEY
        PRINT RIGHT_KEY
        RIGHT_DATA_NOT_EOF = CALL READ_RIGHT_RECORD()

    ELSE 
        LEFT_DATA_NOT_EOF = CALL READ_LEFT_RECORD()
        RIGHT_DATA_NOT_EOF = CALL READ_RIGHT_RECORD()
LOOP
    
risposta data 27.10.2017 - 16:09
fonte

Leggi altre domande sui tag