AATree.st
author Claus Gittinger <cg@exept.de>
Tue, 29 Sep 2009 21:32:05 +0200
changeset 2279 cb00c64a12f9
parent 2266 d04df8bb00ea
child 2404 9a2681a6525c
permissions -rw-r--r--
added: #copyright
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:''
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	category:'Collections-Ordered'
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]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
    |allSelectors coll1_SC coll2_BT coll3_AT t1_SC t2_BT t3_AT|
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
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
    t1_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
        coll1_SC := SortedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
            coll1_SC add:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    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
   193
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
    t2_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
        coll2_BT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
            coll2_BT add:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
    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
   201
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
    t3_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
        coll3_AT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
            coll3_AT add:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
    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
   209
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
    t1_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
            coll1_SC remove:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    self assert:(coll1_SC isEmpty).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    Transcript show:'Time to remove selectors from SortedCollection: '; show:t1_SC; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
    t2_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
            coll2_BT remove:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    self assert:(coll2_BT isEmpty).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    Transcript show:'Time to remove selectors from BinaryTree: '; show:t2_BT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    t3_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
            coll3_AT remove:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    self assert:(coll3_AT isEmpty).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    Transcript show:'Time to remove selectors from BinaryTree: '; show:t3_AT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
performance
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
    Time to insert random 100000 individually into SortedCollection: 6037ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
    Time to insert random 100000 en-bloque into SortedCollection: 172ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    Time to insert in order 100000 individually into SortedCollection: 31ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
    Time to insert in order 100000 en-bloque into SortedCollection: 125ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    Time to insert in reverse order 100000 individually into SortedCollection: 93ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    Time to insert in reverse order 100000 en-bloque into SortedCollection: 125ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
    Time to remove in random order 100000 from SortedCollection: 6380ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
    Time to remove in order 100000 from SortedCollection: 109ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
    Time to remove in reverse order 100000 from SortedCollection: 125ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
    Time to insert random 100000 individually into AATree: 281ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
    Time to insert random 100000 en-bloque into AATree: 265ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
    Time to insert in order 100000 individually into AATree: 281ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
    Time to insert in order 100000 en-bloque into AATree: 328ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
    Time to insert in reverse order 100000 individually into AATree: 203ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
    Time to insert in reverse order 100000 en-bloque into AATree: 218ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
    Time to remove in random order 100000 from AATree: 452ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
    Time to remove in order 100000 from AATree: 312ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
    TSourceCodeManager [warning]: class `CollectionBenchmarks' has neither source nor compiled-in info
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
    ime to remove in reverse order 100000 from AATree: 499ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    Time to insert random 100000 individually into BinaryTree: 156ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
    Time to insert random 100000 en-bloque into BinaryTree: 156ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
    Time to insert in order 100000 individually into BinaryTree: 195921ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
    Time to insert in order 100000 en-bloque into BinaryTree: 205266ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
    Time to insert in reverse order 100000 individually into BinaryTree: 202271ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    Time to insert in reverse order 100000 en-bloque into BinaryTree: 197684ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
    Time to remove in random order 100000 from BinaryTree: 234ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    Time to remove in order 100000 from BinaryTree: 78ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    Time to remove in reverse order 100000 from BinaryTree: 78ms
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
! !
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
!AATree methodsFor:'adding & removing'!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
add:anObject
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    "add the argument, anObject to the receiver.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
     Returns the object (sigh).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
     WARNING: do not add/remove elements while iterating over the receiver.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
              Iterate over a copy to do this."
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
    treeRoot isNil ifTrue:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
        treeRoot := AATreeNode data:anObject level:1.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
        ^ self.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
    treeRoot := treeRoot insert:anObject usingSortBlock:sortBlock.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
    ^ anObject "sigh - collection protocol"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
! !
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
!AATree class methodsFor:'documentation'!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
version
2279
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   293
    ^ '$Header: /cvs/stx/stx/libbasic2/AATree.st,v 1.2 2009-09-29 19:32:05 cg Exp $'
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   294
!
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   295
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   296
version_CVS
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   297
    ^ '$Header: /cvs/stx/stx/libbasic2/AATree.st,v 1.2 2009-09-29 19:32:05 cg Exp $'
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
! !