PriorityQueue.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 5371 6024e3a1c911
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4523
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
     1
"{ Encoding: utf8 }"
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
     2
5371
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
     3
"
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
     4
 COPYRIGHT (c) 2018 by eXept Software AG
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
     5
              All Rights Reserved
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
     6
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
     7
 This software is furnished under a license and may be used
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
     8
 only in accordance with the terms of that license and with the
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    10
 be provided or otherwise made available to, or used by, any
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    11
 other person.  No title to or ownership of the software is
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    12
 hereby transferred.
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    13
"
3600
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
"{ Package: 'stx:libbasic2' }"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
"{ NameSpace: Smalltalk }"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
Collection subclass:#PriorityQueue
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	instanceVariableNames:'size maxSize heap comparator'
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	classVariableNames:''
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	category:'Collections-Ordered'
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!PriorityQueue class methodsFor:'documentation'!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
5371
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    27
copyright
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    28
"
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    29
 COPYRIGHT (c) 2018 by eXept Software AG
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    30
              All Rights Reserved
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    31
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    32
 This software is furnished under a license and may be used
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    33
 only in accordance with the terms of that license and with the
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    35
 be provided or otherwise made available to, or used by, any
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    36
 other person.  No title to or ownership of the software is
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    37
 hereby transferred.
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    38
"
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    39
!
6024e3a1c911 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4523
diff changeset
    40
3600
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
documentation
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    a priority queue is a collection with a given maximum size
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    which only keeps the maxSize largest values.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    Only up to maxSize elements are stored at any time.
4149
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    46
    The internal organization is a heap; 
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    47
    eg. elements are not kept sorted internally.
3600
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
4149
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    49
    When elements are added, a check is made, 
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    50
    if the new element should be kept or not.
3600
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    Finally, when all elements have been added,
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    get the elements in sorted order by repeated calls to removeFirst,
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    which will remove and return the smallest element.
4149
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    55
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    56
    [author:]
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    57
        Claus Gittinger
3600
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
examples
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
"
4149
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    63
  find the 10 largest files in the stx source tree
3600
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
                                                            [exBegin]
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    |pq dir|
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    pq := PriorityQueue new:10 comparator:[:a :b | a fileSize > b fileSize].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    dir := '../../' asFilename.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    dir directoryContentsAsFilenamesDo:[:eachLib |
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
        (eachLib baseName startsWith:'lib') ifTrue:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
            eachLib filesWithSuffix:'st' do:[:fn |
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
                pq add:fn
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
            ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
        ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
    ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
    [ pq notEmpty ] whileTrue:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
        |next|
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
        next := pq removeFirst.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
        Transcript show:next fileSize; space; showCR:next pathName
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
    ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
                                                            [exEnd]
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
4149
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    84
  generate 1 million random numbers and show the 10 largest
3600
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
                                                            [exBegin]
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    |pq|
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    pq := PriorityQueue new:10.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    1000000 timesRepeat:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
        pq add:(Random nextInteger).
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    [ pq notEmpty ] whileTrue:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
        Transcript showCR:pq removeFirst.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
    ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
                                                            [exEnd]
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
4149
626c3a6631e8 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
    97
  a little test
3600
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
                                                            [exBegin]
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    |pq|
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    #(10 20 30 40 50 60 70 80) permutationsDo:[:p |
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
        pq := PriorityQueue new:5.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
        pq addAll:p.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
        self assert:(pq contents copy sort = #(40 50 60 70 80)).
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
                                                            [exEnd]
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
! !
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
!PriorityQueue class methodsFor:'instance creation'!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
new:maxSize
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    "retun a new PriorityQueue, which holds at most maxNode elements,
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
     the largest one's added"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
    ^ self new initializeFor:maxSize
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
new:maxSize comparator:aBlock
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    "retun a new PriorityQueue, which holds at most maxNode elements,
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
     the largest one's added"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    ^ self new initializeFor:maxSize comparator:aBlock
4523
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
   124
!
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
   125
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
   126
newWithCapacity:size
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
   127
    "return a new empty Collection with capacity for n elements."
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
   128
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
   129
    ^ self new:size
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
   130
65f5494c3fa6 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 4149
diff changeset
   131
    "Created: / 10-10-2017 / 17:52:55 / stefan"
3600
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
! !
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
!PriorityQueue methodsFor:'adding'!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
add:anElement
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    "if the argument is larger than the currently smallest element,
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
     then add it and remove the smallest.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
     Otherwise do nothing"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
    size < maxSize ifTrue:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
        size := size + 1.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
        heap at:size put:anElement.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
        self upHeap.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    ] ifFalse:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
        (comparator value:anElement value:(heap at:1)) ifTrue:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
            heap at:1 put:anElement.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
            self downHeap.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
        ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    ]
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    "
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
     |pq|
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
     pq := PriorityQueue new:5.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
     pq add:1.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
     pq add:10.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
     pq add:5.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
     pq add:9.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
     pq add:17.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
     pq add:-1.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
     pq add:29.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
     pq
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
    "
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
isEmpty
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    ^ size == 0
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
size
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    ^ size
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
! !
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
!PriorityQueue methodsFor:'enumerating'!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
do:aBlock
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
    heap from:1 to:size do:aBlock
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
! !
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
!PriorityQueue methodsFor:'initialization'!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
comparator:aBlock
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    comparator := aBlock
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
initializeFor:maxSizeArg
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
    self assert:(maxSizeArg > 0).
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    heap := Array new:maxSizeArg.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    maxSize := maxSizeArg.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    size := 0.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
    comparator := [:a :b | a > b].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
initializeFor:maxSizeArg comparator:aBlock
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
    self initializeFor:maxSizeArg.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
    comparator := aBlock
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
! !
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
!PriorityQueue methodsFor:'private'!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
contents
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
    "return the current contents.   
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
     It is not sorted by size, but a heap structure"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
    ^ heap
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
downHeap
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
    "an element was added at the bottom of the heap;
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
     shift it to its place"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    |i j k node|
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    i := 1.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    node := heap at:i.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
    j := i * 2.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
    k := j + 1.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    ((k <= size) and:[ comparator value:(heap at:j) value:(heap at:k)]) ifTrue:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
        j := k
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
    ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    [ (j <= size) and:[ comparator value:node value:(heap at:j) ]] whileTrue:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
        heap at:i put:(heap at:j).
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
        i := j.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
        j := j * 2.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
        k := j + 1.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
        ((k <= size) and:[ comparator value:(heap at:j) value:(heap at:k)]) ifTrue:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
            j := k
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
        ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
    heap at:i put:node
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
upHeap
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    "an element was added to the top of the heap;
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
     shift it to its place"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
    |i j node|
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    i := size.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
    node := heap at:i.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    j := i // 2.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    [ (j > 0) and:[ comparator value:(heap at:j) value:node ]] whileTrue:[
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
        heap at:i put:(heap at:j).
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
        i := j.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
        j := j // 2
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
    ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
    heap at:i put:node
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
! !
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
!PriorityQueue methodsFor:'removing'!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
removeAll
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
    size := 0
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
removeFirst
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
    "removes and returns the smallest element from the priority queue"
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
    |rslt|
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
    size == 0 ifTrue:[ self emptyCollectionError ].
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    rslt := heap at:1.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
    heap at:1 put:(heap at:size).
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    size := size - 1.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    self downHeap.
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
    ^ rslt
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
! !
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
!PriorityQueue class methodsFor:'documentation'!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
version
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    ^ '$Header$'
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
!
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
version_CVS
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
    ^ '$Header$'
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
! !
0b9a0892f116 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282