[squeak-dev] Why do Heap re-sort when it removes elements ?

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Thu Sep 30 18:03:27 UTC 2010


2010/9/30 Levente Uzonyi <leves at elte.hu>:
> On Thu, 30 Sep 2010, Nicolas Cellier wrote:
>
>> Hi,
>> I just saw this:
>>
>> Heap>>privateRemoveAt: index
>>        "Remove the element at the given index and make sure the sorting
>> order is okay"
>>        | removed |
>>        removed := array at: index.
>>        array at: index put: (array at: tally).
>>        array at: tally put: nil.
>>        tally := tally - 1.
>>        index > tally ifFalse:[
>>                "Use #downHeapSingle: since only one element has been
>> removed"
>>                self downHeapSingle: index].
>>        ^removed
>>
>> This means that an element removal triggers a new sort phase... (even
>> a simplified one costs)
>
> This method just restores the heap invariant, it doesn't sort the heap. It
> has O(log(n)) time complexity.
>
>> I think this could be more efficient:
>>
>> Heap>>privateRemoveAt: index
>>        "Remove the element at the given index and make sure the sorting
>> order is okay"
>>        | removed |
>>        removed := array at: index.
>>        tally := tally - 1.
>>        array replaceFrom: index to: tally with: array startingAt: index +
>> 1.
>>        array at: tally + 1 put: nil.
>>        indexUpdateBlock ifNotNil: [
>>                index to: tally do: [:i | self updateObjectIndex: i]].
>>        ^removed
>>
>> Did I miss a good reason justifying to re-sort ?
>
> The method comment is a bit misleading because the method doesn't really
> sort the heap.
>
>
> Levente
>

Ah yes, of course, my mistake... It's equivalent to a tree.
I was blinded by the assumption that #do: would enumerate in sort
order, which it does not (but we don't care, we won't enumerate past
the #first).
Hmm gonna have a class comment to document...

Nicolas

>>
>> Nicolas
>>
>>
>
>



More information about the Squeak-dev mailing list