AATree.st
author Jan Vrany <jan.vrany@labware.com>
Wed, 30 Jun 2021 14:07:56 +0100
branchjv
changeset 5481 19d6355dc3e1
parent 4142 908574f121e4
child 4682 1ccfb8cb8f96
permissions -rw-r--r--
Cherry-picked `Unicode32String` from 48677b66883e: cherry-picked Unicode32String.st from 48677b66883e: * cb05c61f9204: #FEATURE by stefan, Stefan Vogel <sv@exept.de> * 5f6a992925c2: #DOCUMENTATION by stefan, Stefan Vogel <sv@exept.de> * 45176601c636: #BUGFIX by exept, Claus Gittinger <cg@exept.de> * d6f50be034db: #REFACTORING by stefan, Stefan Vogel <sv@exept.de> * ae8ed6040c96: #REFACTORING by stefan, Stefan Vogel <sv@exept.de>
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
3537
4139da619f6e class: AATree
Claus Gittinger <cg@exept.de>
parents: 2783
diff changeset
    14
"{ NameSpace: Smalltalk }"
4139da619f6e class: AATree
Claus Gittinger <cg@exept.de>
parents: 2783
diff changeset
    15
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
BinaryTree subclass:#AATree
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	instanceVariableNames:''
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	classVariableNames:''
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	poolDictionaries:''
2761
d53b683402c1 category changes
Claus Gittinger <cg@exept.de>
parents: 2760
diff changeset
    20
	category:'Collections-Ordered-Trees'
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!AATree class methodsFor:'documentation'!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
2279
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    25
copyright
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    26
"
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    27
 COPYRIGHT (c) 2009 by eXept Software AG
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    28
              All Rights Reserved
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    29
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    30
 This software is furnished under a license and may be used
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    31
 only in accordance with the terms of that license and with the
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    33
 be provided or otherwise made available to, or used by, any
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    34
 other person.  No title to or ownership of the software is
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    35
 hereby transferred.
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    36
"
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    37
!
cb00c64a12f9 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
    38
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
documentation
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    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
    42
    AA trees are named for Arne Andersson, their inventor.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    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
    45
    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
    46
    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
    47
    For performance data, see performance.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
3537
4139da619f6e class: AATree
Claus Gittinger <cg@exept.de>
parents: 2783
diff changeset
    49
    Usage:
4139da619f6e class: AATree
Claus Gittinger <cg@exept.de>
parents: 2783
diff changeset
    50
        As seen in the performance charts, AA trees offer better average and worst case
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
    51
        performance, with a slightly lower best case performance. 
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
    52
        Thus providing a more predictable performance 
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
    53
        (within a factor of 2, as opposed to a much wider range for sortedCollections)
3537
4139da619f6e class: AATree
Claus Gittinger <cg@exept.de>
parents: 2783
diff changeset
    54
4142
908574f121e4 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
    55
    [instance variables:]
908574f121e4 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
    56
        treeRoot             TreeNode        the top node
908574f121e4 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
    57
        sortBlock            Block           sorter; 
908574f121e4 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
    58
                                             gets two args a,b and should return true if a is
908574f121e4 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
    59
                                             to come before b in the collection    
908574f121e4 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
    60
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    [author:]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
        Original algorithm by Arne Andersson
4114
0d2e2a31ff6d #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3537
diff changeset
    63
        ported from wikipedia to Smalltalk code by Claus Gittinger
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
    64
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
    65
    [see also:]
4142
908574f121e4 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
    66
        BTree
908574f121e4 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
    67
        SortedCollection
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
    68
        https://en.wikipedia.org/wiki/AA_tree
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
examples
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
                                                                [exBegin]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
    |coll|
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    coll := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    (1 to:10) do:[:i | coll add:i].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
    coll addAll:(20 to:30).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    coll inspect   
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
                                                                [exBegin]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
    |tree|
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    tree := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    tree add:'hello'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    tree add:'aaaa'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    tree add:'AAAb'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    tree add:'aaaC'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    tree add:'world'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    tree asOrderedCollection     
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
                                                                [exBegin]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    |tree|
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    tree := AATree sortBlock:[:a :b | a asLowercase < b asLowercase].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    tree add:'hello'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    tree add:'aaaa'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    tree add:'AAAb'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    tree add:'aaaC'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    tree add:'world'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    tree asOrderedCollection     
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    timing 1:
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
                                                                [exBegin]
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   109
    |N randomNumbers coll1_BT coll2_AT coll3_SC coll4_AVL t1_BT t2_AT t3_SC t4_AVL|
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    N := 1000000.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    randomNumbers := (1 to:N) collect:[:i | Random nextInteger].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    t1_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
        coll1_BT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
        coll1_BT addAll:randomNumbers
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    coll1_BT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    t2_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
        coll2_AT := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
        coll2_AT addAll:randomNumbers
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    coll2_AT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
    t3_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
        coll3_SC := SortedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
        coll3_SC addAll:randomNumbers
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    coll3_SC := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    ObjectMemory garbageCollect.
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   135
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   136
    t4_AVL := Time millisecondsToRun:[
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   137
        coll4_AVL := AVLTree new.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   138
        coll4_AVL addAll:randomNumbers
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   139
    ].
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   140
    coll4_AVL := nil.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   141
    ObjectMemory garbageCollect.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   142
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    randomNumbers := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    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
   146
    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
   147
    Transcript show:'Time to insert random '; show:N; show:' into AATree: '; show:t2_AT; showCR:'ms'.
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   148
    Transcript show:'Time to insert random '; show:N; show:' into AVLTree: '; show:t4_AVL; showCR:'ms'.
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    t1_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
        coll1_BT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
        coll1_BT addAll:(1 to:100000).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    coll1_BT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
    t2_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
        coll2_AT := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
        coll2_AT addAll:(1 to:100000)
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
    coll2_AT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
    t3_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
        coll3_SC := SortedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
        coll3_SC addAll:(1 to:100000)
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
    coll3_SC := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   172
    t4_AVL := Time millisecondsToRun:[
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   173
        coll4_AVL := AVLTree new.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   174
        coll4_AVL addAll:(1 to:100000)
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   175
    ].
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   176
    coll4_AVL := nil.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   177
    ObjectMemory garbageCollect.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   178
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
    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
   180
    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
   181
    Transcript show:'Time to insert ordered '; show:N; show:' into AATree: '; show:t2_AT; showCR:'ms'.
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   182
    Transcript show:'Time to insert ordered '; show:N; show:' into AVLTree: '; show:t4_AVL; showCR:'ms'.
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    t1_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
        coll1_BT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
        coll1_BT addAll:(100000 downTo:1).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    coll1_BT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    t2_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
        coll2_AT := AATree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
        coll2_AT addAll:(100000 downTo:1)
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
    coll2_AT := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
    t3_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
        coll3_SC := SortedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
        coll3_SC addAll:(100000 downTo:1)
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    coll3_SC := nil.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
    ObjectMemory garbageCollect.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   206
    t4_AVL := Time millisecondsToRun:[
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   207
        coll4_AVL := AVLTree new.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   208
        coll4_AVL addAll:(100000 downTo:1)
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   209
    ].
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   210
    coll4_AVL := nil.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   211
    ObjectMemory garbageCollect.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   212
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    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
   214
    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
   215
    Transcript show:'Time to insert reverse ordered '; show:N; show:' into AATree: '; show:t2_AT; showCR:'ms'.
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   216
    Transcript show:'Time to insert reverse ordered '; show:N; show:' into AVLTree: '; show:t4_AVL; showCR:'ms'.
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
  timing 2:  
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
                                                                [exBegin]
2760
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   221
    |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
   222
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    allSelectors := OrderedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    Smalltalk allClassesDo:[:cls |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
        cls instAndClassSelectorsAndMethodsDo:[:sel :mthd |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
            allSelectors add:sel.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    ].
2760
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   229
    Transcript show:'Unique selectors: '; show:allSelectors asSet size; showCR:''.
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    t1_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
        coll1_SC := SortedCollection new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
            coll1_SC add:sel
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
    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
   238
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    t2_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
        coll2_BT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
            coll2_BT add:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    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
   246
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
    t3_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
        coll3_AT := BinaryTree new.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
            coll3_AT add:sel
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
    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
   254
2760
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   255
    t4_Trie := Time millisecondsToRun:[
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   256
        coll4_Trie := TrieCollection new.
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   257
        allSelectors do:[:sel |
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   258
            coll4_Trie add:sel
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   259
        ].
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   260
    ].
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   261
    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
   262
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
    t1_SC := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
            coll1_SC remove:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    self assert:(coll1_SC isEmpty).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    Transcript show:'Time to remove selectors from SortedCollection: '; show:t1_SC; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
    t2_BT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
            coll2_BT remove:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    self assert:(coll2_BT isEmpty).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    Transcript show:'Time to remove selectors from BinaryTree: '; show:t2_BT; showCR:'ms'.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
    t3_AT := Time millisecondsToRun:[
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
        allSelectors do:[:sel |
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
            coll3_AT remove:sel
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
        ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
    self assert:(coll3_AT isEmpty).
2760
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   285
    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
   286
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   287
    t4_Trie := Time millisecondsToRun:[
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   288
        allSelectors do:[:sel |
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   289
            coll4_Trie remove:sel
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   290
        ].
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   291
    ].
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   292
    self assert:(coll4_Trie isEmpty).
6e119df458a9 changed: #examples
Claus Gittinger <cg@exept.de>
parents: 2404
diff changeset
   293
    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
   294
                                                                [exEnd]
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
performance
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
"
4118
133a764788a1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4116
diff changeset
   301
    warning: the times below are very old, taken on a pentium-class machine.
133a764788a1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4116
diff changeset
   302
    Your times will be much shorter, so only look at the ratios.
133a764788a1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4116
diff changeset
   303
    
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   304
    SortedCollection keeps the collection sorted and dense.
4118
133a764788a1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4116
diff changeset
   305
    It is super fast, when adding in 'almost sorted' or almost reverse-sorted order, 
133a764788a1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4116
diff changeset
   306
    or when only a few elements are to be added later.
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   307
    To create a big sorted collection, it is better to first collect them all unsorted in
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   308
    an orderedCollection, then convert in one operation using asSortedCollection.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   309
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   310
        Time to insert random 100000 individually into SortedCollection: 6037ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   311
        Time to insert random 100000 en-bloque into SortedCollection: 172ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   312
        Time to insert in order 100000 individually into SortedCollection: 31ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   313
        Time to insert in order 100000 en-bloque into SortedCollection: 125ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   314
        Time to insert in reverse order 100000 individually into SortedCollection: 93ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   315
        Time to insert in reverse order 100000 en-bloque into SortedCollection: 125ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   316
        Time to remove in random order 100000 from SortedCollection: 6380ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   317
        Time to remove in order 100000 from SortedCollection: 109ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   318
        Time to remove in reverse order 100000 from SortedCollection: 125ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   319
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   320
    BinaryTree (which is not balancing) degenerates to a linear list, 
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   321
    if elements come in already sorted or reverse sorted,
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   322
    but behaves better than AATree if they come in randomly:
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   324
        Time to insert random 100000 individually into BinaryTree: 156ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   325
        Time to insert random 100000 en-bloque into BinaryTree: 156ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   326
        Time to insert in order 100000 individually into BinaryTree: 195921ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   327
        Time to insert in order 100000 en-bloque into BinaryTree: 205266ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   328
        Time to insert in reverse order 100000 individually into BinaryTree: 202271ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   329
        Time to insert in reverse order 100000 en-bloque into BinaryTree: 197684ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   330
        Time to remove in random order 100000 from BinaryTree: 234ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   331
        Time to remove in order 100000 from BinaryTree: 78ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   332
        Time to remove in reverse order 100000 from BinaryTree: 78ms
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
4116
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   334
    AATree is slower than the best-case above (because it keeps the tre balanced), 
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   335
    but has a much better worst case performance.
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   336
    Thus providing a more predictable performance (all roughly within a factor of 2):
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   337
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   338
        Time to insert random 100000 individually into AATree: 281ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   339
        Time to insert random 100000 en-bloque into AATree: 265ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   340
        Time to insert in order 100000 individually into AATree: 281ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   341
        Time to insert in order 100000 en-bloque into AATree: 328ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   342
        Time to insert in reverse order 100000 individually into AATree: 203ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   343
        Time to insert in reverse order 100000 en-bloque into AATree: 218ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   344
        Time to remove in random order 100000 from AATree: 452ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   345
        Time to remove in order 100000 from AATree: 312ms
c71eb5c37a14 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4114
diff changeset
   346
        Time to remove in reverse order 100000 from AATree: 499ms
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
"
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
! !
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
!AATree methodsFor:'adding & removing'!
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
add:anObject
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
    "add the argument, anObject to the receiver.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
     Returns the object (sigh).
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
     WARNING: do not add/remove elements while iterating over the receiver.
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
              Iterate over a copy to do this."
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    treeRoot isNil ifTrue:[
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   360
        treeRoot := self treeNodeClass data:anObject level:1.
2783
4d98d582fa06 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2780
diff changeset
   361
    ] ifFalse:[
4d98d582fa06 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2780
diff changeset
   362
        treeRoot := treeRoot insert:anObject usingSortBlock:sortBlock.
2266
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
    ].
d04df8bb00ea initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
    ^ anObject "sigh - collection protocol"
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   365
2783
4d98d582fa06 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2780
diff changeset
   366
    "Modified: / 05-08-2012 / 12:36:26 / cg"
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   367
!
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   368
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   369
treeNodeClass
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   370
    ^ AATreeNode
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   371
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   372
    "Created: / 05-08-2012 / 11:39:29 / cg"
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   373
! !
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   374
2780
Claus Gittinger <cg@exept.de>
parents: 2769
diff changeset
   375
!AATree class methodsFor:'documentation'!
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   376
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   377
version
4114
0d2e2a31ff6d #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3537
diff changeset
   378
    ^ '$Header$'
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   379
!
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   380
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   381
version_CVS
4114
0d2e2a31ff6d #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3537
diff changeset
   382
    ^ '$Header$'
2769
711bb03cb3c1 node class is private
Claus Gittinger <cg@exept.de>
parents: 2761
diff changeset
   383
! !
3537
4139da619f6e class: AATree
Claus Gittinger <cg@exept.de>
parents: 2783
diff changeset
   384