diff options
author | Erich Schubert <erich@debian.org> | 2013-10-29 20:02:37 +0100 |
---|---|---|
committer | Andrej Shadura <andrewsh@debian.org> | 2019-03-09 22:30:37 +0000 |
commit | ec7f409f6e795bbcc6f3c005687954e9475c600c (patch) | |
tree | fbf36c0ab791c556198b487ca40ae56ae5ab1ee5 /src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/strategies/split/MLBDistSplit.java | |
parent | 974d4cf6d54cadc06258039f2cd0515cc34aeac6 (diff) | |
parent | 8300861dc4c62c5567a4e654976072f854217544 (diff) |
Import Debian changes 0.6.0~beta2-1
elki (0.6.0~beta2-1) unstable; urgency=low
* New upstream beta release.
* 3DPC extension is not yet included.
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/strategies/split/MLBDistSplit.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/strategies/split/MLBDistSplit.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/strategies/split/MLBDistSplit.java b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/strategies/split/MLBDistSplit.java new file mode 100644 index 00000000..d294d5b3 --- /dev/null +++ b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/strategies/split/MLBDistSplit.java @@ -0,0 +1,95 @@ +package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.strategies.split; + +/* + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures + + Copyright (C) 2013 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +import de.lmu.ifi.dbs.elki.database.ids.DBID; +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; +import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeEntry; +import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; + +/** + * Encapsulates the required methods for a split of a node in an M-Tree. The + * routing objects are chosen according to the M_LB_DIST strategy. + * + * Reference: + * <p> + * P. Ciaccia, M. Patella, P. Zezula<br /> + * M-tree: An Efficient Access Method for Similarity Search in Metric Spaces<br /> + * In Proceedings of 23rd International Conference on Very Large Data Bases + * (VLDB'97), August 25-29, 1997, Athens, Greece + * </p> + * + * @author Elke Achtert + * + * @param <O> the type of DatabaseObject to be stored in the M-Tree + * @param <D> the type of Distance used in the M-Tree + * @param <N> the type of AbstractMTreeNode used in the M-Tree + * @param <E> the type of MetricalEntry used in the M-Tree + */ +@Reference(authors = "P. Ciaccia, M. Patella, P. Zezula", title = "M-tree: An Efficient Access Method for Similarity Search in Metric Spaces", booktitle = "VLDB'97, Proceedings of 23rd International Conference on Very Large Data Bases, August 25-29, 1997, Athens, Greece", url = "http://www.vldb.org/conf/1997/P426.PDF") +public class MLBDistSplit<O, D extends NumberDistance<D, ?>, N extends AbstractMTreeNode<O, D, N, E>, E extends MTreeEntry> extends MTreeSplit<O, D, N, E> { + /** + * Creates a new split object. + */ + public MLBDistSplit() { + super(); + } + + /** + * Selects the second object of the specified node to be promoted and stored + * into the parent node and partitions the entries according to the M_LB_DIST + * strategy. + * <p/> + * This strategy considers all possible pairs of objects and chooses the pair + * of objects for which the distance is maximum. + * + * @param tree Tree to use + * @param node the node to be split + */ + @Override + public Assignments<E> split(AbstractMTree<O, D, N, E, ?> tree, N node) { + DBID firstPromoted = null; + DBID secondPromoted = null; + + // choose first and second routing object + double currentMaxDist = 0.; + for (int i = 0; i < node.getNumEntries(); i++) { + DBID id1 = node.getEntry(i).getRoutingObjectID(); + for (int j = i + 1; j < node.getNumEntries(); j++) { + DBID id2 = node.getEntry(j).getRoutingObjectID(); + + double distance = tree.distance(id1, id2).doubleValue(); + if (distance >= currentMaxDist) { + firstPromoted = id1; + secondPromoted = id2; + currentMaxDist = distance; + } + } + } + + return balancedPartition(tree, node, firstPromoted, secondPromoted); + } +} |