OSDN Git Service

66ccaa105340aa9aa568755e8b47dc0b4119b54e
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / birthmarks / comparators / ExtendedEditDistanceBirthmarkComparator.java
1 package jp.sourceforge.stigmata.birthmarks.comparators;
2
3 /*
4  * $Id$
5  */
6
7 import jp.sourceforge.stigmata.Birthmark;
8 import jp.sourceforge.stigmata.BirthmarkElement;
9 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
10
11 /**
12  * calculate similarities between two birthmarks by edit distance
13  * algorithm (levenshtein distance).
14  *
15  * @author Haruaki TAMADA
16  * @version $Revision$ 
17  */
18 public class ExtendedEditDistanceBirthmarkComparator extends EditDistanceBirthmarkComparator{
19     public ExtendedEditDistanceBirthmarkComparator(BirthmarkSpi spi){
20         super(spi);
21     }
22
23     public double compare(Birthmark b1, Birthmark b2) {
24         if(!b1.getType().equals(b2.getType())){
25             return Double.NaN;
26         }
27
28         BirthmarkElement[] element1 = b1.getElements();
29         BirthmarkElement[] element2 = b2.getElements();
30         int[][] distance = createDistanceMatrics(element1, element2);
31
32         int length = element1.length;
33         if(length > element2.length){
34             length = element2.length;
35         }
36         int d = distance[element1.length][element2.length];
37
38         return (double)(1 - (d + Math.abs(element1.length - element2.length))) / length;
39     }
40 }