mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-04 12:52:28 +08:00
test: add examples for search function
This commit is contained in:
@@ -8,19 +8,20 @@ import "github.com/duke-git/lancet/v2/lancetconstraints"
|
|||||||
|
|
||||||
// Search algorithms see https://github.com/TheAlgorithms/Go/tree/master/search
|
// Search algorithms see https://github.com/TheAlgorithms/Go/tree/master/search
|
||||||
|
|
||||||
// LinearSearch Simple linear search algorithm that iterates over all elements of an slice
|
// LinearSearch return the index of target in slice base on equal function.
|
||||||
// If a target is found, the index of the target is returned. Else the function return -1
|
// If not found return -1
|
||||||
func LinearSearch[T any](slice []T, target T, comparator lancetconstraints.Comparator) int {
|
func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int {
|
||||||
for i, v := range slice {
|
for i, v := range slice {
|
||||||
if comparator.Compare(v, target) == 0 {
|
if equal(v, target) {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
// BinarySearch search for target within a sorted slice, recursive call itself.
|
// BinarySearch return the index of target within a sorted slice, use binary search (recursive call itself).
|
||||||
// If a target is found, the index of the target is returned. Else the function return -1
|
// If not found return -1.
|
||||||
|
// Play: https://go.dev/play/p/t6MeGiUSN47
|
||||||
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int {
|
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int {
|
||||||
if highIndex < lowIndex || len(sortedSlice) == 0 {
|
if highIndex < lowIndex || len(sortedSlice) == 0 {
|
||||||
return -1
|
return -1
|
||||||
@@ -39,8 +40,9 @@ func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, com
|
|||||||
return midIndex
|
return midIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
// BinaryIterativeSearch search for target within a sorted slice.
|
// BinaryIterativeSearch return the index of target within a sorted slice, use binary search (no recursive).
|
||||||
// If a target is found, the index of the target is returned. Else the function return -1
|
// If not found return -1.
|
||||||
|
// Play: https://go.dev/play/p/Anozfr8ZLH3
|
||||||
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int {
|
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int {
|
||||||
startIndex := lowIndex
|
startIndex := lowIndex
|
||||||
endIndex := highIndex
|
endIndex := highIndex
|
||||||
|
|||||||
51
algorithm/search_example_test.go
Normal file
51
algorithm/search_example_test.go
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
package algorithm
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func ExampleLinearSearch() {
|
||||||
|
numbers := []int{3, 4, 5, 3, 2, 1}
|
||||||
|
|
||||||
|
equalFunc := func(a, b int) bool {
|
||||||
|
return a == b
|
||||||
|
}
|
||||||
|
|
||||||
|
result1 := LinearSearch(numbers, 3, equalFunc)
|
||||||
|
result2 := LinearSearch(numbers, 6, equalFunc)
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 0
|
||||||
|
// -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleBinarySearch() {
|
||||||
|
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
|
||||||
|
comparator := &intComparator{}
|
||||||
|
|
||||||
|
result1 := BinarySearch(numbers, 5, 0, len(numbers)-1, comparator)
|
||||||
|
result2 := BinarySearch(numbers, 9, 0, len(numbers)-1, comparator)
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 4
|
||||||
|
// -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleBinaryIterativeSearch() {
|
||||||
|
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
|
||||||
|
comparator := &intComparator{}
|
||||||
|
|
||||||
|
result1 := BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator)
|
||||||
|
result2 := BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator)
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 4
|
||||||
|
// -1
|
||||||
|
}
|
||||||
@@ -6,20 +6,24 @@ import (
|
|||||||
"github.com/duke-git/lancet/v2/internal"
|
"github.com/duke-git/lancet/v2/internal"
|
||||||
)
|
)
|
||||||
|
|
||||||
var sortedNumbers = []int{1, 2, 3, 4, 5, 6, 7, 8}
|
|
||||||
|
|
||||||
func TestLinearSearch(t *testing.T) {
|
func TestLinearSearch(t *testing.T) {
|
||||||
asssert := internal.NewAssert(t, "TestLinearSearch")
|
asssert := internal.NewAssert(t, "TestLinearSearch")
|
||||||
|
|
||||||
comparator := &intComparator{}
|
numbers := []int{3, 4, 5, 3, 2, 1}
|
||||||
asssert.Equal(4, LinearSearch(sortedNumbers, 5, comparator))
|
equalFunc := func(a, b int) bool {
|
||||||
asssert.Equal(-1, LinearSearch(sortedNumbers, 9, comparator))
|
return a == b
|
||||||
|
}
|
||||||
|
|
||||||
|
asssert.Equal(0, LinearSearch(numbers, 3, equalFunc))
|
||||||
|
asssert.Equal(-1, LinearSearch(numbers, 6, equalFunc))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBinarySearch(t *testing.T) {
|
func TestBinarySearch(t *testing.T) {
|
||||||
asssert := internal.NewAssert(t, "TestBinarySearch")
|
asssert := internal.NewAssert(t, "TestBinarySearch")
|
||||||
|
|
||||||
|
sortedNumbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
|
||||||
comparator := &intComparator{}
|
comparator := &intComparator{}
|
||||||
|
|
||||||
asssert.Equal(4, BinarySearch(sortedNumbers, 5, 0, len(sortedNumbers)-1, comparator))
|
asssert.Equal(4, BinarySearch(sortedNumbers, 5, 0, len(sortedNumbers)-1, comparator))
|
||||||
asssert.Equal(-1, BinarySearch(sortedNumbers, 9, 0, len(sortedNumbers)-1, comparator))
|
asssert.Equal(-1, BinarySearch(sortedNumbers, 9, 0, len(sortedNumbers)-1, comparator))
|
||||||
}
|
}
|
||||||
@@ -27,7 +31,9 @@ func TestBinarySearch(t *testing.T) {
|
|||||||
func TestBinaryIterativeSearch(t *testing.T) {
|
func TestBinaryIterativeSearch(t *testing.T) {
|
||||||
asssert := internal.NewAssert(t, "TestBinaryIterativeSearch")
|
asssert := internal.NewAssert(t, "TestBinaryIterativeSearch")
|
||||||
|
|
||||||
|
sortedNumbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
|
||||||
comparator := &intComparator{}
|
comparator := &intComparator{}
|
||||||
|
|
||||||
asssert.Equal(4, BinaryIterativeSearch(sortedNumbers, 5, 0, len(sortedNumbers)-1, comparator))
|
asssert.Equal(4, BinaryIterativeSearch(sortedNumbers, 5, 0, len(sortedNumbers)-1, comparator))
|
||||||
asssert.Equal(-1, BinaryIterativeSearch(sortedNumbers, 9, 0, len(sortedNumbers)-1, comparator))
|
asssert.Equal(-1, BinaryIterativeSearch(sortedNumbers, 9, 0, len(sortedNumbers)-1, comparator))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user