diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabTreeNode.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabTreeNode.java | 44 |
1 files changed, 17 insertions, 27 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabTreeNode.java b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabTreeNode.java index b09ac314..1942a78b 100644 --- a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabTreeNode.java +++ b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabTreeNode.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mktrees.mktab; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2012 + Copyright (C) 2013 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -23,13 +23,8 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mktrees.mktab; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import java.util.ArrayList; -import java.util.List; - import de.lmu.ifi.dbs.elki.database.ids.DBID; -import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery; -import de.lmu.ifi.dbs.elki.distance.DistanceUtil; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; +import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTree; import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTreeNode; @@ -43,8 +38,8 @@ import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTreeNode; * @param <O> object type * @param <D> distance type */ -class MkTabTreeNode<O, D extends Distance<D>> extends AbstractMTreeNode<O, D, MkTabTreeNode<O, D>, MkTabEntry<D>> { - private static final long serialVersionUID = 1; +class MkTabTreeNode<O, D extends NumberDistance<D, ?>> extends AbstractMTreeNode<O, D, MkTabTreeNode<O, D>, MkTabEntry> { + private static final long serialVersionUID = 2; /** * Empty constructor for Externalizable interface. @@ -68,22 +63,17 @@ class MkTabTreeNode<O, D extends Distance<D>> extends AbstractMTreeNode<O, D, Mk * Determines and returns the knn distance of this node as the maximum knn * distance of all entries. * - * @param distanceFunction the distance function * @return the knn distance of this node */ - protected List<D> kNNDistances(DistanceQuery<O, D> distanceFunction) { - int k = getEntry(0).getK_max(); + protected double[] kNNDistances() { + int k = getEntry(0).getKnnDistances().length; - List<D> result = new ArrayList<D>(); - for(int i = 0; i < k; i++) { - result.add(distanceFunction.nullDistance()); - } + double[] result = new double[k]; - for(int i = 0; i < getNumEntries(); i++) { - for(int j = 0; j < k; j++) { - MkTabEntry<D> entry = getEntry(i); - D kDist = result.remove(j); - result.add(j, DistanceUtil.max(kDist, entry.getKnnDistance(j + 1))); + for (int i = 0; i < getNumEntries(); i++) { + for (int j = 0; j < k; j++) { + MkTabEntry entry = getEntry(i); + result[j] = Math.max(result[j], entry.getKnnDistance(j + 1)); } } @@ -91,10 +81,10 @@ class MkTabTreeNode<O, D extends Distance<D>> extends AbstractMTreeNode<O, D, Mk } @Override - public void adjustEntry(MkTabEntry<D> entry, DBID routingObjectID, D parentDistance, AbstractMTree<O, D, MkTabTreeNode<O, D>, MkTabEntry<D>> mTree) { + public void adjustEntry(MkTabEntry entry, DBID routingObjectID, double parentDistance, AbstractMTree<O, D, MkTabTreeNode<O, D>, MkTabEntry, ?> mTree) { super.adjustEntry(entry, routingObjectID, parentDistance, mTree); // adjust knn distances - entry.setKnnDistances(kNNDistances(mTree.getDistanceQuery())); + entry.setKnnDistances(kNNDistances()); } /** @@ -106,12 +96,12 @@ class MkTabTreeNode<O, D extends Distance<D>> extends AbstractMTreeNode<O, D, Mk * @param mTree the underlying M-Tree */ @Override - protected void integrityCheckParameters(MkTabEntry<D> parentEntry, MkTabTreeNode<O, D> parent, int index, AbstractMTree<O, D, MkTabTreeNode<O, D>, MkTabEntry<D>> mTree) { + protected void integrityCheckParameters(MkTabEntry parentEntry, MkTabTreeNode<O, D> parent, int index, AbstractMTree<O, D, MkTabTreeNode<O, D>, MkTabEntry, ?> mTree) { super.integrityCheckParameters(parentEntry, parent, index, mTree); // test knn distances - MkTabEntry<D> entry = parent.getEntry(index); - List<D> knnDistances = kNNDistances(mTree.getDistanceQuery()); - if(!entry.getKnnDistances().equals(knnDistances)) { + MkTabEntry entry = parent.getEntry(index); + double[] knnDistances = kNNDistances(); + if (!entry.getKnnDistances().equals(knnDistances)) { String soll = knnDistances.toString(); String ist = entry.getKnnDistances().toString(); throw new RuntimeException("Wrong knnDistances in node " + parent.getPageID() + " at index " + index + " (child " + entry + ")" + "\nsoll: " + soll + ",\n ist: " + ist); |