2021-11-01 19:58:55 +01:00
|
|
|
|
package binary
|
|
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
|
* IMPORTS
|
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"ads/internal/core/logging"
|
|
|
|
|
"ads/internal/core/metrics"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
|
* GLOBAL VARIABLES/CONSTANTS
|
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
|
* ALGORITHM binary search
|
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Inputs: L = Liste von Zahlen, x = Zahl.
|
|
|
|
|
|
|
|
|
|
Annahme: L sei aufsteigend sortiert.
|
|
|
|
|
|
|
|
|
|
Outputs: Position von x in L, sonst −1 wenn x nicht in L.
|
|
|
|
|
*/
|
|
|
|
|
func BinarySearch(L []int, x int) int {
|
|
|
|
|
if len(L) == 0 {
|
2021-11-04 11:36:14 +01:00
|
|
|
|
logging.Debug("x nicht in L.")
|
2021-11-01 19:58:55 +01:00
|
|
|
|
return -1
|
|
|
|
|
}
|
|
|
|
|
metrics.AddTimeCost()
|
|
|
|
|
m := int(len(L) / 2)
|
|
|
|
|
if L[m] == x {
|
2021-11-04 11:36:14 +01:00
|
|
|
|
logging.Debug("Suche in %v .. %v; m = %v; L[m] = x ==> Element gefunden.", 0, len(L)-1, m)
|
2021-11-01 19:58:55 +01:00
|
|
|
|
return m
|
2021-11-04 11:36:14 +01:00
|
|
|
|
} else if len(L) == 1 {
|
|
|
|
|
logging.Debug("L enthält 1 Element; L[m] =/= x; ==> x nicht in L.")
|
|
|
|
|
return -1
|
2021-11-01 19:58:55 +01:00
|
|
|
|
} else if x < L[m] {
|
2021-11-04 11:36:14 +01:00
|
|
|
|
logging.Debug("Suche in %v .. %v; m = %v; L[m] = %v > x ==> Suche in linker Hälfte fortsetzen.", 0, len(L)-1, m, L[m])
|
2021-11-01 19:58:55 +01:00
|
|
|
|
index := BinarySearch(L[:m], x)
|
|
|
|
|
return index
|
|
|
|
|
} else { // } else if x > L[m] {
|
2021-11-04 11:36:14 +01:00
|
|
|
|
logging.Debug("Suche in %v .. %v; m = %v; L[m] = %v < x ==> Suche in rechter Hälfte fortsetzen.", 0, len(L)-1, m, L[m])
|
2021-11-01 19:58:55 +01:00
|
|
|
|
index := BinarySearch(L[m+1:], x)
|
2021-11-04 11:36:14 +01:00
|
|
|
|
if index == -1 {
|
|
|
|
|
return -1 // wenn nicht gefunden
|
2021-11-01 19:58:55 +01:00
|
|
|
|
}
|
2021-11-04 11:36:14 +01:00
|
|
|
|
return index + (m + 1) // NOTE: muss Indexwert kompensieren
|
2021-11-01 19:58:55 +01:00
|
|
|
|
}
|
|
|
|
|
}
|