streching storage manager

Marcin 'Qrczak' Kowalczyk qrczak@knm.org.pl
29 Sep 2001 07:39:39 GMT


Sat, 29 Sep 2001 10:24:52 +0800 (GMT-8), Saswat Anand <saswatan@comp.nus.edu.sg> pisze:

> As regard to Marcin's suggestion of using a list of compact arrays,
> although elements can be accessed faster, there will be a lot if
> redundancy since windows are overlapping. So consecutive arrays
> will contain almost same data. 

I didn't mean to make them overlapping. Splitting into arrays is
arbitrary. This can be made an abstract type. One possibility
(perhaps another is needed):

data CompactQueue a =
    CL [Array Int a] -- front
       [Array Int a] -- rear; becomes front (reversed) after front empty
       !Int          -- block size, set during creation
       !Int          -- offset in the head of front - this many elements
                     -- logically don't exist
       !Int          -- similarly, offset in the head of rear

emptyQueue :: Int -> CompactQueue a
-- Argument is block size.

push :: CompactQueue a -> [a] -> CompactQueue a
-- Add elements to the end.
-- O(block_size) because it must copy one array.

(!!) :: CompactQueue a -> Int -> a
-- O(index/block_size).

drop :: Int -> CompactQueue a -> CompactQueue a
-- This can keep up to block_size elements too many in memory
-- (in the head of front). Amortized O(n/block_size).

When block_size is 1, it degenerates to a plain list or queue
(implemented using one-element arrays).

-- 
 __("<  Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/
 \__/
  ^^                      SYGNATURA ZASTĘPCZA
QRCZAK