AATree.st
author Claus Gittinger <cg@exept.de>
Mon, 06 Aug 2012 08:00:37 +0200
changeset 2783 4d98d582fa06
parent 2780 5933099dd95a
child 3537 4139da619f6e
permissions -rw-r--r--
changed: #add:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2279
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
     1
"
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
     2
 COPYRIGHT (c) 2009 by eXept Software AG
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
     3
              All Rights Reserved
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
     4
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
     5
 This software is furnished under a license and may be used
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
     6
 only in accordance with the terms of that license and with the
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
     8
 be provided or otherwise made available to, or used by, any
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
     9
 other person.  No title to or ownership of the software is
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    10
 hereby transferred.
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    11
"
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
BinaryTree subclass:#AATree
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:''
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
	classVariableNames:''
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
2761
d53b683402c1 category changes
Claus Gittinger <cg@exept.de>
parents: 2760
diff changeset
    18
	category:'Collections-Ordered-Trees'
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!AATree class methodsFor:'documentation'!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
2279
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    23
copyright
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    24
"
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    25
 COPYRIGHT (c) 2009 by eXept Software AG
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    26
              All Rights Reserved
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    27
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    28
 This software is furnished under a license and may be used
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    29
 only in accordance with the terms of that license and with the
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    30
 inclusion of the above copyright notice.   This software may not
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    31
 be provided or otherwise made available to, or used by, any
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    32
 other person.  No title to or ownership of the software is
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    33
 hereby transferred.
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    34
"
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    35
!
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    36
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
documentation
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
    An AA tree is a form of balanced tree used for storing and retrieving ordered data efficiently.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    AA trees are named for Arne Andersson, their inventor.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    AA trees are a variation of the red-black tree, which in turn is an enhancement to the 
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    binary search tree. One caveat with the implementation is that it needs an extra level instvar
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    in the treeNode; this results in 25% more storage overhead as compared to a Red/Black or plain Binary tree.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    For performance data, see performance.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    [author:]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
        Original algorithm by Arne Andersson
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
        ported from wikipedia to smalltalk code by Claus Gittinger
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
examples
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
                                                                [exBegin]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    |coll|
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    coll := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    (1 to:10) do:[:i | coll add:i].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    coll addAll:(20 to:30).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    coll inspect   
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
                                                                [exBegin]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    |tree|
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    tree := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    tree add:'hello'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    tree add:'aaaa'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    tree add:'AAAb'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    tree add:'aaaC'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
    tree add:'world'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    tree asOrderedCollection     
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
                                                                [exBegin]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    |tree|
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
    tree := AATree sortBlock:[:a :b | a asLowercase < b asLowercase].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    tree add:'hello'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
    tree add:'aaaa'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    tree add:'AAAb'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    tree add:'aaaC'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
    tree add:'world'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    tree asOrderedCollection     
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    timing 1:
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
                                                                [exBegin]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    |N randomNumbers coll1_BT coll2_AT coll3_SC t1_BT t2_AT t3_SC|
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    N := 1000000.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    randomNumbers := (1 to:N) collect:[:i | Random nextInteger].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    t1_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
        coll1_BT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
        coll1_BT addAll:randomNumbers
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    coll1_BT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    t2_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
        coll2_AT := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
        coll2_AT addAll:randomNumbers
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    coll2_AT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
    t3_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
        coll3_SC := SortedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
        coll3_SC addAll:randomNumbers
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    coll3_SC := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
    randomNumbers := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    Transcript show:'Time to insert random '; show:N; show:' into SortedCollection: '; show:t3_SC; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    Transcript show:'Time to insert random '; show:N; show:' into BinaryTree: '; show:t1_BT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    Transcript show:'Time to insert random '; show:N; show:' into AATree: '; show:t2_AT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    t1_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
        coll1_BT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
        coll1_BT addAll:(1 to:100000).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    coll1_BT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
    t2_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
        coll2_AT := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
        coll2_AT addAll:(1 to:100000)
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    coll2_AT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    t3_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
        coll3_SC := SortedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
        coll3_SC addAll:(1 to:100000)
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
    coll3_SC := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
    Transcript show:'Time to insert ordered '; show:N; show:' into SortedCollection: '; show:t3_SC; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    Transcript show:'Time to insert ordered '; show:N; show:' into BinaryTree: '; show:t1_BT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
    Transcript show:'Time to insert ordered '; show:N; show:' into AATree: '; show:t2_AT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
    t1_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
        coll1_BT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
        coll1_BT addAll:(100000 downTo:1).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    coll1_BT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
    t2_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
        coll2_AT := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
        coll2_AT addAll:(100000 downTo:1)
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
    coll2_AT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
    t3_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
        coll3_SC := SortedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
        coll3_SC addAll:(100000 downTo:1)
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
    coll3_SC := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    Transcript show:'Time to insert reverse ordered '; show:N; show:' into SortedCollection: '; show:t3_SC; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
    Transcript show:'Time to insert reverse ordered '; show:N; show:' into BinaryTree: '; show:t1_BT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    Transcript show:'Time to insert reverse ordered '; show:N; show:' into AATree: '; show:t2_AT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
  timing 2:  
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
                                                                [exBegin]
2760
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   177
    |allSelectors coll1_SC coll2_BT coll3_AT coll4_Trie t1_SC t2_BT t3_AT t4_Trie|
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
    allSelectors := OrderedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
    Smalltalk allClassesDo:[:cls |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
        cls instAndClassSelectorsAndMethodsDo:[:sel :mthd |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
            allSelectors add:sel.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    ].
2760
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   185
    Transcript show:'Unique selectors: '; show:allSelectors asSet size; showCR:''.
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    t1_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
        coll1_SC := SortedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
            coll1_SC add:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
    Transcript show:'Time to insert '; show:coll1_SC size; show:' selectors into SortedCollection: '; show:t1_SC; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
    t2_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
        coll2_BT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
            coll2_BT add:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    Transcript show:'Time to insert '; show:coll2_BT size; show:' selectors into BinaryTree: '; show:t2_BT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    t3_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
        coll3_AT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
            coll3_AT add:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
    Transcript show:'Time to insert '; show:coll3_AT size; show:' selectors into AATree: '; show:t3_AT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
2760
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   211
    t4_Trie := Time millisecondsToRun:[
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   212
        coll4_Trie := TrieCollection new.
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   213
        allSelectors do:[:sel |
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   214
            coll4_Trie add:sel
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   215
        ].
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   216
    ].
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   217
    Transcript show:'Time to insert '; show:coll4_Trie size; show:' selectors into Trie: '; show:t4_Trie; showCR:'ms'.
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   218
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
    t1_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
            coll1_SC remove:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    self assert:(coll1_SC isEmpty).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
    Transcript show:'Time to remove selectors from SortedCollection: '; show:t1_SC; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
    t2_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
            coll2_BT remove:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    self assert:(coll2_BT isEmpty).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
    Transcript show:'Time to remove selectors from BinaryTree: '; show:t2_BT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
    t3_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
            coll3_AT remove:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
    self assert:(coll3_AT isEmpty).
2760
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   241
    Transcript show:'Time to remove selectors from AATree: '; show:t3_AT; showCR:'ms'.
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   242
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   243
    t4_Trie := Time millisecondsToRun:[
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   244
        allSelectors do:[:sel |
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   245
            coll4_Trie remove:sel
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   246
        ].
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   247
    ].
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   248
    self assert:(coll4_Trie isEmpty).
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   249
    Transcript show:'Time to remove selectors from Trie: '; show:t4_Trie; showCR:'ms'.
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
performance
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
    Time to insert random 100000 individually into SortedCollection: 6037ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
    Time to insert random 100000 en-bloque into SortedCollection: 172ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
    Time to insert in order 100000 individually into SortedCollection: 31ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
    Time to insert in order 100000 en-bloque into SortedCollection: 125ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    Time to insert in reverse order 100000 individually into SortedCollection: 93ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
    Time to insert in reverse order 100000 en-bloque into SortedCollection: 125ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
    Time to remove in random order 100000 from SortedCollection: 6380ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
    Time to remove in order 100000 from SortedCollection: 109ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
    Time to remove in reverse order 100000 from SortedCollection: 125ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
    Time to insert random 100000 individually into AATree: 281ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    Time to insert random 100000 en-bloque into AATree: 265ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    Time to insert in order 100000 individually into AATree: 281ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
    Time to insert in order 100000 en-bloque into AATree: 328ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
    Time to insert in reverse order 100000 individually into AATree: 203ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
    Time to insert in reverse order 100000 en-bloque into AATree: 218ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
    Time to remove in random order 100000 from AATree: 452ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    Time to remove in order 100000 from AATree: 312ms
2404
9a2681a6525c changed: #performance
Claus Gittinger <cg@exept.de>
parents: 2279
diff changeset
   275
    Time to remove in reverse order 100000 from AATree: 499ms
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    Time to insert random 100000 individually into BinaryTree: 156ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
    Time to insert random 100000 en-bloque into BinaryTree: 156ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
    Time to insert in order 100000 individually into BinaryTree: 195921ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
    Time to insert in order 100000 en-bloque into BinaryTree: 205266ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
    Time to insert in reverse order 100000 individually into BinaryTree: 202271ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
    Time to insert in reverse order 100000 en-bloque into BinaryTree: 197684ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
    Time to remove in random order 100000 from BinaryTree: 234ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
    Time to remove in order 100000 from BinaryTree: 78ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
    Time to remove in reverse order 100000 from BinaryTree: 78ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
! !
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
!AATree methodsFor:'adding & removing'!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
add:anObject
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
    "add the argument, anObject to the receiver.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
     Returns the object (sigh).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
     WARNING: do not add/remove elements while iterating over the receiver.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
              Iterate over a copy to do this."
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
    treeRoot isNil ifTrue:[
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   299
        treeRoot := self treeNodeClass data:anObject level:1.
2783
4d98d582fa06 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2780
diff changeset
   300
    ] ifFalse:[
4d98d582fa06 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2780
diff changeset
   301
        treeRoot := treeRoot insert:anObject usingSortBlock:sortBlock.
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
    ^ anObject "sigh - collection protocol"
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   304
2783
4d98d582fa06 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2780
diff changeset
   305
    "Modified: / 05-08-2012 / 12:36:26 / cg"
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   306
!
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   307
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   308
treeNodeClass
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   309
    ^ AATreeNode
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   310
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   311
    "Created: / 05-08-2012 / 11:39:29 / cg"
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   312
! !
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   313
2780
Claus Gittinger <cg@exept.de>
parents: 2769
diff changeset
   314
!AATree class methodsFor:'documentation'!
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   315
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   316
version
2783
4d98d582fa06 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2780
diff changeset
   317
    ^ '$Header: /cvs/stx/stx/libbasic2/AATree.st,v 1.8 2012-08-06 06:00:37 cg Exp $'
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   318
!
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   319
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   320
version_CVS
2783
4d98d582fa06 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2780
diff changeset
   321
    ^ '$Header: /cvs/stx/stx/libbasic2/AATree.st,v 1.8 2012-08-06 06:00:37 cg Exp $'
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   322
! !