Demo Data from EDBT 2026 / reviewers in the wild / expert
Chris Okasaki
dblp:25/2480
· DBLP profile ↗
14ranked-venue papers
12as first author
0since 2021 · last 2005
—ORCID · none
Domains — the database's venue-derived domains; a paper can count in several
Software engineering, systems software and programming languages · 11 · 10 first-authorTheory of computation · 2 · 1 first-authorHuman-computer interaction and ubiquitous computing · 1 · 1 first-author
Expertise — from the expertise taxonomy: the topics of the expert's papers under the CCF categories. A weight counts papers with recency: 1 for a paper about the topic, 0.3 when the topic is its context, halved every five years.
| Theoretical computer science
2 papers |
Algorithms and data structures · 100% | |
| Software engineering, system software, and programming languages
1 paper |
Programming languages and type systems · 100% |
Topics — the 3 heaviest of 3, each with the papers that count most for it
| Topic | Weight | Papers | Last | Evidence papers |
|---|---|---|---|---|
Algorithms and data structures › dynamic data structures
persistent data structures |
0.0 | 2 | 2000 | Simple Confluently Persistent Catenable Lists · SIAM J. Comput. 2000 Amortization, Lazy Evaluation, and Persistence: Lists with Catenation via Lazy Linking · FOCS 1995 |
Programming languages and type systems
functional programming |
0.0 | 1 | 1995 | Amortization, Lazy Evaluation, and Persistence: Lists with Catenation via Lazy Linking · FOCS 1995 |
Programming languages and type systems
lazy evaluation |
0.0 | 1 | 1995 | Amortization, Lazy Evaluation, and Persistence: Lists with Catenation via Lazy Linking · FOCS 1995 |
Methods — techniques the papers use, named apart from their topics
amortized analysis · 0.1lazy evaluation · 0.0functional programming · 0.0memoization · 0.0
| Year | Publication | Venue | Position |
|---|---|---|---|
| 2005 | Alternatives to two classic data structures
Chris Okasaki |
SIGCSE | 1 |
| 2003 | Theoretical PearlsabstractA combinator expression is flat if it can be written without parentheses, that is, if all applications nest to the left, never to the right. This note explores a simple method for flattening combinator expressions involving arbitrary combinators. Chris Okasaki |
J. Funct. Program. | 1 |
| 2002 | Techniques for embedding postfix languages in HaskellabstractOne popular use for Haskell in recent years has been as a host language for domain-specific embedded languages. But how can one embed a postfix language in Haskell, given that Haskell only supports prefix and infix syntax? This paper describes several such embeddings for increasingly complex postfix languages. Chris Okasaki |
Haskell | 1 |
| 2000 | Breadth-first numbering: lessons from a small exercise in algorithm designabstractEvery programmer has blind spots. Breadth-first numbering is an interesting toy problem that exposes a blind spot common to many---perhaps most---functional programmers. Chris Okasaki |
ICFP | 1 |
| 2000 | Simple Confluently Persistent Catenable ListsabstractWe consider the problem of maintaining persistent lists subject to concatenation and to insertions and deletions at both ends. Updates to a persistent data structure are nondestructive---each operation produces a new list incorporating the change, while keeping intact the list or lists to which it applies. Although general techniques exist for making data structures persistent, these techniques fail for structures that are subject to operations, such as catenation, that combine two or more versions. In this paper we develop a simple implementation of persistent double-ended queues (deques) with catenation that supports all deque operations in constant amortized time. Our implementation is functional if we allow memoization. Haim Kaplan, Chris Okasaki, Robert E. Tarjan |
SIAM J. Comput. | 2 |
| 1999 | From Fast Exponentiation to Square Matrices: An Adventure in TypesabstractSquare matrices serve as an interesting case study in functional programming. Common representations, such as lists of lists, are both inefficient---at least for access to individual elements---and error-prone, because the compiler cannot enforce "squareness". Switching to a typical balanced-tree representation solves the first problem, but not the second. We develop a representation that solves both problems: it offers logarithmic access to each individual element and it captures the shape invariants in the type, where they can be checked by the compiler. One interesting feature of our solution is that it translates the well-known fast exponentiation algorithm to the level of types. Our implementation also provides a stress test for today's advanced type systems---it uses nested types, polymorphic recursion, higher-order kinds, and rank-2 polymorphism. Chris Okasaki |
ICFP | 1 |
| 1999 | Red-Black Trees in a Functional SettingabstractEverybody learns about balanced binary search trees in their introductory computer science classes, but even the stouthearted tremble at the thought of actually implementing such a beast. The details surrounding rebalancing are usually just too messy. To show that this need not be the case, we present an algorithm for insertion into red-black trees (Guibas and Sedgewick, 1978) that any competent programmer should be able to implement in fifteen minutes or less. Chris Okasaki |
J. Funct. Program. | 1 |
| 1998 | Functional Pearl: Even Higher-Order Functions for ParsingabstractA higher-order function is a function that takes another function as an argument or returns another function as a result. More specifically, a first-order function takes and returns base types, such as integers or lists. A k th-order function takes or returns a function of order k −1. Currying often artificially inflates the order of a function, so we will ignore all inessential currying. (Whether a particular instance of currying is essential or inessential is open to debate, but we expect that our choices will be uncontroversial.) In addition, when calculating the order of a polymorphic function, we instantiate all type variables with base types. Under these assumptions, most common higher-order functions, such as map and foldr , are second-order, so beginning functional programmers often wonder: What good are functions of order three or above? We illustrate functions of up to sixth-order with examples taken from a combinator parsing library. Combinator parsing is a classic application of functional programming, dating back to at least Burge (1975). Most combinator parsers are based on Wadler's list-of-successes technique (Wadler, 1985). Hutton (1992) popularized the idea in his excellent tutorial Higher-Order Functions for Parsing . In spite of the title, however, he considered only functions of up to order three. Chris Okasaki |
J. Funct. Program. | 1 |
| 1997 | Catenable Double-Ended QueuesabstractCatenable double-ended queues are double-ended queues (deques) that support catenation (i.e., append) efficiently without sacrificing the efficiency of other operations. We present a purely functional implementation of catenable deques for which every operation, including catenation, takes O(1) amortized time. Kaplan and Tarjan have independently developed a much more complicated implemen-tation of catenable deques that achieves similar worst-case bounds. The two designs are superficially similar, but differ in the underlying mechanism used to achieve efficiency in a persistent setting (i.e., when used in a non-single-threaded fashion). Their implementation uses a technique called recursive slowdown, while ours relies on the simpler mechanism of lazy evaluation.Besides lazy evaluation, our implementation also exemplifies the use of two additional language features: polymorphic recursion and views. Neither is indispensable, but both significantly simplify the presentation. Chris Okasaki |
ICFP | 1 |
| 1997 | Three Algorithms on Braun TreesabstractAmong the many flavours of balanced binary trees, Braun trees (Braun and Rem, 1983) are perhaps the most circumscribed. For any given node of a Braun tree, the left subtree is either exactly the same size as the right subtree, or one element larger. Braun trees always have minimum height, and the shape of each Braun tree is completely determined by its size. In return for this rigor, algorithms that manipulate Braun trees are often exceptionally simple and elegant, and need not maintain any explicit balance information. Braun trees have been used to implement both flexible arrays (Braun and Rem, 1983; Hoogerwoord, 1992; Paulson, 1996) and priority queues (Paulson, 1996; Bird, 1996). Most operations involving a single element (e.g. adding, removing, inspecting or updating an element) take O (log n ) time, since the trees are balanced. We consider three algorithmically interesting operations that manipulate entire trees. First, we give an O (log 2 n ) algorithm for calculating the size of a tree. Second, we show how to create a tree containing n copies of some element x in O (log n ) time. Finally, we describe an order-preserving algorithm for converting a list to a tree in O ( n ) time. This last operation is not nearly as straightforward as it sounds! Chris Okasaki |
J. Funct. Program. | 1 |
| 1996 | The Role of Lazy Evaluation in Amortized Data StructuresabstractTraditional techniques for designing and analyzing amortized data structures in an imperative setting are of limited use in a functional setting because they apply only to single-threaded data structures, yet functional data structures can be non-single-threaded. In earlier work, we showed how lazy evaluation supports functional amortized data structures and described a technique (the banker's method) for analyzing such data structures. In this paper, we present a new analysis technique (the physicist's method) and show how one can sometimes derive a worst-case data structure from an amortized data structure by appropriately scheduling the premature execution of delayed components. We use these techniques to develop new implementations of FIFO queues and binomial queues. Chris Okasaki |
ICFP | 1 |
| 1996 | Optimal Purely Functional Priority QueuesabstractAbstract Brodal recently introduced the first implementation of imperative priority queues to support findMin, insert and meld in O (1) worst-case time, and deleteMin in O (log n ) worst-case time. These bounds are asymptotically optimal among all comparison-based priority queues. In this paper, we adapt Brodal's data structure to a purely functional setting. In doing so, we both simplify the data structure and clarify its relationship to the binomial queues of Vuillemin, which support all four operations in O (log n ) time. Specifically, we derive our implementation from binomial queues in three steps: first, we reduce the running time of insert to O (1) by eliminating the possibility of cascading links; second, we reduce the running time of findMin to O (1) by adding a global root to hold the minimum element; and finally, we reduce the running time of meld to O (1) by allowing priority queues to contain other priority queues. Each of these steps is expressed using ML-style functors. The last transformation, known as data-structural bootstrapping, is an interesting application of higher-order functors and recursive structures. Gerth Stølting Brodal, Chris Okasaki |
J. Funct. Program. | 2 |
| 1995 | Amortization, Lazy Evaluation, and Persistence: Lists with Catenation via Lazy LinkingabstractAmortization has been underutilized in the design of persistent data structures, largely because traditional accounting schemes break down in a persistent setting. Such schemes depend on saving "credits" for future use, but a persistent data structure may have multiple "futures", each competing for the same credits. We describe how lazy evaluation can often remedy this problem, yielding persistent data structures with good amortized efficiency. In fact, such data structures can be implemented purely functionally in any functional language supporting lazy evaluation. As can example of this technique, we present a purely functional (and therefore persistent) implementation of lists that simultaneously support catenation and all other usual list primitives in constant amortized time. This data structure is much simpler than the only existing data structure with comparable bounds, the recently discovered catenable lists of Kaplan and Tarjan, which support all operations in constant worst-case time. Chris Okasaki |
FOCS | 1 |
| 1995 | Simple and Efficient Purely Functional Queues and DequesabstractAbstract We present purely functional implementations of queues and double-ended queues (deques) requiring only O (1) time per operation in the worst case. Our algorithms are considerably simpler than previous designs with the same bounds. The inspiration for our approach is the incremental behaviour of certain functions on lazy lists. Chris Okasaki |
J. Funct. Program. | 1 |