Il problema della corrispondenza delle sequenze è complicato, come posso suddividerlo in pezzi più piccoli?

0

Ho due liste:

1:

1) A abc
2) A def
3) A ghi
4) B jkl
5) B mno
6) C fzy
7) C xxa

2:

1) vsf
2) jkl
3) fzy
4) xxa
5) xyz
6) mno
7) def
8) abc

Sto cercando di abbinare ognuna delle sequenze continue dalla lista 1 - in questo caso ci sono due sequenze continue, A e B-- con la sua sequenza corrispondente nella lista 2 , con le seguenti regole:

  • La sequenza in 2 può essere discontinua
  • La sequenza in 2 può essere eseguita all'indietro o in avanti
  • Se non c'è una corrispondenza completa per 1 in 2 , deve essere restituita la corrispondenza parziale più lunga

Quindi le corrispondenze nel mio set di esempio, con la lista 1 abbinata alla lista 2, sono:

Sequence A: 
partial match
1 matches 8
2 matches 7

Sequence B:
discontinuous match
4 matches 2
5 matches 4

Sequence C:
continuous match
6 matches 3
7 matches 4

I set di dati sono in Excel, quindi ho intenzione di utilizzare VBA o C #.

Qualcuno può aiutarmi a suddividere questo problema in sottotask più semplici che devono essere eseguiti, in modo che sia più semplice scrivere l'applicazione?

So che normalmente è meglio per me mostrare del codice, ma ho problemi anche a capire un algoritmo pseudocodice come punto di partenza nel processo di progettazione.

EDIT:

Dopo averlo scritto, mi sono reso conto di aver dimenticato di includere una parte fondamentale del problema che lo rendeva più difficile: gli elenchi contengono valori non univoci. Ad esempio, potrebbe essere che il valore di lista 1 7 sia abc e l'elenco 2 il valore 4 sia abc , con lo stesso risultato di corrispondenza. Quindi dobbiamo abbinarli in base a sottosequenze comuni piuttosto che semplicemente facendo un join basato su valori individuali.

    
posta sigil 06.12.2017 - 11:18
fonte

1 risposta

1

Quindi, se ti unisci ai due elenchi sul valore che ottieni:

1)  A   abc 8)  abc
1)  A   abc 9)  abc --example non unique match
2)  A   def 7)  def
3)  A   ghi     
4)  B   jkl 2)  jkl
5)  B   mno 6)  mno
6)  C   fzy 3)  fzy
7)  C   xxa 4)  xxa

Se ora esegui il ciclo anche su questo elenco, controllando la quarta colonna per controllare se conta su o giù piuttosto che su E giù, dovresti ottenere il risultato.

Mi sembra che tu abbia un paio di casi ambigui che complicano il ciclo di conteggio. Altrimenti, devi solo controllare dove si trova la corrispondenza successiva a un ordinale maggiore o minore dell'ultima e mantenere un conteggio "alto" e "basso".

  • La sequenza include un elemento fuori servizio. Dovrebbe essere saltato lo stesso di un non match, o finisce la partita?

  • Un duplicato si verifica in sequenza, può essere saltato o il conteggio ricomincia da quel punto?

risposta data 06.12.2017 - 11:55
fonte

Leggi altre domande sui tag