[Newbies] Re: Another extension proposal -> subsets

Klaus D. Witzel klaus.witzel at cobss.com
Fri Jul 25 05:38:58 UTC 2008


On Thu, 24 Jul 2008 20:09:53 +0200, Zulq Alam wrote:

> Klaus D. Witzel wrote:
>
>> Squeak looks to be already fast in this case, your routine is almost  
>> optimal :) Implementing it in Set so that Set's internal can be of  
>> benefit won't bring these figures down much -- what remains is (aSet  
>> includes: another), times #copyWithout: loop, and that seems to be  
>> unavoidable.
>
> It's significantly faster with a more appropriate hashing function:
>
> {2->0 . 3->0 . 4->1 . 5->1 . 6->3 . 7->9 . 8->22 . 9->59 . 10->138 .  
> 11->305 . 12->686 . 13->1640 . 14->4366 . 15->10550 . 16->28104 .  
> 17->93373 . 18->303425}

This is very good for small n :)

> combinations
>    | combinations |
>    combinations := (PluggableSet new: (2 raisedTo: self size))
>      hashBlock:
>        [:aSet |
>        aSet
>          inject: aSet size
>          into: [:hash :each | hash * each hash + each]];
>      yourself.
>    self combinationsInto: combinations.
>    ^ combinations
>
> combinationsInto: aSet
>    (aSet includes: self) ifTrue: [^ self].
>    aSet add: self.
>    self do:
>      [:each |
>      (self copyWithout: each) combinationsInto: aSet].	
>
> I think the problem is that most of the sets contain similar data so the  
> hashes (calculated with bitXor) tend towards to a small set of values.  
> This means there are a lot of collisions and each #add: and #includes:  
> is very expensive.
>
>>  How about naming
>>  Collection>>#asPowerset
>>     ^ self asSet powersetInto: (Set new: (2 raisedTo: self size))
>>  with Set>>#powersetInto: and putting that into the next release.
>>
>
> Even now, I'm still not clear on how one takes a change like this and  
> drives it into a squeak release - Tests, Mantis, then what?

Put it on Mantis as enhancement into the collection category. The rest  
follows automatically ;) I suggest to put something like "fast powerset  
method for collections" into the summary line.

> Z.



More information about the Beginners mailing list