2016-04-06 25 views
0

İki tane gibi bir nesne var: A = {o1, o2, o3, ... on}, B = {p1, p2, p3, ... pm} (m, n tanımlı) .Uzaklık matrisi uygulaması

A'dan B'ye nesneler arasındaki mesafeyi kaydetmek istiyorum: d (o1, p1), d (o1, p2) ..., d (o1, pm), d (o2, p1),. ... d (açık, pm).

ben o1 sipariş satırlarla bu mesafeyi depolamak için n satır xm sütunlu bir matris kullanmak ve sütunlar pm

için p1 sipariş Ama bir sorun böyle bir işlevi uygulamak istediğiniz olmasıdır için:

public double GetDistance (object obj1, object obj2) 

Örneğin, GetDistance (o1, p4) öğesini çağırırsam, tis: DistanceMatrix [0] [3] = 0.6 değerini döndürür.

Bu durumda, o1, p4 olmak üzere iki nesneden, matristeki karşılık gelen satır ve sütunun 0, 3 olduğunu (mesafeleri depolamak için matris kullanmak zorunda olduğumda) başvurabiliriz.

+0

İki listede ne tür nesneler var? Onlar keyfi Nesneler mi? Yoksa her zaman başka bir sınıfın veya arayüzün bir örneğidir? –

+0

Aslında, obj1 ve obj2, Euclidean kullanarak mesafeyi hesaplayabileceğim iki vektördür. – nd07

cevap

1

Sen anahtarları nesnelerdir HashMap<object, Integer> pMap and oMap, ve değerini sütun veya satırın endeksi kullanabilirsiniz:

Object[] A = //{o1, o2, o3, o4, ... on}; 
Object[] B = //{p1, p2, p3, p4, ... pm}; 
HashMap<Object, Integer> oMap = new HashMap<Object, Integer>(); 
HashMap<Object, Integer> pMap = new HashMap<Object, Integer>(); 

for(int i = 0 ; i < A.length ; i++) { 
    Object o = A[i]; 
    oMap.add(o, i); 
} 

for(int i = 0 ; i < B.length ; i++) { 
    Object p = B[i]; 
    pMap.add(p, i); 
} 

Ve şimdi size mesafe matrisi inşa edebilirsiniz ve birlikte değerlere erişir:

public double GetDistance (object obj1, object obj2) { 
    //double[][] d = distanceMatrix; 
    return d[oMap.get(objt1)][pMap.get(objt2)]; 
} 
+0

Eğer LinkedHasMap'i (anahtar, değer) çiftlerini kaydetmeye başladığımı farzedersem, sanırım hafıza maliyetini bu haktan daha mı koruyacak? Peki performans nasıl (zamanlama), hangi yol daha iyi? – nd07