diff options
| author | Nia <108984073+kawaii-Code@users.noreply.github.com> | 2024-09-29 17:08:54 +0300 |
|---|---|---|
| committer | Nia <108984073+kawaii-Code@users.noreply.github.com> | 2024-09-29 17:08:54 +0300 |
| commit | 253edb51f7e7d85a6db5921ee6bda235650f3f74 (patch) | |
| tree | 69debfc8573a3828ae20e8374247da7d66028c84 /core/slice | |
| parent | 3c80f15a7a582924a8c0cda1ba30854a6457fb8e (diff) | |
Fix markup in `linear_search` and `binary_search` docs
Diffstat (limited to 'core/slice')
| -rw-r--r-- | core/slice/slice.odin | 122 |
1 files changed, 77 insertions, 45 deletions
diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 5cd3660b4..c917e6d9e 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -97,12 +97,32 @@ contains :: proc(array: $T/[]$E, value: E) -> bool where intrinsics.type_is_comp } /* - Searches the given element in the given slice in O(n) time. +Searches the given slice for the given element in O(n) time. - Returns the first index at which the given element can be found in the slice, - or -1 if it is not present. +If you need a custom search condition, see `linear_search_proc` - If you need a custom compare procedure, see `linear_search_proc` +Inputs: +- array: The slice to search in. +- key: The element to search for. + +Returns: +- index: The index `i`, such that `array[i]` is the first occurrence of `key` in `array`, or -1 if `key` is not present in `array`. + +Example: + index: int + found: bool + + a := []i32{10, 10, 10, 20} + + index, found = linear_search_reverse(a, 10) + assert(index == 0 && found == true) + + index, found = linear_search_reverse(a, 30) + assert(index == -1 && found == false) + + // Note that `index == 1`, since it is relative to `a[2:]` + index, found = linear_search_reverse(a[2:], 20) + assert(index == 1 && found == true) */ @(require_results) linear_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) @@ -116,10 +136,14 @@ linear_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) } /* - Searches the given element in the given slice in O(n) time, using the given predicate. +Searches the given slice for the first element satisfying predicate `f` in O(n) time. + +Inputs: +- array: The slice to search in. +- f: The search condition. - Returns the first index at which the given element can be found in the slice, - or -1 if it is not present. +Returns: +- index: The index `i`, such that `array[i]` is the first `x` in `array` for which `f(x) == true`, or -1 if such `x` does not exist. */ @(require_results) linear_search_proc :: proc(array: $A/[]$T, f: proc(T) -> bool) -> (index: int, found: bool) { @@ -132,31 +156,36 @@ linear_search_proc :: proc(array: $A/[]$T, f: proc(T) -> bool) -> (index: int, f } /* - Reverse linear search searches the given element in the given slice in O(n) time, - starting from the slice end. +Searches the given slice for the given element in O(n) time, starting from the +slice end. - Returns the last index at which the given element can be found in the slice, - or -1 if it is not present +If you need a custom search condition, see `linear_search_reverse_proc` - # Examples +Inputs: +- array: The slice to search in. +- key: The element to search for. - ``` +Returns: +- index: The index `i`, such that `array[i]` is the last occurrence of `key` in `array`, or -1 if `key` is not present in `array`. + +Example: index: int found: bool - a := []i32{1, 1, 1, 2} + a := []i32{10, 10, 10, 20} - index, found = linear_search_reverse(a, 2) + index, found = linear_search_reverse(a, 20) assert(index == 3 && found == true) - index, found = linear_search_reverse(a, 1) + index, found = linear_search_reverse(a, 10) assert(index == 2 && found == true) - index, found = linear_search_reverse(a, 0) + index, found = linear_search_reverse(a, 30) assert(index == -1 && found == false) - ``` - If you need a custom compare procedure, see `linear_search_reverse_proc` + // Note that `index == 1`, since it is relative to `a[2:]` + index, found = linear_search_reverse(a[2:], 20) + assert(index == 1 && found == true) */ @(require_results) linear_search_reverse :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) @@ -170,11 +199,15 @@ linear_search_reverse :: proc(array: $A/[]$T, key: T) -> (index: int, found: boo } /* - Searches the given element in the given slice in O(n) time, starting from the end of - the slice and using the given predicate. +Searches the given slice for the last element satisfying predicate `f` in O(n) +time, starting from the slice end. - Returns the last index at which the given element can be found in the slice, - or -1 if it is not present +Inputs: +- array: The slice to search in. +- f: The search condition. + +Returns: +- index: The index `i`, such that `array[i]` is the last `x` in `array` for which `f(x) == true`, or -1 if such `x` does not exist. */ @(require_results) linear_search_reverse_proc :: proc(array: $A/[]$T, f: proc(T) -> bool) -> (index: int, found: bool) { @@ -187,22 +220,24 @@ linear_search_reverse_proc :: proc(array: $A/[]$T, f: proc(T) -> bool) -> (index } /* - Binary search searches the given slice for the given element. - If the slice is not sorted, the returned index is unspecified and meaningless. +Searches the given slice for the given element. +If the slice is not sorted, the returned index is unspecified and meaningless. - If the value is found then the returned int is the index of the matching element. - If there are multiple matches, then any one of the matches could be returned. +If the value is found then the returned int is the index of the matching element. +If there are multiple matches, then any one of the matches could be returned. - If the value is not found then the returned int is the index where a matching - element could be inserted while maintaining sorted order. +If the value is not found then the returned int is the index where a matching +element could be inserted while maintaining sorted order. - # Examples +For slices of more complex types see: `binary_search_by` +Example: + /* Looks up a series of four elements. The first is found, with a uniquely determined position; the second and third are not found; the fourth could match any position in `[1, 4]`. + */ - ``` index: int found: bool @@ -219,9 +254,6 @@ linear_search_reverse_proc :: proc(array: $A/[]$T, f: proc(T) -> bool) -> (index index, found = slice.binary_search(s, 1) assert(index >= 1 && index <= 4 && found == true) - ``` - - For slices of more complex types see: binary_search_by */ @(require_results) binary_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) @@ -230,21 +262,21 @@ binary_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) } /* - Binary search searches the given slice for the given element. - If the slice is not sorted, the returned index is unspecified and meaningless. +Searches the given slice for the given element. +If the slice is not sorted, the returned index is unspecified and meaningless. - If the value is found then the returned int is the index of the matching element. - If there are multiple matches, then any one of the matches could be returned. +If the value is found then the returned int is the index of the matching element. +If there are multiple matches, then any one of the matches could be returned. - If the value is not found then the returned int is the index where a matching - element could be inserted while maintaining sorted order. +If the value is not found then the returned int is the index where a matching +element could be inserted while maintaining sorted order. - The array elements and key may be different types. This allows the filter procedure - to compare keys against a slice of structs, one struct value at a time. +The array elements and key may be different types. This allows the filter procedure +to compare keys against a slice of structs, one struct value at a time. - Returns: - index: int - found: bool +Returns: +- index: int +- found: bool */ @(require_results) |