Hi,
ich habe folgenden Algorithmus, der das Tanimoto Ähnlichkeitsmaß berechnet:
Problem sind IMHO die contains() Aufrufe. D.h. es wird für jeden Wert in der Gesamtliste (set) geprüft, ob der Wert in der ListeA (valuesA) oder der ListeB (valuesB) oder in beiden Listen vorkommt.
Ich vermute, dass die Suche mit contains sehr langsam ist. Könnte man das effizienter umsetzen?
Hier mein erster Verbesserungsvorschlag:
Könnte man das noch weiter optimieren?
ich habe folgenden Algorithmus, der das Tanimoto Ähnlichkeitsmaß berechnet:
Java:
private double calculateTanimoto(List<String> valuesA, List<String> valuesB) {
// create set union of all values
Set<String> set = new HashSet<String>();
set.addAll(valuesA);
set.addAll(valuesB);
// calc tanimoto parameters
double nA = 0;
double nB = 0;
double nAB = 0;
for(String s: set){
if(valuesA.contains(s)){
nA++;
}
if(valuesB.contains(s)){
nB++;
}
if(valuesA.contains(s) && valuesB.contains(s)){
nAB++;
}
}
// calc tanimoto
return ((nAB/(nA+nB-nAB)));
}
Problem sind IMHO die contains() Aufrufe. D.h. es wird für jeden Wert in der Gesamtliste (set) geprüft, ob der Wert in der ListeA (valuesA) oder der ListeB (valuesB) oder in beiden Listen vorkommt.
Ich vermute, dass die Suche mit contains sehr langsam ist. Könnte man das effizienter umsetzen?
Hier mein erster Verbesserungsvorschlag:
Java:
private double calculateTanimoto(List<String> valuesA, List<String> valuesB) {
// create set union of all values
Set<String> set = new HashSet<String>();
set.addAll(valuesA);
set.addAll(valuesB);
Set<String> setA = new HashSet<String>(); // set is faster than hashmap
setA.addAll(valuesA);
Set<String> setB = new HashSet<String>();
setB.addAll(valuesB);
// calc tanimoto parameters
int i=0;
double nA = 0;
double nB = 0;
double nAB = 0;
for(String s: set){
boolean inA = false;
boolean inB = false;
if(setA.contains(s)){
nA++;
inA = true;
}
if(setB.contains(s)){
nB++;
inB = true;
}
if(inA && inB){
nAB++;
}
i++;
}
// calc tanimoto
return ((nAB/(nA+nB-nAB)));
}
Könnte man das noch weiter optimieren?