Package elki.index.tree.spatial.kd
Class MemoryKDTree<O extends NumberVector>
- java.lang.Object
-
- elki.index.tree.spatial.kd.MemoryKDTree<O>
-
- Type Parameters:
O- Vector type
- All Implemented Interfaces:
DistancePriorityIndex<O>,Index,KNNIndex<O>,RangeIndex<O>
@Reference(authors="J. L. Bentley", title="Multidimensional binary search trees used for associative searching", booktitle="Communications of the ACM 18(9)", url="https://doi.org/10.1145/361002.361007", bibkey="DBLP:journals/cacm/Bentley75") public class MemoryKDTree<O extends NumberVector> extends java.lang.Object implements DistancePriorityIndex<O>
Implementation of a static in-memory K-D-tree.Reference:
J. L. Bentley
Multidimensional binary search trees used for associative searching
Communications of the ACM 18(9)The search uses an improved search strategy published by:
S. Arya and D. M. Mount
Algorithms for fast vector quantization
Proc. DCC '93: Data Compression ConferenceTODO: add support for weighted Minkowski distances.
- Since:
- 0.7.0
- Author:
- Erich Schubert
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private classMemoryKDTree.CountingRelationProxy to count accesses.static classMemoryKDTree.Factory<O extends NumberVector>Factory classstatic classMemoryKDTree.KDNodeKD tree node.classMemoryKDTree.KDTreeKNNSearcherkNN query for the k-d-tree.classMemoryKDTree.KDTreePrioritySearcherPriority search for the k-d-tree.classMemoryKDTree.KDTreeRangeSearcherRange query for the k-d-tree.private static classMemoryKDTree.PrioritySearchBranchSearch position for priority search.
-
Field Summary
Fields Modifier and Type Field Description protected intdimsThe number of dimensions.protected CounterdistcalcCounter for distance computations.protected intleafsizeMaximum size of leaf nodes.private static LoggingLOGClass loggerprotected CounterobjaccessCounter for comparisons.protected Relation<O>relationThe representation we are bound to.protected java.lang.ObjectrootRoot node (KDNode or IntIntPair)protected ArrayDBIDssortedThe actual "tree" as a sorted array.protected SplitStrategysplitSplit stragegy
-
Constructor Summary
Constructors Constructor Description MemoryKDTree(Relation<O> relation, int leafsize)Constructor with default split (used by EmpiricalQueryOptimizer).MemoryKDTree(Relation<O> relation, SplitStrategy split, int leafsize)Constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private booleanassertSplitConsistent(int left, int pos, int right, int dim, double val, DBIDArrayMIter iter)Assert that the generated split is consistent.java.lang.ObjectbuildTree(Relation<? extends NumberVector> relation, int left, int right, ArrayModifiableDBIDs sorted, DBIDArrayMIter iter, VectorUtil.SortDBIDsBySingleDimension comp)Build the k-d tree.protected voidcountDistanceComputation()Count a distance computation.protected voidcountObjectAccess()Count a single object access.voidinitialize()Initialize the index.KNNSearcher<O>kNNByObject(DistanceQuery<O> distanceQuery, int maxk, int flags)Get a KNN query object for the given distance query and k.voidlogStatistics()Send statistics to the logger, if enabled.PrioritySearcher<O>priorityByObject(DistanceQuery<O> distanceQuery, double maxrange, int flags)Get a priority search object.RangeSearcher<O>rangeByObject(DistanceQuery<O> distanceQuery, double maxrange, int flags)Get a range query object for the given distance query and k.-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface elki.index.DistancePriorityIndex
priorityByDBID
-
Methods inherited from interface elki.index.RangeIndex
rangeByDBID
-
-
-
-
Field Detail
-
LOG
private static final Logging LOG
Class logger
-
relation
protected final Relation<O extends NumberVector> relation
The representation we are bound to.
-
split
protected SplitStrategy split
Split stragegy
-
leafsize
protected int leafsize
Maximum size of leaf nodes.
-
sorted
protected ArrayDBIDs sorted
The actual "tree" as a sorted array.
-
root
protected java.lang.Object root
Root node (KDNode or IntIntPair)
-
dims
protected int dims
The number of dimensions.
-
objaccess
protected final Counter objaccess
Counter for comparisons.
-
distcalc
protected final Counter distcalc
Counter for distance computations.
-
-
Constructor Detail
-
MemoryKDTree
public MemoryKDTree(Relation<O> relation, int leafsize)
Constructor with default split (used by EmpiricalQueryOptimizer).- Parameters:
relation- Relation to indexleafsize- Leaf size
-
MemoryKDTree
public MemoryKDTree(Relation<O> relation, SplitStrategy split, int leafsize)
Constructor.- Parameters:
relation- Relation to indexsplit- Split strategyleafsize- Maximum size of leaf nodes
-
-
Method Detail
-
initialize
public void initialize()
Description copied from interface:IndexInitialize the index. For static indexes, this is the moment the index is bulk loaded.- Specified by:
initializein interfaceIndex
-
buildTree
public java.lang.Object buildTree(Relation<? extends NumberVector> relation, int left, int right, ArrayModifiableDBIDs sorted, DBIDArrayMIter iter, VectorUtil.SortDBIDsBySingleDimension comp)
Build the k-d tree.- Parameters:
relation- Relationleft- interval startright- interval endsorted- object idsiter- iterator on the idscomp- comparator on the values- Returns:
- root node
-
assertSplitConsistent
private boolean assertSplitConsistent(int left, int pos, int right, int dim, double val, DBIDArrayMIter iter)Assert that the generated split is consistent.- Parameters:
left- Interval startpos- Split positionright- Interval enddim- Split dimensionval- Split thresholditer- Iterator
-
logStatistics
public void logStatistics()
Description copied from interface:IndexSend statistics to the logger, if enabled.Note: you must have set the logging level appropriately before initializing the index! Otherwise, the index might not have collected the desired statistics.
- Specified by:
logStatisticsin interfaceIndex
-
countObjectAccess
protected void countObjectAccess()
Count a single object access.
-
countDistanceComputation
protected void countDistanceComputation()
Count a distance computation.
-
kNNByObject
public KNNSearcher<O> kNNByObject(DistanceQuery<O> distanceQuery, int maxk, int flags)
Description copied from interface:KNNIndexGet a KNN query object for the given distance query and k.This function MAY return null, when the given distance is not supported!
- Specified by:
kNNByObjectin interfaceDistancePriorityIndex<O extends NumberVector>- Specified by:
kNNByObjectin interfaceKNNIndex<O extends NumberVector>- Parameters:
distanceQuery- Distance querymaxk- Maximum value of kflags- Hints for the optimizer- Returns:
- KNN Query object or
null
-
rangeByObject
public RangeSearcher<O> rangeByObject(DistanceQuery<O> distanceQuery, double maxrange, int flags)
Description copied from interface:RangeIndexGet a range query object for the given distance query and k.This function MAY return null, when the given distance is not supported!
- Specified by:
rangeByObjectin interfaceDistancePriorityIndex<O extends NumberVector>- Specified by:
rangeByObjectin interfaceRangeIndex<O extends NumberVector>- Parameters:
distanceQuery- Distance querymaxrange- Maximum rangeflags- Hints for the optimizer- Returns:
- KNN Query object or
null
-
priorityByObject
public PrioritySearcher<O> priorityByObject(DistanceQuery<O> distanceQuery, double maxrange, int flags)
Description copied from interface:DistancePriorityIndexGet a priority search object.- Specified by:
priorityByObjectin interfaceDistancePriorityIndex<O extends NumberVector>- Parameters:
distanceQuery- Distance querymaxrange- Maximum search range (may beDouble.POSITIVE_INFINITYflags- Optimizer hints- Returns:
- Priority searcher
-
-