integer-set.ss: Integer Sets

To load: (require (lib "integer-set.ss"))

The integer-set.ss module provides functions for working with finite sets of integers. This module is designed for sets that are compactly represented as groups of intervals, even when their cardinality is large. For example, the set of integers from - 1000000 to 1000000 except for 0, can be represented as {[ - 1000000, - 1], [1, 1000000]}. This data structure would not be a good choice for the set of all odd integers between 0 and 1000000 (which would be {[1, 1], [3, 3], ... [999999, 999999]}).

In addition to the integer-set abstract type, we define a well-formed-set to be a list of pairs of exact integers, where each pair represents a closed range of integers, and the entire set is the union of the ranges. The ranges must be disjoint and increasing. Further, adjacent ranges must have at least one integer between them. For example: '((-1 . 2) (4 . 10)) is a well-formed-set as is '((1 . 1) (3 . 3)), but '((1 . 5) (6 . 7)), '((1 . 5) (-3 . -1)), '((5 . 1)), and '((1 . 5) (3 . 6)) are not.

(make-integer-set well-formed-set)      PROCEDURE

Creates an integer set from a well-formed set.

(integer-set-contents integer-set)      PROCEDURE

Produces a well-formed set from an integer set.

(set-integer-set-contents! integer-set well-formed-set)      PROCEDURE

Mutates an integer set.

(integer-set? v)      PROCEDURE

Returns #t if v is an integer set, #f otherwise.

(make-range)      

make-range/empty

Produces an empty integer set.

(make-range k)      PROCEDURE

Produces an integer set containing only k.

(make-range start-k end-k)      PROCEDURE

Produces an integer set containing the integers from start-k to end-k inclusive, where start-k <= end-k.

(intersect x-integer-set y-integer-set)      PROCEDURE

Returns the intersection of the given sets.

(difference x-integer-set y-integer-set)      PROCEDURE

Returns the difference of the given sets (i.e., elements in x-integer-set that are not in y-integer-set).

(union x-integer-set y-integer-set)      PROCEDURE

Returns the union of the given sets.

(split x-integer-set y-integer-set)      PROCEDURE

Produces three values: the first is the intersection of x-integer-set and y-integer-set, the second is the difference x-integer-set remove y-integer-set, and the third is the difference y-integer-set remove x-integer-set.

(complement integer-set start-k end-k)      PROCEDURE

Returns the a set containing the elements between start-k to end-k inclusive that are not in integer-set, where start-k <= end-k.

(xor x-integer-set y-integer-set)      PROCEDURE

Returns an integer set containing every member of x-integer-set and y-integer-set that is not in both sets.

(member? k integer-set)      PROCEDURE

Returns #t if k is in integer-set, #f otherwise.

(get-integer integer-set)      PROCEDURE

Returns a member of integer-set, or #f if integer-set is empty.

(foldr proc base-v integer-set)      PROCEDURE

Applies proc to each member of integer-set in ascending order, where the first argument to proc is the set member, and the second argument is the fold result starting with base-v. For example, (foldr cons null x) returns a list of all the integers in x, sorted in increasing order.

(partition integer-set-list)      PROCEDURE

Returns the coarsest refinement of the sets in integer-set-list such that the sets in the result list are pairwise disjoint. For example, partitioning the sets that represent '((1 . 2) (5 . 10)) and '((2 . 2) (6 . 6) (12 . 12)) produces the a list containing the sets for '((1 . 1) (5 . 5) (7 . 10)) '((2 . 2) (6 . 6)), and '((12 . 12)).

(card integer-set)      PROCEDURE

Returns the number of integers in the given integer set.

(subset? x-integer-set y-integer-set)      PROCEDURE

Returns true if every integer in x-integer-set is also in y-integer-set, otherwise #f.