KD-Trees
search algorithms
arbitrary metrics
computational geometry
data structures

Can I use arbitrary metrics to search KD-Trees?

Data Structures & Algorithms practice on Codemia

Step through 300+ coding interview problems with animated visualisers that show the data structure changing as the code runs. The Blind 75 are free.

Practice algorithms

Introduction

KD-Trees (K-Dimensional Trees) are a fundamental data structure for organizing points in a k-dimensional space. They are widely used for efficient nearest-neighbor searches, range queries, and spatial lookups. Typically, KD-Trees rely on the Euclidean distance metric. But what happens when you need a different distance function? This article examines when and how arbitrary metrics can be used with KD-Trees, what breaks when the metric does not match the tree's structure, and what alternatives exist.

How KD-Trees Work

A KD-Tree is a binary tree that recursively partitions space by splitting along one coordinate axis at a time. At depth dd, the tree splits on dimension d mod kd \bmod k. Each internal node stores a splitting value, and the two subtrees contain all points on either side of that split.

The key property that makes KD-Tree search efficient is pruning: during a nearest-neighbor search, entire subtrees can be skipped if the closest possible point in that subtree is farther than the current best candidate. This pruning relies on a tight relationship between the distance metric and the axis-aligned splits.

What Is a Metric?

A metric on a set XX is a function d:X×X→Rd: X \times X \rightarrow \mathbb{R} that satisfies four properties:

  1. Non-negativity: d(x,y)≥0d(x, y) \geq 0 for all x,y∈Xx, y \in X
  2. Identity of indiscernibles: d(x,y)=0  ⟺  x=yd(x, y) = 0 \iff x = y
  3. Symmetry: d(x,y)=d(y,x)d(x, y) = d(y, x) for all x,y∈Xx, y \in X
  4. Triangle inequality: d(x,z)≤d(x,y)+d(y,z)d(x, z) \leq d(x, y) + d(y, z) for all x,y,z∈Xx, y, z \in X

Common metrics include Euclidean distance (L2L_2), Manhattan distance (L1L_1), Chebyshev distance (L∞L_\infty), and the Minkowski family LpL_p.

Can You Use Arbitrary Metrics?

The short answer: you can use any LpL_p metric (Minkowski family) with KD-Trees and still get correct results with effective pruning. For metrics outside this family, correctness is preserved but pruning effectiveness degrades, sometimes severely.

Why LpL_p Metrics Work

The LpL_p distance between two points xx and yy in kk dimensions is:

dp(x,y)=(∑i=1k∣xi−yi∣p)1/pd_p(x, y) = \left(\sum_{i=1}^{k} |x_i - y_i|^p\right)^{1/p}

For any LpL_p metric, the distance from a query point to the nearest point in an axis-aligned region can be computed exactly using the per-dimension distances. This means the pruning bounds remain tight, and the search stays efficient.

Manhattan Distance (L1)

Manhattan distance sums the absolute differences along each axis:

d1(x,y)=∑i=1k∣xi−yi∣d_1(x, y) = \sum_{i=1}^{k} |x_i - y_i|

This metric works well with KD-Trees. The bounding regions are axis-aligned boxes, and the minimum distance from a point to a box can be computed by summing per-axis gaps. Pruning remains effective.

Custom Non-Lp Metrics

Consider a custom metric like:

d(x,y)=∣x1−y1∣p+∣x2−y2∣qd(x, y) = |x_1 - y_1|^p + |x_2 - y_2|^q

where p≠qp \neq q. This metric is valid (it satisfies all four metric properties for appropriate p,qp, q), but it does not decompose neatly along axes in the same way LpL_p metrics do. The pruning bounds become loose because the tree cannot tightly estimate the minimum distance to a subtree's bounding box.

The result: the search still returns correct answers (you can always fall back to exhaustive checking of non-pruned subtrees), but you lose the O(log⁡n)O(\log n) average-case performance. In the worst case, nearly every node is visited, making it no better than a brute-force scan.

Metrics That Break Pruning Entirely

Some valid metrics make KD-Tree pruning almost useless:

  • Weighted metrics with dimension-dependent weights that do not align with the split axes
  • Learned metrics from machine learning embeddings, such as Mahalanobis distance d(x,y)=(x−y)TM(x−y)d(x, y) = \sqrt{(x - y)^T M (x - y)} where MM is a positive-definite matrix
  • Edit distance or other non-geometric metrics applied to vectorized data

For these, consider alternative data structures.

Alternatives for Non-Euclidean Metrics

Data StructureBest ForKey Property
Ball TreeAny metric satisfying triangle inequalityPartitions using balls, not axis-aligned splits
VP-Tree (Vantage Point)General metric spacesOnly requires a distance function
Cover TreeLow intrinsic dimensionalityTheoretically optimal for doubling metrics
LSH (Locality-Sensitive Hashing)Approximate nearest neighborsSublinear time for high dimensions

Ball Trees and VP-Trees are the most common replacements when you need exact nearest neighbors with a non-Euclidean metric. They partition space using distance-based criteria rather than coordinate-axis splits, so their pruning remains effective as long as the triangle inequality holds.

Performance Comparison

MetricKD-Tree Pruning QualityRecommended Structure
Euclidean (L2L_2)ExcellentKD-Tree
Manhattan (L1L_1)GoodKD-Tree
Chebyshev (L∞L_\infty)GoodKD-Tree
Minkowski (LpL_p)GoodKD-Tree
MahalanobisPoorBall Tree or VP-Tree
Custom weightedPoor to moderateBall Tree
Non-geometric (edit distance)Not applicableVP-Tree or LSH

Common Pitfalls

  • Assuming that any valid metric will give good KD-Tree performance. Correctness and efficiency are separate concerns.
  • Forgetting that KD-Trees degrade in high dimensions regardless of metric (the "curse of dimensionality"). For k>20k > 20 or so, brute force or approximate methods often win.
  • Using a function that is not a true metric (violates triangle inequality) and expecting pruning to work. Without the triangle inequality, pruning can skip valid nearest neighbors and return wrong results.

Conclusion

KD-Trees work well with any LpL_p metric, not just Euclidean distance. For metrics outside the Minkowski family, KD-Trees still return correct results but lose their pruning advantage, often degrading to brute-force performance. When your metric does not align with axis-parallel splits, Ball Trees or VP-Trees are better choices because they partition space based on distance rather than coordinates.


Course
Intermediate
27 lessons
15 hours
DSA Fundamentals

Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.

View the course
Data Structures & Algorithms practice on Codemia

Step through 300+ coding interview problems with animated visualisers that show the data structure changing as the code runs. The Blind 75 are free.

Practice algorithms