http://qs321.pair.com?node_id=35202

Q&A > Data Structures > set theory w/hashes? arrays? done quickly? - Answer contributed by fundflow

There has to be a better way using array slices...... got it

Here is an example for union:
%s1=('a'=>1, 'b'=>1, 'c'=>1); %s2=('a'=>1, 'c'=>1, 'd'=>1); print "Set 1 has: ", join(",",keys %s1), " Set 2 has: ", join(",", k +eys %s2),"\n"; %j=%s1; @j{keys %s2}=1; print "Union is ", join(",", keys %j), "\n";
I don't really know how to remove elements from the hash.

In the above example, the hash keys are the elements of the set. If you let the set be the elements in the hash that also have a nonzero value, then the same technique can be used for intersection:
%inter=%s1; @inter{%s2}=0;


Also, to answer the original poster: if "REALLY large" is really large, and doesnt fit in the main memory then you might want to store the sets in sorted files and merge them smartly to compute the union/intersection.

Replies are listed 'Best First'.
(tye)RE: Answer: set theory w/hashes? arrays? done quickly?
by tye (Sage) on Oct 04, 2000 at 04:11 UTC

    I don't really know how to remove elements from the hash.

    That reminded me that you can subtract %h2 from %h1 via:

    delete @h1{ keys %h2 };

            - tye (but my friends call me "Tye")