![]() |
|
Главная Терминология Хоора 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 [ 96 ] 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 procedure </е&/ф:: integer; a: ref; var h: boolean); \ {поиск и удаление ключа х в Б-дереве а; если на странице не хватает элементов, то балансировка с соседней стрсщ^ если это возможно, иначе - слияние; h: = на странице а не хватает элементов ] var i,/c,1,r: integer; д: ref; ptoceiute underflow(c,a> ref; s: integer; var h: boolean); {а-страница с нехваткой, с-страница-предок] var b: ref; i,k,mb,mc: integer; begin mc := c].m; [h = true, a].m ~ Й-1} \l s < mc then begin {& .-страница справа от a] s :- s+\; b := с|.ф].р; mb := b].m; к := (mb-n+l) div 2; {к-число элементов на соседней странице b ] := 4-Ф1; а\.е[п] .р := Ь].; \1к > Q then begin {пересылка к элементов с b на а] for i := 1 to fc-l do а^еЦ+п] := Ь^еЩ; - сЬеЫ := bum; cbels] .p := b; b\.pO := fct.c[fc] -p; mb := mb-k; for i := 1 to mb do b\.i\ := b.i+kY, := m&; :== n-l+k; h := false end else begin {слияние страница ub]\ for. i := 1 to л do c.e[/-f/i] := b[.e[i\; for I := s to mc-1 do c\.e[i\ := с|.ф'+1]; ct.m := nn; c.m := mc-l; [dispose(b)} h:= c.m<n end end else begin {b .-.страница слева от a] if 5 = 1 then b := c].pO else b :- с|.е[у-1] .p; mb := fct-wJ + 1; A: .{mb-n) div 2; if A: > 0 then begin {пересылка к элементов со страница b на а) for I := п-1 downto 1 do a\.e[i+k] :- a].e[i]; й|.сИ := c1.e[s]; af.eik] .p := a.pO; mb := mb-i for i := k-1 downto 1 do a].e[i\:= b].e[i+mb]; й|-рО := b].e[mb] .p; ci.e[s] := b[.e[mb]; с|.ф] := a; b\.m :- mb-1; a].m :== n-l-\-k; h :== false end else begin [слияние страниц aub] Ь\.ф1Ъ] := с^-еИ; Ъ1.ё[тЪ] .р й|./)0; lljk for i := 1 to и-1 do b}.e[i+nib] := Т-сЙ; ( id end jjd [underflow] ; yfoceunte del(p;rf;xax h: boolean); var 9: ref; [глобальный a, k] Jiegin with i>t do begin q := e[m] .p; iSq Ф nil theu begin del(q,h); if A then underflow(p,q,m,h) end else begin pt-cN := 14*1 .jp; a1,e[k] :== jPt.e[ 3; /И ;= m~l; h := /и<п . end end end [del] ; gin [delete] if a == nil fhen begin writeln (-KEY is nqt in tree-); h :~ false end else ivith ot do begin / := 1; / := /и; [двоичный поиск в массиве] repeat Л: := (/+/ ) div 2; if л < .key tbea г := fc-1; W if л Лез' then / Ar+l; until / > r; If r=0 then := pO else 9 := p; if /-Г > 1 then l)egi4 шыден; теперь удаление efkj] if 9 ~ nil then begin [а-терминальная страница] m := m-l, h m<ni for I := to /И do e[i] := ф*+1]: (end else begin del{q,h); If h then underflow(a,q,rJk) end end else begin deleteix,q,h); if Л then underflow(a,q,rJt) Vend end [delete]; jjitoceiuteprmttree(p: ref; I: integer}; var i: integer; begin if p ? nil tlten with p] йо feegmfw i := 1 to / do writeC 0. for f := 1 to m do write(e[ilkey: 4); writeln; printtree(pO,l+l); for i := 1 to w йоpririttree(e[i] .p, begin roo/:-nil; rea£/(x); while X Ф 0 йо V . begin vm7eJ>i(SEARCH KEY, x); search(x,root,h,u); if h then begin [включение новой корневой страИЩыУ.-ГбОЦпефЩ with /-00/1 do begin m :== 1; /Ю :~ r; еЩ ;=s end end ; printtree(ro.ot,i); read{x) Bd; read(x); While X 9b 0 do begin w e i(DELETE KEY, л); if h. then . ben {ymHbiuetjpamp корневой сщ)атцы1 if wo/f.w b then begin q := root; root 1 gt/iOi iisposeis)) end end; printtree(rootAyt геаф) Программа 4,7. Поиск, включение и удаление в Б-дереве. |