Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Weight-balanced tree

From Wikipedia, the free encyclopedia
Self-balancing binary search tree
For other uses, seeOptimal binary search tree.
Weight-balanced tree
TypeTree
Invented1972
Invented byde:Jürg Nievergelt andEdward Reingold
Complexities inbig O notation
Space complexity
SpaceO(n){\displaystyle O(n)}
Time complexity
FunctionAmortizedWorst case
SearchO(logn){\displaystyle O(\log n)}O(logn){\displaystyle O(\log n)}
InsertO(logn){\displaystyle O(\log n)}O(logn){\displaystyle O(\log n)}
DeleteO(logn){\displaystyle O(\log n)}O(logn){\displaystyle O(\log n)}

Incomputer science,weight-balanced binary trees (WBTs) are a type ofself-balancing binary search trees that can be used to implementdynamic sets,dictionaries (maps) and sequences.[1] These trees were introduced by Nievergelt and Reingold in the 1970s astrees of bounded balance, orBB[α] trees.[2][3] Their more common name is due toKnuth.[4]

A well known example is aHuffman coding of acorpus.

Like other self-balancing trees, WBTs store bookkeeping information pertaining to balance in their nodes and performrotations to restore balance when it is disturbed by insertion or deletion operations. Specifically, each node stores the size of the subtree rooted at the node, and the sizes of left and right subtrees are kept within some factor of each other. Unlike the balance information inAVL trees (using information about the height of subtrees) andred–black trees (which store a fictional "color" bit), the bookkeeping information in a WBT is an actually useful property for applications: the number of elements in a tree is equal to the size of its root, and the size information is exactly the information needed to implement the operations of anorder statistic tree, viz., getting then'th largest element in a set or determining an element's index in sorted order.[5]

Weight-balanced trees are popular in thefunctional programming community and are used to implement sets and maps inMIT Scheme,SLIB,SML-NJ, and implementations ofHaskell.[6][4]

Description

[edit]

A weight-balanced tree is a binary search tree that stores the sizes of subtrees in the nodes. That is, a node has fields

  • key, of any ordered type
  • value (optional, only for mappings)
  • left,right, pointer to node
  • size, of type integer.

By definition, the size of a leaf (typically represented by anil pointer) is zero. The size of an internal node is the sum of sizes of its two children, plus one: (size[n] = size[n.left] + size[n.right] + 1). Based on the size, one defines the weight to beweight[n] = size[n] + 1.[a] Weight has the advantage that the weight of a node is simply the sum of the weights of its left and right children.

Binary tree rotations.

Operations that modify the tree must make sure that the weight of the left and right subtrees of every node remain within some factorα of each other, using the samerebalancing operations used inAVL trees: rotations and double rotations. Formally, node balance is defined as follows:

A node isα-weight-balanced ifweight[n.left] ≥ α·weight[n] andweight[n.right] ≥ α·weight[n].[7]

Here,α is a numerical parameter to be determined when implementing weight balanced trees. Larger values ofα produce "more balanced" trees, but not all values ofα are appropriate; Nievergelt and Reingold proved that

α<1220.29289{\displaystyle \alpha <1-{\frac {\sqrt {2}}{2}}\approx 0.29289}

is a necessary condition for the balancing algorithm to work. Later work showed a lower bound of211 forα, although it can be made arbitrarily small if a custom (and more complicated) rebalancing algorithm is used.[7]

Applying balancing correctly guarantees a tree ofn elements will have height[7]

hlog11αn=log2nlog2(11α)=O(logn){\displaystyle h\leq \log _{\frac {1}{1-\alpha }}n={\frac {\log _{2}n}{\log _{2}\left({\frac {1}{1-\alpha }}\right)}}=O(\log n)}

Ifα is given its maximum allowed value, the worst-case height of a weight-balanced tree is the same as that of a red–black tree at2log2n{\displaystyle 2\log _{2}n}.

The number of balancing operations required in a sequence ofn insertions and deletions is linear inn, i.e., balancing takes a constant amount of overhead in anamortized sense.[8]

While maintaining a tree with the minimum search cost requires four kinds of double rotations (LL, LR, RL, RR as in an AVL tree) in insert/delete operations, if we desire only logarithmic performance, LR and RL are the only rotations required in a single top-down pass.[9]

Set operations and bulk operations

[edit]

Several set operations have been defined on weight-balanced trees:union,intersection andset difference. Then fastbulk operations on insertions or deletions can be implemented based on these set functions. These set operations rely on two helper operations,Split andJoin. With the new operations, the implementation of weight-balanced trees can be more efficient and highly-parallelizable.[10][11]

Join
The functionJoin is on two weight-balanced treest1 andt2 and a keyk and will return a tree containing all elements int1,t2 as well ask. It requiresk to be greater than all keys int1 and smaller than all keys int2. If the two trees have the balanced weight,Join simply create a new node with left subtreet1, rootk and right subtreet2. Suppose thatt1 has heavier weight thant2 (the other case is symmetric).Join follows the right spine oft1 until a nodec which is balanced witht2. At this point a new node with left childc, root k and right childt2 is created to replace c. The new node may invalidate the weight-balanced invariant. This can be fixed with a single or a double rotation assumingα<112{\displaystyle \alpha <1-{\frac {1}{\sqrt {2}}}}
Split
To split a weight-balanced tree into two smaller trees, those smaller than keyx, and those larger than keyx, first draw a path from the root by insertingx into the tree. After this insertion, all values less thanx will be found on the left of the path, and all values greater thanx will be found on the right. By applyingJoin, all the subtrees on the left side are merged bottom-up using keys on the path as intermediate nodes from bottom to top to form the left tree, and the right part is symmetric. For some applications,Split also returns a Boolean value denoting ifx appears in the tree. The cost ofSplit isO(logn){\displaystyle O(\log n)}, order of the height of the tree. This algorithm actually has nothing to do with any special properties of a weight-balanced tree, and thus is generic to other balancing schemes such asAVL trees.

The join algorithm is as follows:

function joinRightWB(TL, k, TR)    (l, k', c) = expose(TL)if balance(|TL|, |TR|)return Node(TL, k, TR)else         T' = joinRightWB(c, k, TR)        (l', k', r') = expose(T')if (balance(|l|,|T'|))return Node(l, k', T')else if (balance(|l|,|l'|) and balance(|l|+|l'|,|r'|))return rotateLeft(Node(l, k', T'))elsereturn rotateLeft(Node(l, k', rotateRight(T'))function joinLeftWB(TL, k, TR)    /* symmetric to joinRightWB */function join(TL, k, TR)if (heavy(TL, TR))return joinRightWB(TL, k, TR)if (heavy(TR, TL))return joinLeftWB(TL, k, TR)    Node(TL, k, TR)

Here balance(x,y){\displaystyle (x,y)} means two weightsT andT are balanced. expose(v)=(l, k, r) means to extract a tree nodeT's left childT, the key of the nodeT and the right childT. Node(l, k, r) means to create a node of left childT, keyT and right childT.

The split algorithm is as follows:

function split(T, k)if (T = nil)return (nil, false, nil)    (L, (m, c), R) = expose(T)if (k = m)return (L, true, R)if (k < m)        (L', b, R') = split(L, k)return (L', b, join(R', m, R))if (k > m)        (L', b, R') = split(R, k)return (join(L, m, L'), b, R))

The union of two weight-balanced treest1 andt2 representing setsA andB, is a weight-balanced treet that representsAB. The following recursive function computes this union:

function union(t1, t2):if t1 = nil:return t2if t2 = nil:return t1    t<, t> ← split t2 on t1.rootreturn join(union(left(t1), t<), t1.root, union(right(t1), t>))

Here,Split is presumed to return two trees: one holding the keys less than its input key, the other holding the greater keys. (The algorithm isnon-destructive, but an in-place destructive version exists as well.)

The algorithm for intersection or difference is similar, but requires theJoin2 helper routine that is the same asJoin but without the middle key. Based on the new functions for union, intersection or difference, either one key or multiple keys can be inserted to or deleted from the weight-balanced tree. SinceSplit andUnion callJoin but do not deal with the balancing criteria of weight-balanced trees directly, such an implementation is usually called thejoin-based algorithms.

The complexity of each of union, intersection and difference isO(mlog(nm+1)){\displaystyle O\left(m\log \left({n \over m}+1\right)\right)} for two weight-balanced trees of sizesT andn(m){\displaystyle n(\geq m)}. This complexity is optimal in terms of the number of comparisons. More importantly, since the recursive calls to union, intersection or difference are independent of each other, they can be executedin parallel with aparallel depthO(logmlogn){\displaystyle O(\log m\log n)}.[10] Whenm=1{\displaystyle m=1}, the join-based implementation has the same computationaldirected acyclic graph (DAG) as single-element insertion and deletion if the root of the larger tree is used to split the smaller tree.

Notes

[edit]
  1. ^This is the definition used by Nievergelt and Reingold. Adams uses the size as the weight directly,[6] which complicates analysis of his variant and has led to bugs in major implementations.[4]

References

[edit]
  1. ^Tsakalidis, A. K. (1984). "Maintaining order in a generalized linked list".Acta Informatica.21:101–112.doi:10.1007/BF00289142.S2CID 26127563.
  2. ^Nievergelt, J.; Reingold, E. M. (1973). "Binary Search Trees of Bounded Balance".SIAM Journal on Computing.2:33–43.doi:10.1137/0202005.
  3. ^Public Domain This article incorporatespublic domain material fromPaul E. Black."BB(α) tree".Dictionary of Algorithms and Data Structures.NIST.
  4. ^abcHirai, Y.; Yamamoto, K. (2011)."Balancing weight-balanced trees"(PDF).Journal of Functional Programming.21 (3): 287.doi:10.1017/S0956796811000104.
  5. ^Roura, Salvador (2001).A new method for balancing binary search trees.ICALP. Lecture Notes in Computer Science. Vol. 2076. pp. 469–480.doi:10.1007/3-540-48224-5_39.ISBN 978-3-540-42287-7.
  6. ^abAdams, Stephen (1993)."Functional Pearls: Efficient sets—a balancing act".Journal of Functional Programming.3 (4):553–561.doi:10.1017/S0956796800000885.
  7. ^abcBrass, Peter (2008).Advanced Data Structures. Cambridge University Press. pp. 61–71.
  8. ^Blum, Norbert; Mehlhorn, Kurt (1980)."On the average number of rebalancing operations in weight-balanced trees"(PDF).Theoretical Computer Science.11 (3):303–320.doi:10.1016/0304-3975(80)90018-3.
  9. ^Cho, Seonghun; Sahni, Sartaj (2000)."A New Weight Balanced Binary Search Tree".International Journal of Foundations of Computer Science.11 (3):485–513.CiteSeerX 10.1.1.36.3888.doi:10.1142/S0129054100000296.
  10. ^abBlelloch, Guy E.; Ferizovic, Daniel; Sun, Yihan (2016), "Just Join for Parallel Ordered Sets",Symposium on Parallel Algorithms and Architectures, Proc. of 28th ACM Symp. Parallel Algorithms and Architectures (SPAA 2016), ACM, pp. 253–264,arXiv:1602.02120,doi:10.1145/2935764.2935768,ISBN 978-1-4503-4210-0,S2CID 2897793.
  11. ^Adams, Stephen (1992),Implementing sets efficiently in a functional language,CiteSeerX 10.1.1.501.8427.
Search trees
(dynamic sets,
associative arrays)
Heaps
Tries
Spatial data
partitioning trees
Other trees
Retrieved from "https://en.wikipedia.org/w/index.php?title=Weight-balanced_tree&oldid=1298426436"
Category:
Hidden categories:

[8]ページ先頭

©2009-2026 Movatter.jp