https://github.com/keegancsmith/nth
Find the nth largest element of an unsorted slice in Go. Fast and memory efficient implementation of a Selection Algorithm.
https://github.com/keegancsmith/nth
Last synced: 2 months ago
JSON representation
Find the nth largest element of an unsorted slice in Go. Fast and memory efficient implementation of a Selection Algorithm.
- Host: GitHub
- URL: https://github.com/keegancsmith/nth
- Owner: keegancsmith
- License: mit
- Created: 2016-07-17T03:16:25.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2024-09-04T06:58:48.000Z (9 months ago)
- Last Synced: 2025-03-26T12:21:24.362Z (3 months ago)
- Language: Go
- Size: 14.6 KB
- Stars: 18
- Watchers: 2
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
> NOTE: Not ready for use, does not past correctness tests yet.
# nth
Fast and memory efficient implementation of a Selection Algorithm in Go.
After calling `nth.Element(data sort.Interface, n int)` everything before
index `n` will be less than `data[n]` and everything after `n` will be greater
than or equal to `data[n]`. IE it partially sorts `data` such that `data[n] ==
sortedData[n]`.`nth.Element` is an implementation of `QuickSelectAdaptive` from Andrei
Alexandrescu's 2016 paper
[Fast Deterministic Selection](https://arxiv.org/abs/1606.00484). It is has a
deterministic `O(n)` runtime, `O(1)` space usage. Classical implementations of
Selection Algorithms usually rely on non-determinism (random pivots) or have
high constant factors (median-of-median pivots), or are not as fast as this
algorithm (`IntroSelect`).The name `nth.Element` is inspired from C++'s `nth_element`, which is also an
implementation of a Selection Algorithm (although most STL implementations use
`IntroSelect`).**Note:** This is not a complete implementation yet, although already should
be faster than just using `sort.Sort`.