master > master: src go - algorithmen + display methoden hinzugefügt
This commit is contained in:
69
code/golang/internal/algorithms/search/interpol/interpol.go
Normal file
69
code/golang/internal/algorithms/search/interpol/interpol.go
Normal file
@@ -0,0 +1,69 @@
|
||||
package interpol
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* IMPORTS
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"ads/internal/core/logging"
|
||||
"ads/internal/core/metrics"
|
||||
)
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* GLOBAL VARIABLES/CONSTANTS
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
//
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* ALGORITHM interpolation
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
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 InterpolationSearch(L []int, x int, u int, v int) int {
|
||||
if len(L) == 0 {
|
||||
logging.LogDebug(fmt.Sprintf("Liste L leer, also x nicht in L"))
|
||||
return -1
|
||||
} else if !(L[u] <= x && x <= L[v]) {
|
||||
logging.LogDebug(fmt.Sprintf("x liegt außerhalb der Grenzen von L"))
|
||||
return -1
|
||||
}
|
||||
metrics.AddTimeCost()
|
||||
p := getSuchposition(L, x, u, v)
|
||||
logging.LogDebug(fmt.Sprintf("Interpolante von x in (u, v)=(%[1]v, %[2]v) ist p = %[3]v.", u, v, p))
|
||||
if L[p] == x {
|
||||
logging.LogDebug(fmt.Sprintf("x in Position p gefunden"))
|
||||
return p
|
||||
} else if x < L[p] {
|
||||
logging.LogDebug(fmt.Sprintf("Suche in linker Hälfte fortsetzen."))
|
||||
return InterpolationSearch(L, x, u, p-1)
|
||||
} else { // } else if x > L[p] {
|
||||
logging.LogDebug(fmt.Sprintf("Suche in rechter Hälfte fortsetzen."))
|
||||
return InterpolationSearch(L, x, p+1, v)
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* ALGORITHM interpolation
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
Inputs: L = Liste von Zahlen, x = Zahl, [u, v] = Suchinterval.
|
||||
|
||||
Outputs: Interpolierte Position, um Suchinterval ausgeglichen aufzuteilen.
|
||||
*/
|
||||
func getSuchposition(L []int, x int, u int, v int) int {
|
||||
metrics.AddTimeCost()
|
||||
r := float64(x-L[u]) / float64(L[v]-L[u])
|
||||
p := int(math.Floor(float64(u) + r*float64(v-u)))
|
||||
return p
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
package interpol
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* IMPORTS
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"ads/internal/core/metrics"
|
||||
"ads/internal/core/utils"
|
||||
"ads/internal/setup"
|
||||
)
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* GLOBAL VARIABLES/CONSTANTS
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
//
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* CHECKS
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
func preChecks(L []int, _ ...interface{}) error {
|
||||
if !utils.IsSortedListInt(L) {
|
||||
return fmt.Errorf("Ungültiger Input: L muss aufsteigend sortiert sein!")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func postChecks(L []int, x int, index int, _ ...interface{}) error {
|
||||
if utils.ArrayContains(L, x) {
|
||||
if !(index >= 0) {
|
||||
return fmt.Errorf("Der Algorithmus sollte nicht -1 zurückgeben.")
|
||||
}
|
||||
if L[index] != x {
|
||||
return fmt.Errorf("Der Algorithmus hat den falschen Index bestimmt.")
|
||||
}
|
||||
} else {
|
||||
if index != -1 {
|
||||
return fmt.Errorf("Der Algorithmus sollte -1 zurückgeben.")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* ALGORITHM interpolation + Display
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
func FancyInterpolationSearch(input_L []int, input_x int, input_u int, input_v int) (int, error) {
|
||||
var name = "Interpolationssuchalgorithmus"
|
||||
var inputs = map[string]interface{}{
|
||||
"L": input_L,
|
||||
"x": input_x,
|
||||
"u": input_u,
|
||||
"v": input_v,
|
||||
}
|
||||
var outputs map[string]interface{}
|
||||
var (
|
||||
output_index int
|
||||
)
|
||||
var err error
|
||||
|
||||
do_once := true
|
||||
for do_once {
|
||||
do_once = false
|
||||
setup.DisplayStartOfAlgorithm(name, inputs)
|
||||
metrics.RestartMetrics()
|
||||
|
||||
// Prechecks:
|
||||
err = preChecks(input_L, input_x, input_u, input_v)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
|
||||
// Ausführung des Algorithmus:
|
||||
output_index = InterpolationSearch(input_L, input_x, input_u, input_v)
|
||||
outputs = map[string]interface{}{
|
||||
"index": output_index,
|
||||
}
|
||||
|
||||
// Letzte Messages:
|
||||
setup.DisplayMetrics()
|
||||
setup.DisplayEndOfAlgorithm(outputs)
|
||||
|
||||
// Postchecks:
|
||||
err = postChecks(input_L, input_x, output_index)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return output_index, err
|
||||
}
|
||||
Reference in New Issue
Block a user