(*
Sequential Doubly-linked List Search Utilities - Interface
In this section are provided several utility routines implementing
search algorithms on doubly-linked unbounded lists.
*)
DEFINITION MODULE ListDUMSearch;
(*==========================================================
Version : 1.00 18 May 1989 C. Lins
Compiler : TopSpeed Modula-2
Component: Tools - Structure Utility - Doubly-linked List Search
Revision History
v1.00 18 May 1989 C. Lins
Initial implementation.
(C) Copyright 1989 Charles A. Lins
=============================================================*)
FROM Items IMPORT
(*--Type*) Item, CompareProc;
FROM ListDUM IMPORT
(*--Type*) List;
(*--------------------*)
TYPE SuccessProc = PROCEDURE (Item);
TYPE FailureProc = PROCEDURE (Item);
(*--------------------*)
(*
PrimarySearch
Searches theList for the first occurance of theItem with the required
key. This is called the primary key search. It is assumed that the
item comparison routine knows how to extract the key from the items
if necessary. If the search succeeds then the found procedure parameter
is invoked, otherwise the notfound routine is called. The list is
assumed to be unordered.
*)
PROCEDURE PrimarySearch ( theItem : Item (*-- in *);
theList : List (*-- in *);
keysEqual : CompareProc (*-- in *);
found : SuccessProc (*-- in *);
notFound : FailureProc (*-- in *));
(*
SecondarySearch
Searches theList for every occurance of theItem with the required
key. This is called the secondary key search. It is assumed that the
item comparison routine knows how to extract the key from the items
if necessary. Each time the search succeeds the found procedure parameter
is invoked. The list is assumed to be unordered.
*)
PROCEDURE SecondarySearch ( theItem : Item (*-- in *);
theList : List (*-- in *);
keysEqual : CompareProc (*-- in *);
found : SuccessProc (*-- in *));
(*
Self-organizing Sequential Search - MoveToFront
This routine is essentially the primary key search modified to apply
a heuristic for improving the list ordering. When a key is found,
theItem is moved to the front of the list. The idea is that the
access distribution of items in the list is unequal, and therefore,
the most frequently accessed items should be closer to the front.
For a sophisticated analysis comparing self-organizing heuristics
see reference [1].
*)
PROCEDURE MoveToFront ( theItem : Item (*-- in *);
VAR theList : List (*-- inout *);
keysEqual : CompareProc (*-- in *);
found : SuccessProc (*-- in *);
notFound : FailureProc (*-- in *));
(*
Self-organizing Sequential Search - Transpose
Instead of moving the found item to the front of the list, the Transpose
heuristic moves the item one position closer to the front by swapping
positions with its predecessor.
*)
PROCEDURE Transpose ( theItem : Item (*-- in *);
VAR theList : List (*-- inout *);
keysEqual : CompareProc (*-- in *);
found : SuccessProc (*-- in *);
notFound : FailureProc (*-- in *));
END ListDUMSearch.
(*
References
[1] J.L. Bentley and C.C. McGeoch, Worst-Case Analyses of
Self-Organizing Sequential Search Heuristics,
Carnegie-Mellon University, 1983.
[2] G.H. Gonnet, Handbook of Algorithms and Data Structures,
Searching Algorithms, Addison-Wesley, London 1984,
pp. 23-30.
*)