Fact-checked by Grok 2 weeks ago

Ball tree

A ball tree is a space-partitioning designed to organize and query points in a multi-dimensional , where each represents a hypersphere (or "ball") that encloses a of the data points, facilitating efficient nearest-neighbor searches and other geometric queries even in high dimensions. The structure forms a complete , with interior nodes defining the smallest ball that contains the balls of their two child nodes, while leaf nodes store the actual data points or references to them. Introduced by Stephen M. Omohundro in 1989 for applications in geometric learning tasks such as , , and , ball trees adapt to the underlying data distribution and support dynamic insertions and deletions, outperforming alternatives like k-d trees in high-dimensional settings by bounding distances more tightly via spherical regions rather than hyperrectangular ones. Construction algorithms vary, including on-line methods for incremental building, top-down recursive partitioning, and bottom-up clustering, with the latter often yielding the highest-quality trees at the cost of longer build times when evaluated on distributions like uniform, clustered, or curve-like data in 2D and 5D spaces. In modern implementations, such as the BallTree class in the library, it enables fast k-nearest neighbors queries, radius searches, and using customizable distance metrics like Minkowski or Haversine, with performance tuned by parameters such as leaf size to balance query speed and memory usage. Ball trees remain influential in spatial indexing and , particularly for datasets where dimensionality curse impacts linear scans or other tree structures.

Introduction

Definition and purpose

A ball tree is a for organizing points in a multi-dimensional , where each node represents a hypersphere—referred to as a "ball"—defined by a and that encloses a subset of the data points. Internal nodes partition the points into two child balls, forming a hierarchical nesting of bounding volumes, while nodes store the actual data points. This structure enables the representation of complex, non-uniform data distributions by adapting to the intrinsic geometry of the points rather than imposing a fixed . The primary purpose of a ball tree is to accelerate nearest-neighbor queries, such as k-nearest neighbors (k-NN) searches, in metric spaces by minimizing the number of distance computations required. It is particularly effective for high-dimensional data, where traditional structures like k-d trees suffer from the curse of dimensionality, leading to inefficient partitioning and searches as dimensions increase. Ball trees mitigate this by focusing on local , allowing for scalable performance in applications like , , and tasks involving large datasets. During searches, ball trees enable efficient pruning of irrelevant subtrees through the property of the underlying , which provides on s between the query point and points within a node's . If the bounds indicate that no points in a subtree can be closer than the current best candidates, that branch is skipped, drastically reducing the search space without examining every point. This bounding mechanism is key to the tree's efficiency in metric spaces, where s satisfy the . For illustration, consider a simple dataset of points scattered across a , such as positions representing locations. The root ball might enclose all points with a large hypersphere centered near the dataset's . This ball is then partitioned into two smaller, disjoint child balls—one covering a in the northwest and another in the southeast—each containing subsets of the points. Further subdivision continues until leaves hold individual points or small groups, demonstrating how the structure captures containment within nested balls while the points in child balls form disjoint subsets, though the bounding balls themselves may overlap, facilitating quick distance-based decisions.

Historical development

The ball tree data structure was first introduced by Stephen M. Omohundro in a series of technical reports from the International Computer Science Institute (ICSI) at the University of California, Berkeley, with the seminal work "Five Balltree Construction Algorithms" published in December 1989. This initial formulation focused on efficient approximate nearest-neighbor searches in geometric learning tasks, presenting multiple construction methods and evaluating their trade-offs in terms of build time and query performance. Omohundro's reports, spanning 1989 to early 1991, laid the groundwork for ball trees as a hierarchical structure using hyperspheres to partition data points, offering advantages over earlier axis-aligned methods for handling clustered or high-dimensional distributions. Ball trees evolved from foundational spatial indexing techniques, including kd-trees developed by Jon Louis Bentley in the 1970s for spaces via partitions, which often degrade in high dimensions due to the curse of dimensionality. They also draw parallels with vantage-point trees, introduced by Jeffrey K. Uhlmann in 1991 for general spaces by selecting a reference point and partitioning based on distance thresholds, though ball trees extend this by balancing subtrees with enclosing balls for more uniform splits. Unlike kd-trees, which rely on coordinate axes and perform poorly with non- metrics, ball trees support arbitrary metrics like or cosine distance, making them more versatile for applications in and database queries. Key advancements in the refined ball tree construction for better efficiency, particularly in high-dimensional settings. For instance, a 2006 study on efficient clustering and matching for demonstrated improved build algorithms using agglomerative methods to minimize enclosing radii, reducing query times in tasks. Around the same period, integrations into libraries accelerated adoption; scikit-learn incorporated BallTree in version 0.6 (released in December 2010), enabling scalable nearest-neighbor searches in Python-based workflows for tasks like and . These refinements addressed construction overhead, with bottom-up approaches from Omohundro's original work often favored for balancing speed and tree quality. As of 2025, ball trees remain a staple in and , valued for their adaptability to metric spaces and performance in moderate-to-high dimensions. They are widely implemented in Python libraries such as for nearest-neighbor algorithms, supporting applications from recommendation systems to geospatial analysis. Recent applications as of 2024 include integration in hierarchical transformers for large-scale sequence modeling and in for efficient retrieval. While early literature dominated pre-2010 citations, ongoing use in modern ML pipelines underscores their enduring relevance, though many foundational references predate recent optimizations in parallel and approximate variants.

Mathematical foundations

Metric spaces and hyperspheres

A is a set X equipped with a function d: X \times X \to [0, \infty) that satisfies three key axioms: non-negativity (d(x, y) \geq 0 for all x, y \in X, with d(x, y) = 0 if and only if x = y), symmetry (d(x, y) = d(y, x) for all x, y \in X), and the triangle inequality (d(x, z) \leq d(x, y) + d(y, z) for all x, y, z \in X). These properties ensure that the function behaves intuitively, enabling the measurement of separation between elements in a geometrically meaningful way. Metric spaces generalize and are foundational for structures like ball trees, where distances drive partitioning and querying. In a , a hypersphere, or more precisely a , serves as the core . The closed ball B(c, r) centered at c \in X with radius r \geq 0 is defined as the set \{x \in X \mid d(x, c) \leq r\}, encompassing all points within or on the boundary of the distance r from the center. The corresponding open ball uses strict inequality: \{x \in X \mid d(x, c) < r\}. In d-dimensional Euclidean space \mathbb{R}^d, these balls correspond to the standard Euclidean balls, which are the sets of points at distance at most r from the center under the Euclidean metric, bounded by hyperspheres, but the definition extends to arbitrary metrics without requiring vector structure or inner products. A key property of balls in metric spaces is the concept of the minimal enclosing ball for a finite point set P \subset X, which is the smallest-radius ball containing all points in P. In Euclidean spaces, this minimal enclosing ball can be computed efficiently using randomized incremental algorithms, such as Welzl's algorithm, which achieves expected linear time O(n) in the number of points n by iteratively building the ball from boundary points. This process relies on the Euclidean metric's properties to ensure the enclosing ball is unique and minimal, providing a tight bound for subsets of data. Balls are particularly relevant to data structures like ball trees because they enable hierarchical partitioning of point sets in Euclidean spaces, avoiding the axis-alignment constraints of bounding boxes in structures such as kd-trees. This flexibility allows ball trees to organize points into nested balls for efficient nearest-neighbor searches across diverse geometries.

Bounding volumes and partitioning

In ball trees, bounding volumes are balls, defined in a metric space by a center point and a radius that encloses all data points in the corresponding subtree. Each in the tree maintains such a ball, ensuring that the points assigned to that node and its descendants lie entirely within it. This hierarchical enclosure allows for efficient spatial partitioning by representing subsets of data with compact geometric primitives, facilitating rapid exclusion of irrelevant regions during queries. The partitioning strategy in ball trees involves recursively dividing the data points into two subsets, each associated with a child ball, while aiming to balance the sizes of the subtrees and minimize the radii (or volumes) of the resulting balls. This selection of split points or centers is guided by heuristics that prioritize compactness, as smaller bounding volumes enable more effective pruning in nearest-neighbor searches by reducing the overlap between non-relevant subtrees. For instance, one common heuristic seeks to minimize the total volume of all balls in the tree, which serves as a proxy for overall structure quality and query performance. Child balls in a ball tree are designed to cover their respective subsets without gaps, while the parent ball fully encloses both, with the child balls potentially overlapping to achieve tighter overall bounds. The parent ball is the minimal enclosing ball over the child balls, ensuring complete coverage via the properties of the metric space. This relationship guarantees that all points in the subtrees are contained within the parent ball, though the exact center and radius are computed accordingly, often using geometric algorithms in Euclidean space. A key trade-off in bounding volume design arises from the desire for small radii: tighter balls enhance query efficiency by allowing more aggressive pruning of distant subtrees, but they demand more computational effort during construction to identify optimal partitions that avoid excessive overlap or imbalance. For example, volume minimization heuristics, which pair or split points to reduce the enclosing ball's size, can yield superior trees for clustered data but at higher preprocessing costs compared to simpler median-based splits.

Construction

Top-down building algorithm

The top-down building algorithm constructs a ball tree by starting with all input points enclosed in a root ball and recursively partitioning the data into two subsets to form child nodes, continuing until each leaf node contains a small number of points, typically between 1 and 50, to balance tree depth and query efficiency. This recursive process ensures a binary tree structure where internal nodes represent hyperspheres (balls) enclosing their subtrees, facilitating efficient spatial partitioning in metric spaces. To select the split, the algorithm identifies the dimension exhibiting the maximum spread or variance among the points (or the centers of existing balls in the subset), then partitions the subset at the median value along that dimension to create roughly balanced child subsets of approximately equal size. This approach draws inspiration from construction but adapts it to minimize the volumes of the resulting child balls rather than strictly axis-aligned splits. For each node, the enclosing ball is computed by determining a center—often the centroid (arithmetic mean) of the points in the subset or an approximation to the geometric median—and setting the radius to the maximum distance from this center to any point in the subset, providing a tight but computationally efficient bound. Exact minimal enclosing balls can be used for optimality but are typically approximated with heuristics to reduce overhead, as the precise computation grows expensive with subset size. The overall time complexity of this construction is O(d n log n), where d is the data dimensionality and n is the number of points, arising from selecting the split dimension and finding medians across log n levels of recursion, with each level processing O(d n) work. Heuristics such as approximating enclosing balls via random sampling further accelerate the process in practice. In high-dimensional spaces, where the curse of dimensionality can degrade split quality, variants incorporate random projections or (PCA) to select effective split dimensions by reducing or transforming the data to lower-dimensional subspaces that capture principal variance. These techniques help maintain balanced partitions and tight bounds even when d exceeds 10 or 20.

Pseudocode for construction

The construction of a ball tree typically employs a recursive top-down partitioning algorithm that builds the tree by successively dividing subsets of points into child nodes until a leaf threshold is reached. This process defines hyperspheres (balls) for each node to enclose its associated points, facilitating efficient spatial queries. The algorithm selects a splitting dimension based on the dimension with maximum variance to balance the partitions, computes the median along that dimension for splitting, and then recursively constructs the subtrees before determining the enclosing ball for the current node. A subroutine for computing the enclosing ball of a set of points involves calculating the center as the centroid (mean) of the points and the radius as the maximum distance from the center to any point in the set, using the specified (e.g., ). This ensures the ball tightly bounds the points while allowing for pruning during queries. For edge cases, such as a single point, the radius is set to zero, creating a degenerate ball at that point; for uniform distributions where variance is equal across dimensions, a random dimension may be selected to avoid degeneracy and ensure balanced recursion. The following pseudocode outlines the recursive construction in a standard implementation, where points is a list or array of data points, depth tracks recursion level (optional for balancing), and leaf_size is a threshold (e.g., 20-50) to stop recursion and form leaves. The node structure includes center, radius, left_child, right_child, and for leaves, the list of indices to the points. Split selection uses heuristics like maximum variance, as detailed in the top-down building algorithm section.
function build_ball_tree(points, indices, depth=0, leaf_size=20):
    n = length(indices)
    if n <= leaf_size:
        # Create leaf [node](/page/Node)
        node = LeafNode()
        node.indices = indices
        node.center = compute_centroid(points, indices)
        if length(indices) > 1:
            node.radius = max(compute_distance(node.center, points[i]) for i in indices)
        else:
            node.radius = 0
        return node
    
    # Select split dimension: argmax over dimensions of variance(points[indices])
    variances = compute_variances(points, indices)
    split_dim = argmax(variances)
    
    # [Partition](/page/Partition) indices by [median](/page/Median) along split_dim
    median_val = [median](/page/Median)([points[i][split_dim] for i in indices])
    left_indices = [i for i in indices if points[i][split_dim] <= median_val]
    right_indices = [i for i in indices if points[i][split_dim] > median_val]
    
    # Handle [edge case](/page/Edge_case): if all points equal in split_dim, randomize split or choose another dim
    if length(left_indices) == 0 or length(right_indices) == 0:
        # Fallback: [random permutation](/page/Random_permutation) or alternative dim
        random.shuffle(indices)
        mid = n // 2
        left_indices = indices[:mid]
        right_indices = indices[mid:]
    
    # Recurse
    node = InternalNode()
    node.left_child = build_ball_tree(points, left_indices, depth + 1, leaf_size)
    node.right_child = build_ball_tree(points, right_indices, depth + 1, leaf_size)
    
    # Compute enclosing ball for this node
    all_subtree_indices = left_indices + right_indices  # Or union of subtree indices
    node.center = compute_centroid(points, all_subtree_indices)
    node.radius = max(compute_distance(node.center, points[i]) for i in all_subtree_indices)
    
    return node

function compute_centroid(points, indices):
    if length(indices) == 0:
        return None  # [Error](/page/Error) case
    sum_vec = sum(points[i] for i in indices)
    return sum_vec / length(indices)

# [Edge case](/page/Edge_case) in main function: for n == 1, [radius](/page/Radius) = 0 explicitly
This pseudocode assumes indices are used to avoid copying points data, improving in implementations; for a single point (n=1 ≤ leaf_size), the leaf is created with 0. The terminates at leaves to bound and space usage.

Query operations

Nearest-neighbor search procedure

The nearest-neighbor search procedure in a ball tree utilizes a branch-and-bound traversal to locate the k nearest neighbors of a query point within the dataset, exploiting the spherical bounding volumes to prune unpromising subtrees efficiently. In the KNS1 variant, the search initiates at the root node and proceeds recursively in a depth-first manner, always exploring the child node whose ball center is closer to first to quickly identify promising candidates. A global maintains the current set of k best points, prioritized by their distances to , enabling ongoing updates as closer points are discovered during traversal. Pruning is central to the efficiency of the procedure and relies on distance bounds derived from the in the underlying . A is skipped if its lower-bound distance to q—computed as max(0, d(q, center) - radius)—exceeds the current upper bound on the k-th nearest neighbor distance, ensuring no points in that subtree can improve the result. For child nodes, the closer ball (based on d(q, child_center)) is traversed before the farther one, further optimizing the order of exploration to refine the k-nearest set rapidly. Upon reaching a leaf node, exact distances are calculated from q to all points contained in the leaf ball, and the is updated by inserting any closer points while evicting the farthest if the set exceeds k elements. This step integrates new candidates into the max-heap structure of the k-nearest set, where the heap's maximum (the k-th distance) serves as the dynamic threshold for subsequent nodes. For exact k-nearest neighbor search, the procedure exhaustively visits all non- nodes until the entire tree is processed or eliminates all remaining branches, guaranteeing under the metric's properties. In contrast, approximate search variants allow early termination when the lower bounds of unexplored nodes exceed a user-defined search radius τ, balancing computational cost with result quality by limiting traversal depth. When k > 1, leverages the k-th from the max-heap as the threshold, tightening bounds progressively as better neighbors are found. Alternative implementations of the KNS1 variant employ a of nodes, ordered by their upper-bound distance to q (d(q, center) + ), to facilitate best-first traversal that dequeues and expands the most promising nodes ahead of others, particularly beneficial for approximate queries in high dimensions. The nearest-neighbor for a ball tree employs a best-first traversal using a to prioritize nodes based on their potential to contain nearer points to the query, enabling efficient of irrelevant subtrees. The search initializes a with the node, keyed by the lower bound distance from the query to the node's bounding ball, and maintains a separate structure for the k nearest results, updating the current () as better neighbors are found only after k are collected. occurs when a node's lower bound exceeds . This approach, rooted in branch-and-bound techniques, ensures exact k-nearest neighbors are retrieved without exhaustive search. The for traversal is implemented as a min-heap keyed by the lower bound (to facilitate popping the most promising—i.e., smallest potential min dist—node first). The results are tracked in a max-heap of size k (popping the farthest when exceeding k to retain the nearest). The algorithm terminates when the queue is empty or the dequeued node's lower bound meets or exceeds tau, ensuring no closer points remain unexplored.
pseudocode
function knn_search(root, q, k):
    # Initialize results: max-heap for k nearest distances/points (top is largest dist among k smallest)
    results = empty max-heap  # pairs (dist, point)
    [tau](/page/Tau) = [infinity](/page/Infinity)
    
    # Initialize traversal queue: min-heap keyed by lower bound (pop smallest lower first)
    [traversal_queue](/page/Queue) = empty min-heap  # pairs (lower_bound, [node](/page/Node))
    lower_root = max(0, [distance](/page/Distance)(q, root.center) - root.radius)
    push [traversal_queue](/page/Queue) (lower_root, root)
    
    while [traversal_queue](/page/Queue) not empty:
        (lower, [node](/page/Node)) = pop [traversal_queue](/page/Queue)  # pops [node](/page/Node) with smallest lower
        
        if lower >= [tau](/page/Tau):
            break  # all remaining [node](/page/Node)s have lower >= lower >= [tau](/page/Tau); done
        
        if [node](/page/Node) is [leaf](/page/Leaf):
            for point in [node](/page/Node).points:
                dist = [distance](/page/Distance)(q, point)
                if dist < [tau](/page/Tau):
                    push results (dist, point)
                    if size(results) > k:
                        pop results  # remove farthest
                # Update [tau](/page/Tau) after each addition (though batched update possible)
                if size(results) == k:
                    [tau](/page/Tau) = top(results).dist
                else:
                    [tau](/page/Tau) = [infinity](/page/Infinity)
        else:
            for child in [node](/page/Node).children:
                child_lower = max(0, [distance](/page/Distance)(q, child.center) - child.radius)
                if child_lower < [tau](/page/Tau):
                    push [traversal_queue](/page/Queue) (child_lower, child)
    
    return results  # k nearest points and distances
This pseudocode assumes a distance metric d satisfying the triangle inequality, with each node storing its center and radius. The traversal explores promising branches first, leveraging the lower bound \max(0, d(q, c) - r) for both prioritization and pruning: nodes with lower bound >= tau cannot contain points closer than the current k-th distance.

Properties and analysis

Time and space complexity

The of a ball tree is O(nd), where n is the number of points and d is the dimensionality, as the tree consists of O(n) forming a structure, with each internal storing a of size O(d), a scalar, and references to child , while explicitly store the points requiring O(nd) overall. Construction of a ball tree via the top-down algorithm incurs a of O(d n \log^2 n), arising from the recursive partitioning process across \log n levels, where each level involves selecting a splitting and evaluating potential splits (potentially O(d n \log n) overall due to computations), with enclosing balls for internal nodes derived from child balls in O(d) time. For querying, the worst-case time complexity is O(nd) for nearest-neighbor search on degenerate datasets where balls exhibit high overlap, forcing traversal of nearly all nodes and explicit distance computations to all points. In the average case for balanced trees in low dimensions, the query time is O(d \log n + k d) for k-nearest neighbors, reflecting O(\log n) nodes visited via branch-and-bound , each involving O(d) distance checks, plus O(k d) for evaluating and maintaining the k closest points. However, performance degrades in high dimensions due to increased ball overlap from the curse of dimensionality, leading to query times approaching linear scans for d > 20, where becomes ineffective as hypersphere boundaries lose discriminatory power. For k-nearest neighbor queries, additional space O(k) is required for a priority queue to track candidates, with heap maintenance adding O(\log k) time per insertion across the visited nodes.

Performance comparisons

Ball trees offer advantages over kd-trees in scenarios involving high intrinsic dimensionality or non-Euclidean metrics, such as angular distances, due to their use of hyperspheres that avoid axis-aligned partitioning, which can lead to inefficient splits in kd-trees for such data. However, kd-trees generally exhibit faster construction times, with empirical evaluations showing kd-tree building to be significantly quicker (e.g., 187 seconds versus 1,203 seconds for 10,000 points in 50 dimensions), though ball trees provide marginally slower but more balanced performance in query times for nearest-neighbor searches in high dimensions. In contrast, kd-trees degrade more severely in high dimensions due to the curse of dimensionality exacerbated by their Cartesian axis splits. Compared to vantage-point (VP) trees, ball trees employ geometric centers to define bounding hyperspheres, enabling tighter bounds and more effective pruning during searches, which can improve efficiency for certain metric spaces. VP-trees, however, excel in dynamic environments with frequent updates, as their single vantage-point partitioning allows easier insertions and deletions without full reconstruction, and empirical tests on datasets up to 9,000 points demonstrate VP-trees outperforming ball trees in query efficiency for larger scales, with sigmoid-modeled efficiency gains (α=1.25 versus 0.96 for ball trees). Empirical benchmarks from early studies, such as those evaluating approximate nearest-neighbor algorithms, and modern implementations like scikit-learn's BallTree, indicate 2-10x speedups over brute-force k-NN for datasets in 10-50 dimensions, with factors reaching up to 50x for 10,000 points in moderate dimensions during nearest-neighbor queries. These gains are particularly evident in applications like , where ball trees accelerate feature matching in high-dimensional descriptor spaces, and recommender systems, as seen in large-scale item similarity computations at platforms like . Ball trees adapt effectively to data distributions, including clustered ones, providing tighter bounds than axis-aligned structures like kd-trees, though can vary with the choice of construction algorithm. They also require modifications, such as hybrid approaches, for efficient queries, as pure ball tree may overlook boundary points. Ball trees are preferred for offline processing of static, high-dimensional datasets in tasks like k-NN , outperforming R-trees in non-spatial metric applications due to their metric flexibility, though R-trees remain superior for traditional / geographic queries.

References

  1. [1]
    [PDF] Five Balltree Construction Algorithms - Steve Omohundro
    Abstract. Balltrees are simple geometric data structures with a wide range of practical applica tions to geometric ·learning tasks.
  2. [2]
    BallTree — scikit-learn 1.7.2 documentation
    Compute the kernel density estimate at points X with the given kernel, using the distance metric specified at tree creation.Missing: structure | Show results with:structure
  3. [3]
    1.6. Nearest Neighbors — scikit-learn 1.7.2 documentation
    For high-dimensional parameter spaces, this method becomes less effective due to the so-called “curse of dimensionality”. The basic nearest neighbors ...
  4. [4]
    16: KD Trees - Cornell: Computer Science
    Ball-trees​​ The ball structure allows us to partition the data along an underlying manifold that our points are on, instead of repeatedly dissecting the entire ...Missing: definition | Show results with:definition
  5. [5]
    [PDF] Five Balltree Construction Algorithms | Semantic Scholar
    2014. TLDR. This paper explores a few simple approximate and probabilistic variants of two popular spatial data structures, the k-d tree and the ball tree ...
  6. [6]
    Five Balltree Construction Algorithms - ICSI Berkeley
    Five Balltree Construction Algorithms. Title, Five Balltree Construction Algorithms. Publication Type, Technical Report. Authors, Omohundro, S. Google Scholar ...Missing: introduction | Show results with:introduction
  7. [7]
    Ball Tree and KD Tree Algorithms - GeeksforGeeks
    Jul 23, 2025 · The Ball Tree forms a hierarchical structure with parent-child relationships. Each node in the tree has two child nodes, forming a binary tree. ...
  8. [8]
    [PDF] Efficient clustering and matching for object class recognition
    In this paper we address the problem of building object class representations ... In this section we compare the efficiency of the ball tree algorithm to ...
  9. [9]
    3.4. Nearest Neighbors — scikits.learn 0.7.1 documentation
    Behind the scenes, nearest neighbor search is done by the object BallTree, which is a fast way to perform neighbor searches in data sets of very high ...
  10. [10]
    [PDF] Metric Spaces - UC Davis Math
    A metric space is a set X that has a notion of the distance d(x, y) between every pair of points x, y ∈ X. The purpose of this chapter is to introduce metric ...
  11. [11]
    Smallest enclosing disks (balls and ellipsoids) - SpringerLink
    Jun 26, 2005 · A simple randomized algorithm is developed which computes the smallest enclosing disk of a finite set of points in the plane in expected linear time.Missing: original | Show results with:original
  12. [12]
    [PDF] Scikit-learn: Machine Learning in Python
    Source code, binaries, and documentation can be downloaded from http ... Five balltree construction algorithms. ICSI Technical Report TR-89-063, 1989 ...
  13. [13]
    [PDF] arXiv:1511.00628v1 [cs.DB] 2 Nov 2015
    Nov 2, 2015 · In this paper, we focus on building efficient metric-trees for euclidean dis- tances, also known as ball-trees. In a ball-tree, each internal ...
  14. [14]
    [PDF] Efficient Exact k-NN and Nonparametric Classification in High ...
    Abstract. This paper is about non-approximate acceleration of high dimensional nonparametric operations such as k nearest neighbor classifiers and the.
  15. [15]
    [PDF] Tailored Bregman Ball Trees for Effective Nearest Neighbors
    Mar 16, 2009 · Learn the tree branching factor (G-means). Explore nearest nodes first (priority queue). Handle symmetrized/mixed Bregman divergences. We ...
  16. [16]
    [PDF] Revitalizing Ball-Tree for Point-to-Hyperplane Nearest Neighbor ...
    Feb 21, 2023 · Tree, they usually maintain a bounding box to provide a lower bound ... Ball-Tree Structure Ball-Tree is a binary space partition tree.Missing: volumes | Show results with:volumes
  17. [17]
    [PDF] Performance Evaluation: Ball-Tree and KD-Tree in the context of MST
    Like kd-tree the ball tree also uses top down approach for building the tree recursively from top to down by choosing the split dimension and splitting ...Missing: seminal | Show results with:seminal
  18. [18]
    [PDF] Quantitative Comparison of Nearest Neighbor Search Algorithms
    Jul 11, 2023 · The paper compares the Orchard, ball tree, and VP-tree algorithms, which are used for nearest-neighbor searches in large datasets.
  19. [19]
    Benchmarking Nearest Neighbor Searches in Python
    Apr 29, 2013 · I recently submitted a scikit-learn pull request containing a brand new ball tree and kd-tree for fast nearest neighbor searches in python.
  20. [20]
    Medical Image Retrieval via Nearest Neighbor Search on Pre ...
    It uses triangle inequality to prune the ball and all data points within the ball while searching for nearest neighbors. Other tree-based approaches such as ...
  21. [21]
    Recommending items to more than a billion people
    Jun 2, 2015 · A ball tree is a binary tree where leafs contain some subset of item vectors, and each inner node defines a ball that surrounds all vectors ...
  22. [22]
    Enhancing K-nearest neighbor algorithm: a comprehensive review ...
    Aug 11, 2024 · The algorithm initiates from the root node, proceeds depth-first, and keeps a record of the k nearest points in a max-first priority queue.<|control11|><|separator|>
  23. [23]
    An Investigation of Practical Approximate Nearest Neighbor Algorithms
    An Investigation of Practical Approximate Nearest Neighbor Algorithms ... Marius MujaD. Lowe. Computer Science. VISAPP. 2009. TLDR. A system that answers the ...