6.1. Miscellaneous algorithms
The ALGORITHM module provides array and collection manipulation algorithms including sorting, searching, set operations, element removal, and more.
Key features:
Search: lower_bound, upper_bound, binary_search, equal_range
Array manipulation: unique, sort_unique, reverse, combine, fill, rotate, erase_all, min_element, max_element, is_sorted, topological_sort
Set operations (on tables): intersection, union, difference, symmetric_difference, identical, is_subset
Most functions also support fixed-size arrays via [expect_any_array] overloads.
See Algorithm for a hands-on tutorial.
All functions and symbols are in “algorithm” module, use require to get access to it.
require daslib/algorithm
Example:
require daslib/algorithm
[export]
def main() {
var arr <- [3, 1, 4, 1, 5, 9, 2, 6, 5]
sort_unique(arr)
print("sort_unique: {arr}\n")
print("has 4: {binary_search(arr, 4)}\n")
print("has 7: {binary_search(arr, 7)}\n")
print("lower_bound(4): {lower_bound(arr, 4)}\n")
print("upper_bound(4): {upper_bound(arr, 4)}\n")
let er = equal_range(arr, 5)
print("equal_range(5): {er}\n")
print("min index: {min_element(arr)}\n")
print("is_sorted: {is_sorted(arr)}\n")
}
6.1.1. Search
binary_search (a: array<auto(TT)>; f: int; last: int; val: TT) : auto
binary_search (a: array<auto(TT)>; f: int; last: int; val: TT; less: block<(a:TT;b:TT):bool>) : auto
binary_search (a: array<auto(TT)>; val: TT; less: block<(a:TT;b:TT):bool>) : auto
binary_search (a: auto; f: int; last: int; val: auto(TT); less: block<(a:TT;b:TT):bool>) : auto
binary_search (a: auto; f: int; last: int; val: auto) : auto
binary_search (a: auto; val: auto(TT); less: block<(a:TT;b:TT):bool>) : auto
equal_range (a: array<auto(TT)>; f: int; l: int; val: TT) : auto
lower_bound (a: array<auto(TT)>; f: int; l: int; val: TT) : auto
lower_bound (a: array<auto(TT)>; value: auto(QQ); less: block<(a:TT;b:QQ):bool>) : auto
lower_bound (a: auto; f: int; l: int; val: auto(TT); less: block<(a:TT;b:TT):bool>) : auto
lower_bound (a: auto; val: auto(TT); less: block<(a:TT;b:TT):bool>) : auto
upper_bound (a: array<auto(TT)>; f: int; l: int; val: TT) : auto
upper_bound (a: array<auto(TT)>; value: auto(QQ); less: block<(a:TT;b:QQ):bool>) : auto
upper_bound (a: auto; f: int; l: int; val: auto(TT); less: block<(a:TT;b:TT):bool>) : auto
upper_bound (a: auto; val: auto(TT); less: block<(a:TT;b:TT):bool>) : auto
6.1.1.1. binary_search
- binary_search(a: array<auto(TT)>; f: int; last: int; val: TT ): auto
def binary_search (a: array<auto(TT)>; f: int; last: int; val: TT) : auto
- Arguments:
a : array<auto(TT)>
f : int
last : int
val : TT
- binary_search(a: array<auto(TT)>; f: int; last: int; val: TT; less: block<(a:TT;b:TT):bool> ): auto
- binary_search(a: array<auto(TT)>; val: TT ): auto
- binary_search(a: array<auto(TT)>; val: TT; less: block<(a:TT;b:TT):bool> ): auto
- binary_search(a: auto; f: int; last: int; val: auto(TT); less: block<(a:TT;b:TT):bool> ): auto
- binary_search(a: auto; f: int; last: int; val: auto ): auto
- binary_search(a: auto; val: auto(TT); less: block<(a:TT;b:TT):bool> ): auto
- binary_search(a: auto; val: auto ): auto
6.1.1.2. equal_range
- equal_range(a: array<auto(TT)>; f: int; l: int; val: TT ): auto
def equal_range (a: array<auto(TT)>; f: int; l: int; val: TT) : auto
- Arguments:
a : array<auto(TT)>
f : int
l : int
val : TT
- equal_range(a: array<auto(TT)>; val: TT ): auto
6.1.1.3. lower_bound
- lower_bound(a: array<auto(TT)>; f: int; l: int; val: TT ): auto
def lower_bound (a: array<auto(TT)>; f: int; l: int; val: TT) : auto
- Arguments:
a : array<auto(TT)>
f : int
l : int
val : TT
- lower_bound(a: array<auto(TT)>; f: int; l: int; value: auto(QQ); less: block<(a:TT;b:QQ):bool> ): auto
- lower_bound(a: array<auto(TT)>; val: TT ): auto
- lower_bound(a: array<auto(TT)>; value: auto(QQ); less: block<(a:TT;b:QQ):bool> ): auto
- lower_bound(a: auto; f: int; l: int; val: auto(TT); less: block<(a:TT;b:TT):bool> ): auto
- lower_bound(a: auto; f: int; l: int; val: auto ): auto
- lower_bound(a: auto; val: auto(TT); less: block<(a:TT;b:TT):bool> ): auto
- lower_bound(a: auto; val: auto ): auto
6.1.1.4. upper_bound
- upper_bound(a: array<auto(TT)>; f: int; l: int; val: TT ): auto
def upper_bound (a: array<auto(TT)>; f: int; l: int; val: TT) : auto
- Arguments:
a : array<auto(TT)>
f : int
l : int
val : TT
- upper_bound(a: array<auto(TT)>; f: int; l: int; value: auto(QQ); less: block<(a:TT;b:QQ):bool> ): auto
- upper_bound(a: array<auto(TT)>; val: TT ): auto
- upper_bound(a: array<auto(TT)>; value: auto(QQ); less: block<(a:TT;b:QQ):bool> ): auto
- upper_bound(a: auto; f: int; l: int; val: auto(TT); less: block<(a:TT;b:TT):bool> ): auto
- upper_bound(a: auto; f: int; l: int; val: auto ): auto
- upper_bound(a: auto; val: auto(TT); less: block<(a:TT;b:TT):bool> ): auto
- upper_bound(a: auto; val: auto ): auto
6.1.2. Array manipulation
6.1.2.1. combine
- combine(a: array<auto(TT)>; b: array<auto(TT)> ): auto
def combine (a: array<auto(TT)>; b: array<auto(TT)>) : auto
- Arguments:
a : array<auto(TT)>
b : array<auto(TT)>
- combine(a: auto; b: auto ): auto
- erase_all(arr: auto; value: auto ): auto
def erase_all (var arr: auto; value: auto) : auto
- Arguments:
arr : auto
value : auto
6.1.2.2. fill
- fill(a: array<auto(TT)>; value: TT ): auto
def fill (var a: array<auto(TT)>; value: TT) : auto
- Arguments:
a : array<auto(TT)>
value : TT
- fill(a: auto; value: auto ): auto
6.1.2.3. is_sorted
- is_sorted(a: array<auto(TT)> ): bool
def is_sorted (a: array<auto(TT)>) : bool
- Arguments:
a : array<auto(TT)>
- is_sorted(a: array<auto(TT)>; less: block<(a:TT;b:TT):bool> ): bool
- is_sorted(a: auto ): bool
6.1.2.4. max_element
- max_element(a: array<auto(TT)> ): int
def max_element (a: array<auto(TT)>) : int
- Arguments:
a : array<auto(TT)>
- max_element(a: array<auto(TT)>; less: block<(a:TT;b:TT):bool> ): int
- max_element(a: auto ): int
6.1.2.5. min_element
- min_element(a: array<auto(TT)> ): int
def min_element (a: array<auto(TT)>) : int
- Arguments:
a : array<auto(TT)>
- min_element(a: array<auto(TT)>; less: block<(a:TT;b:TT):bool> ): int
- min_element(a: auto ): int
6.1.2.6. reverse
- reverse(a: array<auto> ): auto
def reverse (var a: array<auto>) : auto
- Arguments:
a : array<auto>
- reverse(a: auto ): auto
6.1.2.7. rotate
- rotate(a: array<auto>; mid: int ): auto
def rotate (var a: array<auto>; mid: int) : auto
- Arguments:
a : array<auto>
mid : int
- rotate(a: auto; mid: int ): auto
- sort_unique(a: array<auto(TT)> ): auto
def sort_unique (var a: array<auto(TT)>) : auto
- Arguments:
a : array<auto(TT)>
- topological_sort(nodes: array<auto(Node)> ): auto
def topological_sort (nodes: array<auto(Node)>) : auto
- Arguments:
nodes : array<auto(Node)>
- unique(a: array<auto(TT)> ): auto
def unique (var a: array<auto(TT)>) : auto
- Arguments:
a : array<auto(TT)>
6.1.3. Table manipulation
difference (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>
identical (a: table<auto(TT), void>; b: table<auto(TT), void>) : bool
intersection (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>
is_subset (a: table<auto(TT), void>; b: table<auto(TT), void>) : bool
symmetric_difference (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>
union (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>
- difference(a: table<auto(TT), void>; b: table<auto(TT), void> ): table<TT, void>
def difference (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>
- Arguments:
a : table<auto(TT);void>
b : table<auto(TT);void>
- identical(a: table<auto(TT), void>; b: table<auto(TT), void> ): bool
def identical (a: table<auto(TT), void>; b: table<auto(TT), void>) : bool
- Arguments:
a : table<auto(TT);void>
b : table<auto(TT);void>
- intersection(a: table<auto(TT), void>; b: table<auto(TT), void> ): table<TT, void>
def intersection (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>
- Arguments:
a : table<auto(TT);void>
b : table<auto(TT);void>
- is_subset(a: table<auto(TT), void>; b: table<auto(TT), void> ): bool
def is_subset (a: table<auto(TT), void>; b: table<auto(TT), void>) : bool
- Arguments:
a : table<auto(TT);void>
b : table<auto(TT);void>
- symmetric_difference(a: table<auto(TT), void>; b: table<auto(TT), void> ): table<TT, void>
def symmetric_difference (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>
- Arguments:
a : table<auto(TT);void>
b : table<auto(TT);void>
- union(a: table<auto(TT), void>; b: table<auto(TT), void> ): table<TT, void>
def union (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>
- Arguments:
a : table<auto(TT);void>
b : table<auto(TT);void>