Knowledge (XXG)

B-heap

Source 📝

89:
has the tree fail to expand for one level upon entering a new page (The nodes on that level have only one child). In any case, an important point is that upon leaving a page, both child nodes are always in a common other page, since in a vertical transversal the algorithm will typically compare both children with the parent to know how to proceed. For this reason, each page can be said to contain two parallel subtrees, interspersed with each other. The pages themselves can be seen as a
80:, which are very expensive. The B-heap solves this problem by laying out child nodes in memory in a different way, trying as much as possible to position subtrees within a single page. Therefore, as a vertical traversal proceeds, several of the consecutive retrieved nodes will lay in the same page, leading to a low number of page misses. 129:
For nodes 2 and 3, the parent is different depending on the mode. In space-saving mode, the parents are simply the nodes 0 and 1, respectively, so one needs only to subtract with 2. On the other hand, in strict-binary-tree-mode, these nodes are the roots of the page instead of 0 and 1, and so their
88:
In detail, a b-heap can be implemented in the following way. Poul-Henning Kamp gives two options for the layout of the nodes: one in which two positions per page are wasted, but the strict binary structure of the tree is preserved, and another which uses the whole available space of the pages, but
113:
For nodes 0 and 1, these are only used in the variant which is exploiting all possible space. In this case, the parent index of both nodes is the same, it is in a different page, and its specific offset within that page only depends on the current page number. Specifically, to compute the parent's
75:
in the array. The root is at position 1. A common operation on binary trees is the vertical traversal; stepping down through the levels of a tree in order to arrive at a searched node. However, because of the way memory is organized on modern computers into pages in virtual memory, this scheme of
76:
laying out the binary tree can be highly ineffective. The reason is that, as when traversing deeper into the tree, the distance to the next node grows exponentially, so every next node retrieved will likely be on a separate memory page. This will increase the number of
105:
In contrast to the classic array-like layout, the parent function in a B-heap is more complex because the index of a node's parent must be computed differently depending on where in the page it is. Assuming the positions inside a page are labelled from 0 to
122:. Then add the difference between the current page number, and the parent's page number, minus one since the first page after the parent page has its parent node in index ( 296: 133:
For all other nodes, their parent will be within the same page, and it is enough to divide their offset within their page by 2, not changing the page number.
183:
Naor, Dalit; Martel, Charles U.; Matloff, Norman S. (1991). "Performance of Priority Queue Structures in a Virtual Memory Environment".
118:. To get the right offset within the page, consider that it must be one of the leaf nodes within the parent page, so start at offset 316: 93:, and since half of the elements in each page will be leaves (within the page), the "tree of pages" has a splitting factor of 300: 216: 280: 40: 114:
page number, simply divide the current node's page number by the "page tree's" splitting factor, which is
25: 39:
There are other heap variants which are efficient in computers using virtual memory or caches, such as
32:, compared with the traditional implementation. The traditional mapping of elements to locations in an 185: 33: 211: 233: 44: 77: 28:. This reduces the number of pages accessed by up to a factor of ten for big heaps when using 214:; Kaas, R.; Zijlstra, E. (1976). "Design and implementation of an efficient priority queue". 225: 193: 29: 310: 237: 281:
https://github.com/varnish/Varnish-Cache/blob/master/lib/libvarnish/binary_heap.c
56: 21: 197: 163: 142: 90: 168: 252: 284: 229: 289: 130:
common parent is computed the same way as described above.
67:, its left and right child are taken to be at positions 295:
For more on van Emde Boas layouts see Benjamin Sach
59:are laid out in consecutive memory according to a 290:Generic heap implementation with B-heap support 36:puts almost every level in a different page. 8: 63:rule, meaning that if a node is at position 110:, the parent function can be as follows. 24:implemented to keep subtrees in a single 154: 285:http://phk.freebsd.dk/B-Heap/binheap.c 7: 14: 162:Kamp, Poul-Henning (2020-07-26). 301:Cache-oblivious data structures 1: 297:Descent into Cache-Oblivion 217:Mathematical Systems Theory 333: 41:cache-oblivious algorithms 317:Heaps (data structures) 253:"You're Doing It Wrong" 198:10.1093/comjnl/34.5.428 164:"You're Doing It Wrong" 45:van Emde Boas layouts 251:Kamp, Poul-Henning. 279:Implementations at 230:10.1007/BF01683268 61:n -> {2n, 2n+1} 212:van Emde Boas, P. 324: 267: 266: 264: 263: 248: 242: 241: 208: 202: 201: 180: 174: 173: 159: 125: 121: 117: 109: 96: 74: 70: 66: 62: 332: 331: 327: 326: 325: 323: 322: 321: 307: 306: 276: 271: 270: 261: 259: 250: 249: 245: 210: 209: 205: 182: 181: 177: 161: 160: 156: 151: 139: 123: 119: 115: 107: 103: 101:Parent Function 94: 86: 72: 68: 64: 60: 55:Traditionally, 53: 43:, k-heaps, and 12: 11: 5: 330: 328: 320: 319: 309: 308: 305: 304: 293: 287: 275: 274:External links 272: 269: 268: 257:phk.freebsd.dk 243: 203: 192:(5): 428–437. 175: 153: 152: 150: 147: 146: 145: 138: 135: 102: 99: 85: 84:Implementation 82: 52: 49: 30:virtual memory 13: 10: 9: 6: 4: 3: 2: 329: 318: 315: 314: 312: 302: 298: 294: 291: 288: 286: 282: 278: 277: 273: 258: 254: 247: 244: 239: 235: 231: 227: 223: 219: 218: 213: 207: 204: 199: 195: 191: 188: 187: 179: 176: 171: 170: 165: 158: 155: 148: 144: 141: 140: 136: 134: 131: 127: 111: 100: 98: 92: 83: 81: 79: 58: 50: 48: 46: 42: 37: 35: 31: 27: 23: 19: 260:. Retrieved 256: 246: 221: 215: 206: 189: 184: 178: 167: 157: 132: 128: 112: 104: 87: 57:binary trees 54: 38: 17: 15: 78:page misses 22:binary heap 262:2019-06-08 224:: 99–127. 186:Comput. J. 149:References 143:D-ary heap 124:pagesize/2 120:pagesize/2 116:pagesize/2 95:pagesize/2 91:m-ary tree 51:Motivation 169:ACM Queue 311:Category 137:See also 108:pagesize 238:8105468 236:  18:B-heap 234:S2CID 34:array 20:is a 283:and 73:2n+1 71:and 26:page 299:or 226:doi 194:doi 126:). 313:: 255:. 232:. 222:10 220:. 190:34 166:. 97:. 69:2n 47:. 16:A 303:. 292:. 265:. 240:. 228:: 200:. 196:: 172:. 65:n

Index

binary heap
page
virtual memory
array
cache-oblivious algorithms
van Emde Boas layouts
binary trees
page misses
m-ary tree
D-ary heap
"You're Doing It Wrong"
ACM Queue
Comput. J.
doi
10.1093/comjnl/34.5.428
van Emde Boas, P.
Mathematical Systems Theory
doi
10.1007/BF01683268
S2CID
8105468
"You're Doing It Wrong"
https://github.com/varnish/Varnish-Cache/blob/master/lib/libvarnish/binary_heap.c
http://phk.freebsd.dk/B-Heap/binheap.c
Generic heap implementation with B-heap support
Descent into Cache-Oblivion
Cache-oblivious data structures
Category
Heaps (data structures)

Text is available under the Creative Commons Attribution-ShareAlike License. Additional terms may apply.