source: LMDZ6/branches/Optimisation_LMDZ/libf/misc/dict/README.md @ 4448

Last change on this file since 4448 was 3705, checked in by adurocher, 4 years ago

Added new hashtable module

  • Property svn:executable set to *
File size: 3.1 KB
Line 
1From https://github.com/ysdtkm/fortran_associative_array
2
3# Fortran associative array [![Build Status](https://travis-ci.org/ysdtkm/fortran_associative_array.svg?branch=master)](https://travis-ci.org/ysdtkm/fortran_associative_array)
4A scalable associative array (known as **hash table** or **dictionary**) for Fortran
5
6## Specifications
7* Internal data structure is treap (randomized binary search tree)
8* Roughly corresponds to `std::map` (C++) or `dict` (Python)
9    * A **key** can be `characters` (either fixed or arbitrary length), an `integer`, or a `real`
10    * A **value** can be any fortran intrinsic data type (with fixed length or kind). A *copy* of the value is stored in the `dict` object
11    * Does not affect Fortran's intrinsic random state
12* Implemented operations
13
14  |Operation                  |Cost     |Implementation                                                    |
15  |----                       |----     |----                                                              |
16  |Insertion/assignment       |O(log n) |Subroutine `insert_or_assign(dict, key, val)`                     |
17  |Deletion                   |O(log n) |Subroutine `remove(dict, key)`<br>(Error if not exist)            |
18  |Existence of a key         |O(log n) |Logical function `exists(dict, key)`                              |
19  |Reference                  |O(log n) |Valuetype function `get_val(dict, key)`<br>(Error if not exist)   |
20  |Get max/min/k-th key       |O(log n) |Keytype function `get_kth_key(dict, k)`<br>(Error if out of bounds; 1-based)|
21  |Count                      |O(1)     |Integer function `get_size(dict)`                                           |
22  |Retrieve sorted array      |O(n)     |Subroutine `get_keys_vals(dict, keys, vals, n)`<br>(Not for arbitrary length keys)|
23  |Clear                      |O(n)     |Implicitly called as a destructor                                           |
24
25* Other operations allowed by the data structure (not implemented)
26
27  |Operation                  |Cost                     |Note                                          |
28  |----                       |----                     |----                                          |
29  |Merge/split                |O(log n)                 |Destructive                                   |
30  |lower_bound/upper_bound    |O(log n)                 |                                              |
31  |Range search               |O(log n + elements found)|                                              |
32  |Deep copy                  |O(n)                     |Preorder DFS                                  |
33
34* Speed comparison with `gfortran`/`g++`, without compiler optimization
35
36  <img src="test/speedtest/visual/out.png" width="50%">
37
38## Usage
39* See `sample.f90` for sample usage
40* Edit `dtypes.h` if using another data types
41    * For string key (arbitrary length), `keytype1` should be `character(:),allocatable` and `keytype2` should be `character(*)`
42    * For other key types, `keytype1` and `keytype2` are the same
43
44## References
45* Treap https://en.wikipedia.org/wiki/Treap
46* Treap https://www.slideshare.net/iwiwi/2-12188757
47
Note: See TracBrowser for help on using the repository browser.