• Stars
    star
    5
  • Rank 2,769,202 (Top 57 %)
  • Language
    Elixir
  • License
    MIT License
  • Created about 9 years ago
  • Updated about 9 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Deque implementations in elixir

Dlist

An elixir library containing two Deque implementations.

API documentation is available at http://hexdocs.pm/dlist

Add as dependency

{:dlist, "~> 0.0.1"}

Libraries

Dlist.Deque

This implementation is a two list solution.

This supports fast inserts done in constant time. The first and last operations are worst case O(n). to_list is also O(n) worst case.

alias Dlist.Deque

deque = Deque.new
deque = Deque.append(deque, 2)
deque = Deque.append(deque, 3)
deque = Deque.prepend(deque, 1)
deque = Deque.prepend(deque, 0)
IO.puts inspect Deque.to_list(deque)
# ==> [0, 1, 2, 3]

Dlist.DoublyLinkedList

This implementation uses a gen_server and therefore is mutable. This is similar to your standard doubly linked list in imperative languages.

It supports fast inserts in constant time. first and last operations are also done in constant time. to_list, is always O(n) since it must traverse all nodes to build the list.

Be sure to destory the list when you're finished using it.

alias Dlist.DoublyLinkedList, as: DLL

{:ok, dll} = DLL.new
DLL.append(dll, 2)
DLL.append(dll, 3)
DLL.prepend(dll, 1)
DLL.prepend(dll, 0)
IO.puts inspect DLL.to_list(dll)
# ==> [0, 1, 2, 3]

DLL.destroy(dll)

Benchmarks

The two list Deque implementation is much faster than the gen_server DoublyLinkedList for the sample code above. The benchmarking script can be found in benchmarks.exs.

$ mix run benchmarks.exs
*** &DlistBenchmark.deque_append_prepend_to_list/0 ***
1.2 sec     2M iterations   0.6 μs/op

*** &DlistBenchmark.dll_append_prepend_to_list/0 ***
1.2 sec     8K iterations   157.36 μs/op