master > master: src go - algorithmen + display methoden hinzugefügt
This commit is contained in:
91
code/golang/internal/algorithms/search/jump/jump.go
Normal file
91
code/golang/internal/algorithms/search/jump/jump.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package jump
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* IMPORTS
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"ads/internal/algorithms/search/sequential"
|
||||
"ads/internal/core/logging"
|
||||
"ads/internal/core/metrics"
|
||||
)
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* GLOBAL VARIABLES/CONSTANTS
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
//
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* ALGORITHM jump search
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
Inputs: L = Liste von Zahlen, x = Zahl, m = lineare Sprunggröße.
|
||||
|
||||
Annahmen:
|
||||
- L sei aufsteigend sortiert.
|
||||
- L enthält keine Duplikate.
|
||||
|
||||
Outputs: Position von x in L, sonst −1 wenn x nicht in L.
|
||||
*/
|
||||
func JumpSearchLinear(L []int, x int, m int) int {
|
||||
i0 := 0
|
||||
i1 := m
|
||||
// ACHTUNG: dies ist eine while-Schleife ist golang:
|
||||
for i0 < len(L) {
|
||||
metrics.AddTimeCost()
|
||||
block := L[i0:i1]
|
||||
elementAfterBlock := block[len(block)-1] + 1
|
||||
if x < elementAfterBlock {
|
||||
logging.LogDebug(fmt.Sprintf("Element muss sich im Block [%[1]v, %[2]v) befinden.", i0, i1))
|
||||
index := sequential.SequentialSearch(block, x)
|
||||
if index >= 0 {
|
||||
index += i0 // NOTE: muss wegen Offset kompensieren
|
||||
}
|
||||
return index
|
||||
}
|
||||
logging.LogDebug(fmt.Sprintf("Element befindet sich nicht im Block [%[1]v, %[2]v).", i0, i1))
|
||||
i0 = i1
|
||||
i1 += m
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* ALGORITHM jump search - exponentiell
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
Inputs: L = Liste von Zahlen, x = Zahl.
|
||||
|
||||
Annahmen:
|
||||
- L sei aufsteigend sortiert.
|
||||
- L enthält keine Duplikate.
|
||||
|
||||
Outputs: Position von x in L, sonst −1 wenn x nicht in L.
|
||||
*/
|
||||
func JumpSearchExponentiell(L []int, x int) int {
|
||||
i0 := 0
|
||||
i1 := 1
|
||||
// ACHTUNG: dies ist eine while-Schleife ist golang:
|
||||
for i0 < len(L) {
|
||||
metrics.AddTimeCost()
|
||||
block := L[i0:i1]
|
||||
elementAfterBlock := block[len(block)-1] + 1
|
||||
if x < elementAfterBlock {
|
||||
logging.LogDebug(fmt.Sprintf("Element muss sich im Block [%[1]v, %[2]v) befinden.", i0, i1))
|
||||
index := sequential.SequentialSearch(block, x)
|
||||
if index >= 0 {
|
||||
index += i0 // NOTE: muss wegen Offset kompensieren
|
||||
}
|
||||
return index
|
||||
}
|
||||
logging.LogDebug(fmt.Sprintf("Element befindet sich nicht im Block [%[1]v, %[2]v).", i0, i1))
|
||||
i0 = i1
|
||||
i1 *= 2
|
||||
}
|
||||
return -1
|
||||
}
|
||||
143
code/golang/internal/algorithms/search/jump/jump_fancy.go
Normal file
143
code/golang/internal/algorithms/search/jump/jump_fancy.go
Normal file
@@ -0,0 +1,143 @@
|
||||
package jump
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* 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 jump search + Display
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
func FancyJumpSearchLinear(input_L []int, input_x int, input_m int) (int, error) {
|
||||
var name = "Sprungsuche"
|
||||
var inputs = map[string]interface{}{
|
||||
"L": input_L,
|
||||
"x": input_x,
|
||||
"m": input_m,
|
||||
}
|
||||
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_m)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
|
||||
// Ausführung des Algorithmus:
|
||||
output_index = JumpSearchLinear(input_L, input_x, input_m)
|
||||
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
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* ALGORITHM jump search - exponentiell + Display
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
func FancyJumpSearchExponentiell(input_L []int, input_x int) (int, error) {
|
||||
var name = "Sprungsuche (exponentiell)"
|
||||
var inputs = map[string]interface{}{
|
||||
"L": input_L,
|
||||
"x": input_x,
|
||||
}
|
||||
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)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
|
||||
// Ausführung des Algorithmus:
|
||||
output_index = JumpSearchExponentiell(input_L, input_x)
|
||||
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