dendroid
In what follows python is an alias for python3.10 or pypy3.10
or any later version (python3.11, pypy3.11 and so on).
Installation
Prerequisites
Install the latest pip & setuptools packages versions
python -m pip install --upgrade pip setuptools
User
Download and install the latest stable version from PyPI repository
python -m pip install --upgrade dendroid
Developer
Download the latest version from GitHub repository
git clone https://github.com/lycantropos/dendroid.git
cd dendroid
Install
python -m pip install -e '.'
Usage
>>> from dendroid import avl, red_black, splay
>>> from random import sample
>>> min_value, max_value = -100, 100
>>> size = (max_value - min_value) // 2
>>> values = sample(range(min_value, max_value), size)
>>> avl_set, red_black_set, splay_set = (avl.set_(*values),
... red_black.set_(*values),
... splay.set_(*values))
>>> len(avl_set) == len(red_black_set) == len(splay_set) == size
True
>>> (
... max_value not in avl_set
... and max_value not in red_black_set
... and max_value not in splay_set
... )
True
>>> list(avl_set) == list(red_black_set) == list(splay_set) == sorted(values)
True
>>> avl_set.add(max_value)
>>> red_black_set.add(max_value)
>>> splay_set.add(max_value)
>>> len(avl_set) == len(red_black_set) == len(splay_set) == size + 1
True
>>> max_value in avl_set and max_value in red_black_set and max_value in splay_set
True
>>> (
... list(avl_set)
... == list(red_black_set)
... == list(splay_set)
... == sorted(values) + [max_value]
... )
True
>>> prev_max_value = max(values)
>>> (
... avl_set.prev(max_value)
... == red_black_set.prev(max_value)
... == splay_set.prev(max_value)
... == prev_max_value
... )
True
>>> (
... avl_set.next(prev_max_value)
... == red_black_set.next(prev_max_value)
... == splay_set.next(prev_max_value)
... == max_value
... )
True
>>> avl_set.remove(max_value)
>>> red_black_set.remove(max_value)
>>> splay_set.remove(max_value)
>>> len(avl_set) == len(red_black_set) == len(splay_set) == len(values)
True
>>> (
... max_value not in avl_set
... and max_value not in red_black_set
... and max_value not in splay_set
... )
True
>>> list(avl_set) == list(red_black_set) == list(splay_set) == sorted(values)
True
>>> avl_set.max() == red_black_set.max() == splay_set.max() == max(values)
True
>>> avl_set.min() == red_black_set.min() == splay_set.min() == min(values)
True
>>> avl_set.max() == red_black_set.max() == splay_set.max() == max(values)
True
>>> avl_set.min() == red_black_set.min() == splay_set.min() == min(values)
True
>>> avl_set.add(max_value)
>>> red_black_set.add(max_value)
>>> splay_set.add(max_value)
>>> avl_set.popmax() == red_black_set.popmax() == splay_set.popmax() == max_value
True
>>> avl_set.add(min_value)
>>> red_black_set.add(min_value)
>>> splay_set.add(min_value)
>>> avl_set.popmin() == red_black_set.popmin() == splay_set.popmin() == min_value
True
>>> min_key, max_key = min_value, max_value
>>> keys = sample(range(min_key, max_key), size)
>>> items = list(zip(keys, values))
>>> avl_map, red_black_map, splay_map = (avl.map_(*items),
... red_black.map_(*items),
... splay.map_(*items))
>>> len(avl_map) == len(red_black_map) == len(splay_map) == size
True
>>> max_key not in avl_map and max_key not in red_black_map and max_key not in splay_map
True
>>> list(avl_map) == list(red_black_map) == list(splay_map) == sorted(keys)
True
>>> avl_map[max_key] = red_black_map[max_key] = splay_map[max_key] = max_value
>>> len(avl_map) == len(red_black_map) == len(splay_map) == size + 1
True
>>> max_key in avl_map and max_key in red_black_map and max_key in splay_map
True
>>> avl_map[max_key] == red_black_map[max_key] == splay_map[max_key] == max_value
True
>>> list(avl_map) == list(red_black_map) == list(splay_map) == sorted(keys) + [max_key]
True
>>> prev_max_key, prev_max_value = items[max(range(size), key=keys.__getitem__)]
>>> (
... avl_map.prev(max_key)
... == red_black_map.prev(max_key)
... == splay_map.prev(max_key)
... == prev_max_value
... )
True
>>> (
... avl_map.next(prev_max_key)
... == red_black_map.next(prev_max_key)
... == splay_map.next(prev_max_key)
... == max_value
... )
True
>>> del avl_map[max_key], red_black_map[max_key], splay_map[max_key]
>>> len(avl_map) == len(red_black_map) == len(splay_map) == size
True
>>> max_key not in avl_map and max_key not in red_black_map and max_key not in splay_map
True
>>> list(avl_map) == list(red_black_map) == list(splay_map) == sorted(keys)
True
>>> (
... avl_map.max()
... == red_black_map.max()
... == splay_map.max()
... == values[max(range(size), key=keys.__getitem__)]
... )
True
>>> (
... avl_map.min()
... == red_black_map.min()
... == splay_map.min()
... == values[min(range(size), key=keys.__getitem__)]
... )
True
>>> avl_map[max_key] = red_black_map[max_key] = splay_map[max_key] = max_value
>>> avl_map.popmax() == red_black_map.popmax() == splay_map.popmax() == max_value
True
>>> avl_map[min_key] = red_black_map[min_key] = splay_map[min_key] = min_value
>>> avl_map.popmin() == red_black_map.popmin() == splay_map.popmin() == min_value
True
Development
Bumping version
Prerequisites
Install bump-my-version.
Release
Choose which version number category to bump following semver specification.
Test bumping version
bump-my-version bump --dry-run --verbose $CATEGORY
where $CATEGORY is the target version number category name, possible
values are patch/minor/major.
Bump version
bump-my-version bump --verbose $CATEGORY
This will set version to major.minor.patch.
Running tests
Plain
Install with dependencies
python -m pip install -e '.[tests]'
Run
pytest
Docker container
Run
-
with
CPythondocker-compose --file docker-compose.cpython.yml up
-
with
PyPydocker-compose --file docker-compose.pypy.yml up
Bash script
Run
-
with
CPython./run-tests.sh
or
./run-tests.sh cpython -
with
PyPy./run-tests.sh pypy
PowerShell script
Run
-
with
CPython.\run-tests.ps1
or
.\run-tests.ps1 cpython
-
with
PyPy.\run-tests.ps1 pypy
Metadata
Release files for dendroid 2.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dendroid-2.1.0.tar.gz | 19.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dendroid-2.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 43.5 kB
Release files / dendroid-2.1.0.tar.gz
| Download URL | dendroid-2.1.0.tar.gz |
|---|---|
| Size | 19.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7b8adb4f7d38608d62a2f4fb515f98e80c17bd1fe2d045a54c9cea575117d024
|
|
BLAKE2b-256 checksum How to use checksums |
7160884855fe5654a7f9127fc8b2dfa0ffb4ab001ea63aee95f056ea7563f0ae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / dendroid-2.1.0-py3-none-any.whl
| Download URL | dendroid-2.1.0-py3-none-any.whl |
|---|---|
| Size | 24.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
27259eb8ba37232dd1f85716e22459f05d5ee1f69332137be7fbf1d78e5d8599
|
|
BLAKE2b-256 checksum How to use checksums |
e0bbdacf2e7070f26eab7843348ac1efa53734ec83c7dabd621488fef41dac3a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|