Results 1 
4 of
4
RealTime Deques, Multihead Turing Machines, and Purely Functional Programming
 In Conference on Functional Programming Languages and Computer Architecture
, 1993
"... We answer the following question: Can a deque (double ended queue) be implemented in a purely functional language such that each push or pop operation on either end of a queue is accomplished in O(1) time in the worst case? The answer is yes, thus solving a problem posted by Gajewska and Tarjan [1 ..."
Abstract

Cited by 12 (1 self)
 Add to MetaCart
We answer the following question: Can a deque (double ended queue) be implemented in a purely functional language such that each push or pop operation on either end of a queue is accomplished in O(1) time in the worst case? The answer is yes, thus solving a problem posted by Gajewska and Tarjan [14] and by Ponder, McGeer, and Ng [25], and refining results of Sarnak [26] and Hoogerwoord [18]. We term such a deque realtime, since its constant worstcase behavior might be useful in real time programs (assuming realtime garbage collection [3], etc.) Furthermore, we show that no restriction of the functional language is necessary, and that push and pop operations on previous versions of a deque can also be achieved in constant time. We present a purely functional implementation of real time deques and its complexity analysis. We then show that the implementation has some interesting implications, and can be used to give a realtime simulation of a multihead Turing machine in a purel...
A Randomized Implementation of Multiple Functional Arrays
 In Proceedings of 1994 ACM Conference on Lisp and Functional Programming
, 1994
"... The array update problem in the implementation of a purely functional language is the following: once an array is updated, both the original array and the newly updated one must be preserved to maintain referential transparency. Previous approaches have mainly based on the detection or enforcement o ..."
Abstract

Cited by 5 (1 self)
 Add to MetaCart
The array update problem in the implementation of a purely functional language is the following: once an array is updated, both the original array and the newly updated one must be preserved to maintain referential transparency. Previous approaches have mainly based on the detection or enforcement of singlethreaded accesses to an aggregate, by means of compilertime analyses or language restrictions. These approaches cannot deal with aggregates which are updated in a multithreaded manner. Baker's shallow binding scheme can be used to implement multithreaded functional arrays. His scheme, however, can be very expensive if there are repeated alternations between long binding paths. We design a scheme that fragments binding paths randomly. The randomization scheme is online, simple to implement, and its expected performance comparable to that of the optimal offline solutions. All this is achieved without using compilertime analyses, and without restricting the languages. The ...
A Persistent UnionFind Data Structure
"... Abstract The problem of disjoint sets, also known as unionfind, consistsin maintaining a partition of a finite set within a data structure. ..."
Abstract

Cited by 5 (0 self)
 Add to MetaCart
Abstract The problem of disjoint sets, also known as unionfind, consistsin maintaining a partition of a finite set within a data structure.
unknown title
"... destructive unifications of nongeneralized type variables must be undone when typing errors are encountered. • Decision procedures: Another example of a unionfind data structure used within a backtracking algorithm are decision procedures where the treatment of equality is usually based on such a ..."
Abstract
 Add to MetaCart
destructive unifications of nongeneralized type variables must be undone when typing errors are encountered. • Decision procedures: Another example of a unionfind data structure used within a backtracking algorithm are decision procedures where the treatment of equality is usually based on such a structure and where the boolean part of formulas is mostly processed using backtracking [13, 16]. A standard solution to the issue of backtracking in data structures is to turn to persistent data structures (as opposed to ephemeral data structures) [12]. In this case, theunion operation now returns a new partition and leaves the previous one unchanged. The signature of such a persistent data structure could be the following: module type PersistentUnionFind = sig type t val create: int → t