All Projects → Sciss → FingerTree

Sciss / FingerTree

Licence: LGPL-2.1 License
A Scala implementation of the versatile purely functional data structure of the same name.

Programming Languages

scala
5932 projects
shell
77523 projects

Projects that are alternatives of or similar to FingerTree

algorithm
得到每周一算法
Stars: ✭ 44 (-25.42%)
Mutual labels:  data-structure
Algorithms
Java implementation for Introduction to Algorithms book.
Stars: ✭ 58 (-1.69%)
Mutual labels:  data-structure
the-entitytainer
A single header library for managing game entity hierarchies.
Stars: ✭ 31 (-47.46%)
Mutual labels:  data-structure
data-structures-algorithms
Self-practice in Data Structures & Algorithms
Stars: ✭ 29 (-50.85%)
Mutual labels:  data-structure
CS basics
My CS learning : algorithm, data structure, and system design | #SE
Stars: ✭ 21 (-64.41%)
Mutual labels:  data-structure
data-structure-ts
Basic data structures and popular algorithms implemented in Typescript.
Stars: ✭ 14 (-76.27%)
Mutual labels:  data-structure
linked-blocking-multi-queue
A concurrent collection that extends the existing Java concurrent collection library, offering an optionally-bounded blocking "multi-queue" based on linked nodes.
Stars: ✭ 41 (-30.51%)
Mutual labels:  data-structure
fixie-trie
Compact tries for fixed-width keys
Stars: ✭ 23 (-61.02%)
Mutual labels:  data-structure
dask-awkward
Native Dask collection for awkward arrays, and the library to use it.
Stars: ✭ 25 (-57.63%)
Mutual labels:  data-structure
Swift-X-Algorithms
🔨 Algorithms & Data Structures implemented in Swift X. `let X = 5.0`
Stars: ✭ 22 (-62.71%)
Mutual labels:  data-structure
playground
A place to play programming
Stars: ✭ 21 (-64.41%)
Mutual labels:  data-structure
array-keyed-map
JS datastructure, like Map, but the keys are arrays
Stars: ✭ 29 (-50.85%)
Mutual labels:  data-structure
hypergraph
Hypergraph is data structure library to create a directed hypergraph in which a hyperedge can join any number of vertices.
Stars: ✭ 205 (+247.46%)
Mutual labels:  data-structure
nanostack
Small middleware stack library
Stars: ✭ 39 (-33.9%)
Mutual labels:  data-structure
hackerrank-30-Days-of-Code
Hackerrank Solutions of "30 Days of Code Challenges "
Stars: ✭ 23 (-61.02%)
Mutual labels:  data-structure
js-symbol-tree
Turn any collection of objects into its own efficient tree or linked list using Symbol
Stars: ✭ 86 (+45.76%)
Mutual labels:  data-structure
C-language
C语言练习代码
Stars: ✭ 186 (+215.25%)
Mutual labels:  data-structure
Programming-Reference
Open repository of programming topic for reverse engineering purpose.
Stars: ✭ 25 (-57.63%)
Mutual labels:  data-structure
gmap
heterogenous Map over a GADT
Stars: ✭ 40 (-32.2%)
Mutual labels:  data-structure
ds
🔗 Common Data Structures and Algorithms
Stars: ✭ 40 (-32.2%)
Mutual labels:  data-structure

FingerTree

Build Status Maven Central

statement

FingerTree is an immutable sequence data structure in Scala programming language, offering O(1) prepend and append, as well as a range of other useful properties [^1]. Finger trees can be used as building blocks for queues, double-ended queues, priority queues, indexed and summed sequences.

FingerTree is (C)opyright 2011–2020 by Hanns Holger Rutz. All rights reserved. It is released under the GNU Lesser General Public License v2.1+ and comes with absolutely no warranties. To contact the author, send an e-mail to contact at sciss.de.

The current implementation is a rewrite of previous versions. It tries to combine the advantages of the finger tree found in Scalaz (mainly the ability to have reducers / measures) and of the finger tree implementation by Daniel Spiewak (small, self-contained, much simpler and faster), but also has a more idiomatic Scala interface and comes with a range of useful applications, such as indexed and summed sequences.

[^1] Hinze, R. and Paterson, R., Finger trees: a simple general-purpose data structure, Journal of Functional Programming, vol. 16 no. 2 (2006), pp. 197--217

linking

The following dependency is necessary:

"de.sciss" %% "fingertree" % v

The current version v is "1.5.5".

building

This builds with sbt against Scala 2.13, 2.12, Dotty (JVM) and Scala 2.13 (JS). The last version to support Scala 2.11 is v1.5.4.

Standard targets are compile, package, doc, console, test, publishLocal.

contributing

Please see the file CONTRIBUTING.md

using

You can either implement your own data structure by wrapping a plain FingerTree instance. Trait FingerTreeLike can be used as a basis, it has two abstract methods tree and wrap which would need to be implemented.

Or you can use any of the provided ready-made data structures, such as IndexedSeq or IndexedSummedSeq. While the former might not be particularly interesting, as it does not add any functionality that is not found already in Scala's own immutable IndexedSeq (i.e. Vector), the latter provides the additional feature of measuring not just the indexed positions of the tree elements, but also an accumulative "sum" of any sort.

The core element for new structures is to provide an instance of Measure which is used by the finger tree to calculate the annotated meta data of the elements. The measure provides a zero value, a unit method which measures exactly one element, and a summation method |+| which accumulates measured data. To work correctly with the caching mechanism of the finger tree, |+| must be associative, i.e. (a |+| b) |+| c = a |+| (b |+| c).

Future versions will provide more ready-made structures, such as ordered sequences and interval sequences. In the meantime, you can check out the previous Scalaz based version of this project at git tag Scalaz, which includes those structures.

Indexed and summed sequence

A sequence that has efficient element look-up (random access), and additionally integrates its elements (a running summation).

import de.sciss.fingertree._

implicit val m = Measure.SummedIntInt
val sq = IndexedSummedSeq[Int,Int]((1 to 10).map(i => i * i): _*)
sq.sum  // result: 385
sq.sumUntil(sq.size/2)  // result: 55

Ranged sequence

A sequence of elements indexed by intervals. Allows for interval searches such as overlaps and intersections.

import de.sciss.fingertree._

val sq = RangedSeq(
  (1685, 1750) -> "Bach",
  (1866, 1925) -> "Satie",
  (1883, 1947) -> "Russolo",
  (1883, 1965) -> "Varèse",
  (1910, 1995) -> "Schaeffer",
  (1912, 1992) -> "Cage"
)(_._1, Ordering.Int)

implicit class Names(it: Iterator[(_, _)]) {
  def names = it.map(_._2).mkString(", ")
}

sq.intersect(1900).names               // were alive in this year: Satie, Varèse, Russolo
sq.filterIncludes(1900 -> 1930).names  // were alive during these years: Varèse, Russolo
sq.filterOverlaps(1900 -> 1930).names  // were alive at some point of this period: all but Bach

Ordered sequence

An ordered sequence that allows to find closest (floor or ceil) elements and create partial iterators.

import de.sciss.fingertree._

val sym = Seq(("Cs", 55), ("Fr", 87), ("K", 19), ("Li", 3), ("Na", 11), ("Rb", 37))
val sq  = OrderedSeq(sym: _*)(_._2, Ordering.Int)
val li  = sq.toList // List((Li,3), (Na,11), (K,19), (Rb,37), (Cs,55), (Fr,87))
val ceil20  = sq.ceilIterator  (20).toList  // List((Rb,37), (Cs,55), (Fr,87))
val floor20 = sq.floorIterator (20).toList  // List((K,19), (Rb,37), (Cs,55), (Fr,87))

todo

  • efficient bulk loading
  • (an max-priority-queue -- less interesting though, because there are already good structures in standard scala collections)
  • proper equals and hashCode methods
  • RangedSeq: element removal
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].