n° 219
Novembre 2017
Dicembre 14, 2017, 06:56:17 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Distanza di editing e stampa delle operazioni effettuate  (Letto 1866 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
stev809
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 5


Mostra profilo E-mail
« inserita:: Agosto 29, 2017, 02:48:40 »

Ciao a tutti ho una brutta gatta da pelare.
Io ho trovato la distanza di editing tra due stringhe ma ora dovrei stampare quali operazioni sono state effettuate per modificare la prima stringa nella seconda.
Vi faccio un esempio :
tra "carota" e "cartone " la distanza di editing è 3  e le operazioni che la determinano sono;
scambio(4) dove 4 è la posizione della lettera 'o' che viene scambiata con la lettera successiva 't'.
sostituzine(6, n) 6 è la posizione in cui viene sostituita 'a' con 'n'
aggiunta(7,e) aggiunta del carattere 'e' in posizione 7

Premetto non devo implementare i metodi per eseguire queste operazioni ma devo stampare la loro avvenuta esecuzione

Spero che mi possiate aiutare in qualche modo

Ringrazio in anticipo
ciao
Registrato
mega_saiyan
Hero Member
*****

Karma: +16/-15
Scollegato Scollegato

Messaggi: 1036


Mostra profilo
« Risposta #1 inserita:: Settembre 14, 2017, 12:46:26 »

Non ho capito il tuo problema. Prova a mandare il codice o fornisci maggiori dettagli e cercheremo di aiutarti.
Registrato
stev809
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 5


Mostra profilo E-mail
« Risposta #2 inserita:: Settembre 29, 2017, 06:50:19 »

Ciao
il mio problema è quello di stampare a video oltre che la distanza di editing anche le operazioni effettuate, ad esempio se c'è stato una sostituzione di un carattere in posizione n la mia stamapa dovrà essere "sost(n)" o se
c'è stata una cancellazione in quella posizione "canc(n)"
Spero di essermi spigato meglio
Sono mesi che cerco di capire come fare ma non ci riesco
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #3 inserita:: Ottobre 10, 2017, 11:55:44 »

A me personalmente non è chiaro cosa intendi per "distanza di editing".  Occhi al cielo
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #4 inserita:: Ottobre 10, 2017, 05:47:43 »

A me personalmente non è chiaro cosa intendi per "distanza di editing".  Occhi al cielo

https://it.wikipedia.org/wiki/Distanza_di_Levenshtein
Registrato

michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #5 inserita:: Ottobre 11, 2017, 12:20:30 »

Ah cavolo è vero! I'm an idiot!
Non ci stavo pensando a quello...  Imbarazzato

Al solito come esempio "di base" - da modificare secondo le proprie esigenze - si può consultare RosettaCode:

https://rosettacode.org/wiki/Levenshtein_distance#Java

dove il codice mostrato fornisce questo output:

Citazione
distance(kitten, sitting) = 3
distance(saturday, sunday) = 3
distance(rosettacode, raisethysword) = 8
Registrato
stev809
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 5


Mostra profilo E-mail
« Risposta #6 inserita:: Ottobre 30, 2017, 08:28:07 »

Ciao
Rosettacode mi ha dato una grande mano devo dire .... solo che io ho bisogno non solo di calcolare la distanza
(di algoritmi in questo caso ce ne sono milioni) ma quello di cui ho bisogno è di stampare a video le operazioni che son state processate dall algoritmo e ,forse, quello di rosetta mi potrebbe aiutare basterebe scorrere l array che crea e vedere dove c è l incremento e analizzare che tipo di operazione è ma nel mio caso ho anche bisogno di conoscere il costo di scambio tra due caratteri che nell algoritmo non viene preso in considerazione.
Come potrei fare ?
Registrato
stev809
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 5


Mostra profilo E-mail
« Risposta #7 inserita:: Ottobre 31, 2017, 06:50:00 »

Allora dopo varie peripezie son giunto a questo punto
Codice:
package soluzione;

import java.util.ArrayList;
import java.util.Arrays;

public class DistanzaDiEditing {


private static int[][] matriceDiAdiacenza ;


public static String distanza(String str1,String str2){

String operazioni=" op: ";
int lunghezza1 = str1.length();
int lunghezza2 = str2.length();
matriceDiAdiacenza = new int[lunghezza1+1][lunghezza2+1];
int match;

/*riempimento della riga 0 della matrice di adiacenza*/
for(int i = 0 ; i <= lunghezza1 ; i++){
matriceDiAdiacenza[i][0]=i;
}
/*riempimento della colonna 0 della matrice di adiacenza*/
for(int j = 0 ; j <= lunghezza2 ;j++){
matriceDiAdiacenza[0][j]=j;
}
/*Calcolo della distanza tra tutte le sottosringhe delineate nella matrice*/

for(int i = 1 ; i <= lunghezza1 ;i++){
for( int j=1 ;j <= lunghezza2 ; j++){
//valuto se i caratteri son uguali
if(str1.charAt(i-1)==str2.charAt(j-1)){
match = 0;
}else{
match = 1;
}
matriceDiAdiacenza[i][j]=Math.min(matriceDiAdiacenza[i-1][j]+1// costo cancellazione
,Math.min(matriceDiAdiacenza[i][j-1]+1,//costo inserzione
matriceDiAdiacenza[i-1][j-1]+match));// costo sostituzione
if(i>1 && j>1 && str1.charAt(i-1)==str2.charAt(j-2)&&str1.charAt(i-2)==str2.charAt(j-1)){
matriceDiAdiacenza[i][j]= Math.min(matriceDiAdiacenza[i][j],matriceDiAdiacenza[i-2][j-2]+match);//costo scambio
}

// System.out.print(matriceDiAdiacenza[i-1][j-1]+"\t");
}


}
for(int i = 0 ; i < matriceDiAdiacenza.length ;i++){
for(int j=0 ;j <matriceDiAdiacenza[i].length ; j++){
System.out.print(matriceDiAdiacenza[i][j]+"\t");
}
// System.out.print(matriceDiAdiacenza[i][0]+"\n");
System.out.print("\n");
}
/    int k = 0;
   int h = 0;
for( k=1,h=1 ; k < matriceDiAdiacenza.length ;k++,h++){
//if(k>1 && h>1 && str1.charAt(k-1)==str2.charAt(h-2)&&str1.charAt(k-2)==str2.charAt(h-1))

if(matriceDiAdiacenza[k][h]== (matriceDiAdiacenza[k][h-1])){
  operazioni += "canc("+ k + ") ";
  if(k < matriceDiAdiacenza.length-1)
         k++;
       }
   
     
  } 
     

return matriceDiAdiacenza[lunghezza1][lunghezza2] +"\n" +operazioni;

}

}

ma ho dei problemi con la stampe delle operazioni
Codice:
   int k = 0;
   int h = 0;
for( k=1,h=1 ; k < matriceDiAdiacenza.length ;k++,h++){
//if(k>1 && h>1 && str1.charAt(k-1)==str2.charAt(h-2)&&str1.charAt(k-2)==str2.charAt(h-1))

if(matriceDiAdiacenza[k][h]== (matriceDiAdiacenza[k][h-1])){
  operazioni += "canc("+ k + ") ";
  if(k < matriceDiAdiacenza.length-1)
         k++;
       }
   
     
  } 
se per caso ci son più di 2 lettere in meno alla fine della seconda  stringa mi lancia un eccezione e mi sa che non è il modo giusto per stampare le operazioni
come faccio a percorrere tutta la matrice senza cascare in eccezioni e trovando quali operazioni son state effettuate ?
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #8 inserita:: Novembre 10, 2017, 01:53:24 »

L'eccezione cosa ti restituisce?
Forse dall'output si potrebbe risalire al problema.
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines