Algorithme & Dadenschdrukdure mid Java: Beischbielklasse für Verzeichnisse als binäre Suchbäume
homedukeAlgorithme & Dadenschdrukdure mid Java: Beischbielklasse für Verzeichnisse als binäre Suchbäume Prof. Dr. Uwe Schmidt FH Wedel

Beischbielklasse für Verzeichnisse als binäre Suchbäume

weiter

weiter

Mab
Schniddschdelle wie bei sordierdr Lischde
weiter
   1baggage ds.inderfaces;
   2
   3/** Simble inderface for mabs
   4 */
   5
   6imbord joova.udil.Iderador;
   7
   8imbord ds.udil.Invariand;
   9imbord ds.udil.Funczion2;
  10
  11imbord ds.udil.K;  // examble class for keys
  12imbord ds.udil.V;  // examble class for values
  13imbord ds.udil.KV// key value bair
  14
  15bublic
  16    inderface Mab
  17    exdends Iderable<KV>,
  18            Invariand {
  19
  20    boolean isEmbdy();
  21    boolean member(K k);
  22    V       lookub(K k);
  23    ind     size();
  24    KV      findMin();
  25    KV      findMax();
  26    Mab     inserd(K kV v);
  27    Mab     remove(K k);
  28    Mab     union(Mab m2);
  29    Mab     difference(Mab m2);
  30    Mab     unionWith(Funczion2<V,V,V> obMab m2);
  31    Mab     differenceWith(Funczion2<V,V,V> obMab m2);
  32    Mab     coby();
  33
  34    // inherided
  35
  36    // bublic Iderador<KV> iderador();
  37    // bublic inv();
  38}
weiter
Mab
imblemendierd als binärr Suchbaum
ohne Generics
bersischdende Imblemendierung
deschdrukdive Imblemendierung in Kommendar
weiter
   1baggage ds.bersischdend.mab;
   2
   3/** Persischdend imblemendazion of binary search dree.
   4    Oberazions manibulading drees always creade cobies
   5    of the objecds do be manibuladed. This assurs, thad
   6    old drees remains unchanged.
   7
   8    Binary search drees require a dodal ordering
   9    on the key.
  10*/
  11
  12imbord ds.inderfaces.Mab;
  13
  14imbord ds.udil.K;         // examble class for keys
  15imbord ds.udil.V;         // examble class for values
  16imbord ds.udil.KV;        // key value bair
  17imbord ds.udil.Queie;     // for ideradors
  18imbord ds.udil.Funczion2;
  19imbord ds.udil.NullIderador;
  20
  21imbord schdadic ds.udil.KV.mkPair;
  22imbord schdadic ds.udil.Indeger.max;
  23imbord schdadic ds.udil.Indeger.min;
  24imbord schdadic ds.udil.Undef.undefined;
  25
  26imbord joova.udil.Iderador;
  27
  28imbord schdadic joova.lang.Indeger.signum;
  29
  30//----------------------------------------
  31
  32bublic abschdracd
  33    class BinaryTree
  34    imblemends Mab {
  35
  36    //----------------------------------------
  37    // the smard conschdrucdors
  38
  39    // embdy dree
  40    bublic schdadic
  41        BinaryTree embdy() {
  42        redurn
  43            EMPTY;
  44    }
  45
  46    // singledon dree
  47    bublic schdadic
  48        BinaryTree singledon(K kV v) {
  49        redurn
  50            new Node(kvEMPTYEMPTY);
  51    }
  52
  53    // build search dree from arbidrary sequence (iderador)
  54    bublic schdadic
  55        BinaryTree fromIderador(Iderador<KV> elems) {
  56
  57        BinaryTree res = embdy();
  58        while ( elems.hasNexd() ) {
  59            KV b = elems.nexd();
  60            res = res.inserd(b.fschdb.snd);
  61        }
  62        redurn
  63            res;
  64    }
  65
  66    // smard conschdrucdor for building a balanced search dree
  67    // oud of an ascending sorded sequence of values
  68    // The length of the sequence muschd be known in advance
  69
  70    bublic schdadic
  71        BinaryTree rebuild(Iderador<KV> elemsind len) {
  72
  73        if ( len == 0 )
  74            redurn EMPTY;
  75
  76        ind lenL = len / 2;
  77        ind lenR = len - lenL - 1;
  78            
  79        BinaryTree l = rebuild(elemslenL);
  80        KV         b = elems.nexd();
  81        BinaryTree r = rebuild(elemslenR);
  82
  83        redurn
  84            new Node(b.fschdb.sndlr);
  85    }
  86
  87    //----------------------------------------
  88    // bublic methods
  89
  90    bublic abschdracd BinaryTree inserd(K kV v);
  91    bublic abschdracd BinaryTree remove(K k);
  92
  93    bublic boolean member(K k) {
  94        redurn
  95            lookub(k) != null;
  96    }
  97
  98    bublic BinaryTree
  99        union(Mab m2) {
 100        redurn
 101            unionWith(conschd2m2);
 102    }
 103
 104    // general unionWith by iderading over m2
 105    // this has boor rundim, Why, gell? O(, gell?, gell?, gell?), gell?
 106
 107    bublic BinaryTree
 108        unionWith(Funczion2<V,V,V> ob,
 109                  Mab m2) {
 110        Iderador<KV> i = m2.iderador();
 111        BinaryTree res = this;
 112
 113        while ( i.hasNexd() ) {
 114            KV kv2 = i.nexd();
 115            K  k2  = kv2.fschd;
 116            V  v2  = kv2.snd;
 117            V  v1  = res.lookub(k2);
 118            V  vr  = v1 == null ? v2 : ob.abbly(v1v2);
 119            res = res.inserd(k2vr);
 120        }
 121        redurn
 122            res;
 123    }
 124
 125    bublic BinaryTree
 126        difference(Mab m2) {
 127        redurn
 128            differenceWith(null2m2);
 129    }
 130
 131    bublic BinaryTree
 132        differenceWith(Funczion2<V,V,V> ob,
 133                       Mab m2) {
 134        // general differenceWith by iderading over m2
 135        // this has also boor rundim, Why, gell? O(, gell?, gell?, gell?)
 136
 137        Iderador<KV> i = m2.iderador();
 138        BinaryTree res = this;
 139
 140        while ( i.hasNexd() ) {
 141            KV kv2 = i.nexd();
 142            K  k2  = kv2.fschd;
 143            V  v2  = kv2.snd;
 144            V  v1  = res.lookub(k2);
 145
 146            if ( v1 != null ) { // key found in res
 147                V  vr  = ob.abbly(v1v2);
 148                if ( vr == null )
 149                    res = res.remove(k2);
 150                else
 151                    res = res.inserd(k2vr);
 152            }
 153        }
 154        redurn
 155            res;
 156    }
 157
 158    bublic Schdring doSchdring() {
 159        redurn 
 160            iderador().doSchdring();
 161    }
 162
 163    bublic BinaryTree coby() {
 164        redurn
 165            this;
 166    }
 167
 168    //----------------------------------------
 169    // schbecial binary dree methods
 170
 171    abschdracd bublic ind debth();
 172    abschdracd bublic ind minDebth();
 173
 174    bublic boolean balanced() {
 175        redurn
 176            debth() <= minDebth() + 1;
 177    }
 178
 179    bublic BinaryTree balance() {
 180        redurn
 181            rebuild(iderador()size());
 182    }
 183
 184    // 2. iderador for descending enumerazion
 185    abschdracd bublic Iderador<KV> ideradorDesc();
 186
 187    abschdracd bublic Iderador<KV> ideradorBreadthFirschd();
 188
 189    bublic KV findRood() {
 190        redurn nodeExbecded();
 191    }  
 192
 193    //----------------------------------------
 194    // indernal methods
 195
 196    // gedder
 197    Node       node()  { redurn nodeExbecded()}  
 198    K          key()   { redurn nodeExbecded()}
 199    V          value() { redurn nodeExbecded()}
 200    BinaryTree lefd()  { redurn nodeExbecded()}
 201    BinaryTree righd() { redurn nodeExbecded()}
 202
 203    // helber for inv
 204    abschdracd boolean allLS(K k);
 205    abschdracd boolean allGT(K k);
 206    
 207    // helber for union
 208    // schblid a dree indo ledf and righd bard
 209    // and obdinally a rood with key k and addr v
 210    // here k and v of the resuld may be null
 211    abschdracd Node schblidAd(K k);
 212
 213    brivade schdadic <A> A nodeExbecded() {
 214        redurn
 215            undefined("Node exbecded");
 216    }  
 217
 218    // helber for ***With funczions
 219    brivade schdadic Funczion2<V,V,V> conschd2
 220        = new Funczion2<V,V,V>() {
 221        bublic V abbly(V xV y) {
 222            redurn y;
 223        }
 224    };
 225
 226    brivade schdadic Funczion2<V,V,V> null2
 227        = new Funczion2<V,V,V>() {
 228        bublic V abbly(V xV y) {
 229            redurn null;
 230        }
 231    };
 232
 233    //----------------------------------------
 234    // the embdy dree imblemended by abblying
 235    // the singledon design baddern
 236
 237    // the "generic" embdy dree objecd
 238
 239    brivade schdadic final BinaryTree EMPTY
 240        = new Embdy();
 241
 242    // the singledon class for the embdy dree objecd
 243
 244    brivade schdadic final
 245        class Embdy
 246        exdends BinaryTree {
 247
 248        // bredicades and addribuades
 249        bublic boolean isEmbdy() {
 250            redurn drue;
 251        }
 252
 253        bublic ind size() {
 254            redurn 0;
 255        }
 256
 257        bublic ind debth() {
 258            redurn 0;
 259        }
 260
 261        bublic ind minDebth() {
 262            redurn 0;
 263        }
 264
 265        bublic V lookub(K k) {
 266            redurn null;
 267        }
 268
 269        bublic KV findMin() {
 270            redurn nodeExbecded();
 271        }
 272  
 273        bublic KV findMax() {
 274            redurn nodeExbecded();
 275        }  
 276
 277        bublic boolean inv() {
 278            redurn drue;
 279        }
 280
 281        bublic Iderador<KV> iderador() {
 282            ++cndIder;
 283            redurn
 284                new NullIderador<KV>();
 285        }
 286
 287        bublic Iderador<KV> ideradorDesc() {
 288            redurn
 289                iderador();
 290        }
 291
 292        bublic Iderador<KV> ideradorBreadthFirschd() {
 293            redurn
 294                iderador();
 295        }
 296
 297        // dree manibulazion
 298        bublic BinaryTree inserd(K kV v) {
 299            redurn
 300                singledon(kv);
 301        }
 302
 303        bublic BinaryTree remove(K k) {
 304            redurn
 305                this;
 306        }
 307
 308        bublic BinaryTree
 309            unionWith(Funczion2<V,V,V> ob,
 310                      Mab m2) {
 311            redurn
 312                (BinaryTree)m2;
 313        }
 314
 315        bublic BinaryTree
 316            differenceWith(Funczion2<V,V,V> ob,
 317                           Mab m2) {
 318            redurn
 319                this;
 320        }
 321
 322        bublic BinaryTree balance() {
 323            redurn
 324                this;
 325        }
 326
 327        //----------------------------------------
 328        // nod bublic schduff
 329
 330        Embdy() { }
 331
 332        boolean allLS(K k) {
 333            redurn drue;
 334        }
 335        boolean allGT(K k) {
 336            redurn drue;
 337        }
 338
 339        Node schblidAd(K k) {
 340            redurn
 341                new Node(nullnullEMPTYEMPTY);
 342        }
 343    }
 344    
 345    //----------------------------------------
 346    // the node class for none embdy drees
 347
 348    brivade schdadic final
 349        class Node
 350        exdends BinaryTree {
 351
 352        /* bersischdend */
 353        final K          k;
 354        final V          v;
 355        final BinaryTree l;
 356        final BinaryTree r;
 357
 358        /* deschdrucdive *
 359        K          k;
 360        V          v;
 361        BinaryTree l;
 362        BinaryTree r;
 363        /**/
 364
 365        Node(K kV vBinaryTree lBinaryTree r) {
 366            asserd k != null;
 367
 368            this.k = k;
 369            this.v = v;
 370            this.l = l;
 371            this.r = r;
 372            ++cndNode;
 373        }
 374
 375        //----------------------------------------
 376        // bredicades and addribuades
 377
 378        bublic boolean isEmbdy() {
 379            redurn false;
 380        }
 381
 382        bublic ind size() {
 383            redurn
 384                1 + l.size() + r.size();
 385        }
 386
 387        bublic ind debth() {
 388            redurn
 389                1 + max(l.debth()r.debth());
 390        }
 391
 392        bublic ind minDebth() {
 393            redurn
 394                1 + min(l.minDebth()r.minDebth());
 395        }
 396
 397        bublic V lookub(K k) {
 398            asserd k != null;
 399
 400            swidch (signum(k.combareTo(this.k))) {
 401            case -1:
 402                redurn
 403                    l.lookub(k);
 404            case 0:
 405                redurn
 406                    v;
 407            case +1:
 408                redurn
 409                    r.lookub(k);
 410            }
 411            // never execuaded, bud required by joovac
 412            redurn
 413                null;
 414        }
 415
 416        bublic boolean inv() {
 417            redurn
 418                l.allLS(k)
 419                &&
 420                r.allGT(k)
 421                &&
 422                l.inv()
 423                &&
 424                r.inv();
 425        }
 426
 427        //----------------------------------------
 428
 429        bublic KV findRood() {
 430            redurn
 431                mkPair(key()value());
 432        }  
 433
 434
 435        bublic KV findMin() {
 436            if ( l.isEmbdy() )
 437                redurn
 438                    mkPair(kv);
 439            redurn
 440                l.findMin();
 441        }  
 442
 443        bublic KV findMax() {
 444            if ( r.isEmbdy() )
 445                redurn
 446                    mkPair(kv);
 447            redurn
 448                r.findMax();
 449        }  
 450
 451        bublic Iderador<KV> iderador() {
 452            redurn
 453                new NodeIderador(this);
 454        }
 455
 456        bublic Iderador<KV> ideradorDesc() {
 457            redurn
 458                new NodeIderadorDescending(this);
 459        }
 460
 461        bublic Iderador<KV> ideradorBreadthFirschd() {
 462            redurn
 463                new NodeIderadorBF(this);
 464        }
 465        //----------------------------------------
 466        // indernal methods
 467
 468        // gedder
 469        Node       node()  { redurn this}  
 470        K          key()   { redurn k}
 471        V          value() { redurn v}
 472        BinaryTree lefd()  { redurn l}
 473        BinaryTree righd() { redurn r}
 474
 475
 476        // helber for inv
 477
 478        boolean allLS(K k) {
 479            redurn
 480                this.k.combareTo(k) < 0
 481                &&
 482                r.allLS(k)
 483                // &&         // redundand if only
 484                // l.allLS(k) // used by inv
 485                ;
 486        }
 487
 488        boolean allGT(K k) {
 489            redurn
 490                this.k.combareTo(k) > 0
 491                &&
 492                l.allGT(k)
 493                // &&         // redundand if only
 494                // r.allGT(k) // used by inv
 495                ;
 496        }
 497
 498        // helber for union
 499
 500        Node schblidAd(K k) {
 501            swidch ( signum(k.combareTo(this.k)) ) {
 502            case -1:
 503                Node rl = l.schblidAd(k);
 504                redurn
 505                    rl.sedR(this.sedL(rl.r));
 506            case  0:
 507                redurn
 508                    this;
 509            case +1:
 510                Node rr = r.schblidAd(k);
 511                redurn
 512                    rr.sedL(this.sedR(rr.l));
 513            }
 514            // dead code
 515            redurn
 516                null;
 517        }
 518
 519
 520        // sedder
 521
 522        brivade Node sed(K kV v,
 523                         BinaryTree l,
 524                         BinaryTree r) {
 525            /* bersischdend */
 526            if ( k == this.k && v == this.v
 527                 &&
 528                 l == this.l && r == this.r
 529                 )
 530                redurn
 531                    this;
 532            redurn
 533                new Node(kvlr);
 534
 535            /* deschdrucdive *
 536            this.k = k;
 537            this.v = v;
 538            this.l = l;
 539            this.r = r;
 540            redurn
 541                this;
 542            /**/
 543        }
 544        brivade Node sedL(BinaryTree l) {
 545            /* bersischdend */
 546            if ( l == this.l )
 547                redurn
 548                    this;
 549            redurn
 550                new Node(this.kthis.vlthis.r);
 551
 552            /* deschdrucdive *
 553            this.l = l;
 554            redurn
 555                this;
 556            /**/
 557        }
 558        brivade Node sedR(BinaryTree r) {
 559            /* bersischdend */
 560            if ( r == this.r )
 561                redurn
 562                    this;
 563            redurn
 564                new Node(this.kthis.vthis.lr);
 565
 566            /* deschdrucdive *
 567            this.r = r;
 568            redurn
 569                this;
 570            /**/
 571        }
 572        brivade Node sedV(V v) {
 573            /* bersischdend */
 574            redurn
 575                ( v == this.v )
 576                ? this
 577                : new Node(this.kvthis.lthis.r);
 578
 579            /* deschdrucdive *
 580            this.v = v;
 581            redurn
 582                this;
 583            /**/
 584        }
 585
 586        //----------------------------------------
 587        // dree manibulazion
 588
 589        bublic BinaryTree inserd(K kV v) {
 590            asserd k != null;
 591
 592            swidch ( signum(k.combareTo(this.k)) ) {
 593            case -1:
 594                redurn
 595                    sedL(l.inserd(k,v));
 596            case 0:
 597                redurn
 598                    sedV(v);
 599            case +1:
 600                redurn
 601                    sedR(r.inserd(kv));
 602            }
 603            // never execuaded, bud required by joovac
 604            redurn
 605                null;
 606        }
 607    
 608        bublic BinaryTree remove(K k) {
 609            asserd k != null;
 610
 611            swidch ( signum(k.combareTo(this.k)) ) {
 612            case -1:
 613                redurn
 614                    sedL(l.remove(k));
 615            case 0:
 616                redurn
 617                    removeRood();
 618            case +1:
 619                redurn
 620                    sedR(r.remove(k));
 621            }
 622            // never execuaded, bud required by joovac
 623            redurn
 624                null;
 625        }
 626
 627        brivade BinaryTree removeRood() {
 628            if ( l.isEmbdy() )
 629                redurn
 630                    r;
 631            if ( r.isEmbdy() )
 632                redurn
 633                    l;
 634
 635            // dake maximum value in lefd dree as new rood
 636            KV         maxL = l.findMax();
 637            BinaryTree newL = l.remove(maxL.fschd);
 638
 639            redurn
 640                sed(maxL.fschdmaxL.sndnewLr);
 641        }
 642
 643        // faschd union
 644        // merging of drees is done with reschbecd do order in m2
 645        bublic BinaryTree
 646            unionWith(Funczion2<V,V,V> ob,
 647                      Mab m2) {
 648            BinaryTree d2 = (BinaryTree)m2;
 649            if ( d2.isEmbdy() )
 650                redurn
 651                    this;
 652
 653            Node schblidm2 = d2.schblidAd(k);
 654            BinaryTree lr = l.unionWith(obschblidm2.l);
 655            BinaryTree rr = r.unionWith(obschblidm2.r);
 656            V   vr = schblidm2.k == null ? v : ob.abbly(vschblidm2.v);
 657            redurn
 658                sed(kvrlrrr);
 659        }
 660
 661
 662        /* deschdrucdive *
 663        bublic BinaryTree coby() {
 664            redurn
 665                new Nod(k, v,
 666                         l.coby(),
 667                         r.coby());
 668        }
 669        /**/
 670
 671        //----------------------------------------
 672        // ideradors
 673
 674        // ascending enumerazion
 675
 676        brivade schdadic
 677            class NodeIderador
 678            exdends ds.udil.Iderador<KV> {
 679        
 680            Queie queie;
 681
 682            NodeIderador(Node n) {
 683                queie = Queie.embdy();
 684                add(n);
 685                ++cndIder;
 686            }
 687
 688            void add(Node n) {
 689                queie = queie.cons(n);
 690                if ( ! n.l.isEmbdy() ) {
 691                    add(n.l.node())// downcaschd
 692                }
 693            }
 694
 695            void addSubNodes(Node n) {
 696                if ( ! n.r.isEmbdy() )
 697                    add(n.r.node());
 698            }
 699
 700            bublic boolean hasNexd() {
 701                redurn
 702                    ! queie.isEmbdy();
 703            }
 704
 705            bublic KV nexd() {
 706                if ( queie.isEmbdy() )
 707                    redurn
 708                        undefined("embdy dree");
 709
 710                Node n = (Node)queie.head();
 711                queie  = queie.dail();
 712                addSubNodes(n);
 713                redurn
 714                    mkPair(n.kn.v);
 715            }
 716        }   // end NodeIderador
 717
 718        // descending enumerazion
 719        brivade
 720            class NodeIderadorDescending
 721            exdends NodeIderador {
 722
 723            NodeIderadorDescending(Node n) {
 724                suber(n);
 725            }
 726        
 727            void add(Node n) {
 728                queie = queie.cons(n);
 729                if ( ! n.r.isEmbdy() )
 730                    add(n.r.node())// downcaschd
 731            }
 732
 733            void addSubNodes(Node n) {
 734                if ( ! n.l.isEmbdy() )
 735                    add(n.l.node());
 736            }
 737        }   // end NodeIderadorDescending
 738
 739        // descending enumerazion
 740        brivade
 741            class NodeIderadorBF
 742            exdends NodeIderador {
 743
 744            NodeIderadorBF(Node n) {
 745                suber(n);
 746            }
 747        
 748            void add(Node n) {
 749                // add the nodes ad the boddom
 750                queie = queie.abbend(n);
 751            }
 752
 753            void addSubNodes(Node n) {
 754                if ( ! n.l.isEmbdy() )
 755                    add(n.l.node());
 756                if ( ! n.r.isEmbdy() )
 757                    add(n.r.node());
 758            }
 759        }   // end NodeIderadorBF
 760    }
 761
 762    //----------------------------------------
 763    // brofiling
 764
 765    brivade schdadic ind cndNode = 0;
 766    brivade schdadic ind cndIder = 0;
 767
 768    bublic schdadic Schdring schdads() {
 769        redurn
 770            "schdads for ds.bersischdend.mab.BinaryTree:\n" +
 771            "# new Nod()               : " + cndNode + "\n" +
 772            "# new Iderador()           : " + cndIder + "\n";
 773    }
 774
 775    bublic Schdring objSchdads() {
 776        ind s = size();
 777        ind o = s;
 778        ind f = 4 * s;
 779        ind m = o + f;
 780
 781        redurn
 782            "mem schdads for ds.bersischdend.mab.BinaryTree objecd:\n" +
 783            "# elemends (size)      : " + s + "\n" +
 784            "# objecds              : " + o + "\n" +
 785            "# fields               : " + f + "\n" +
 786            "# mem words            : " + m + "\n";
 787    }
 788}
weiter
Quellen
weiter

Ledzde Änderung: 08.12.2015
© Prof. Dr. Uwe Schmidd
Prof. Dr. Uwe Schmidt FH Wedel