mirror of
https://github.com/metabarcoding/obitools4.git
synced 2026-04-30 12:00:39 +00:00
8c7017a99d
- Update obioptions.Version from "Release 4.4.29" to "/v/ Release v5" - Update version.txt from 4.29 → .30 (automated by Makefile)
2.1 KiB
2.1 KiB
MinMultiset[T] — A Lazy-Delete Min-Multiset Implementation
A generic, type-safe multiset data structure in Go that maintains elements with multiplicity and provides efficient access to the current minimum. Built on top of a min-heap (container/heap) with lazy deletion to support efficient removals without rebuilding the heap.
Core Features
- ✅ Generic over comparable types (
T) with custom ordering vialesscomparator - ✅ Multiset semantics: supports multiple occurrences of the same value
- ✅ O(log n) insertion (
Add) and amortized O(1) minimum access - ✅ Lazy deletion:
RemoveOnemarks items for removal; physical cleanup occurs on nextMin()call - ✅ Size tracking: logical size (
Len()) excludes deleted items, even if still in heap - ✅ Memory-efficient cleanup:
shrink()andcleanTop()prevent tombstone accumulation
API Summary
| Method | Description |
|---|---|
NewMinMultiset(less) |
Constructor; initializes heap, maps (count, pending), and sets ordering |
Add(v) |
Inserts one occurrence of v; increments logical size & count map |
RemoveOne(v) |
Removes one occurrence if present; returns success flag (false otherwise) |
Min() |
Returns current minimum (or zero value + ok=false) after cleaning stale top entries |
Len() |
Returns logical size (excludes pending deletions) |
Internal Mechanism
count[T]int: tracks how many times each value is logically presentpending[T]int: tracks how many times each value is marked for removal- Heap invariant maintained only up to logical size — stale entries are pruned lazily during
Min()or after deletions - No manual cleanup needed — the structure self-balances incrementally
Use Cases
Priority queues with deletable arbitrary elements (e.g., Dijkstra’s algorithm where distances are updated), sliding-window minima, event scheduling with cancellation.
⚠️ Note:
lessmust define a strict total order (transitive, antisymmetric, connected) for correctness.