2021-11-01 19:58:55 +01:00
|
|
|
package ith_element
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* IMPORTS
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"sort"
|
|
|
|
|
|
|
|
"ads/internal/core/metrics"
|
|
|
|
"ads/internal/core/utils"
|
|
|
|
"ads/internal/setup"
|
|
|
|
)
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* GLOBAL VARIABLES/CONSTANTS
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* CHECKS
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
func preChecks(L []int, i int, _ ...interface{}) error {
|
|
|
|
if !(1 <= i && i <= len(L)) {
|
|
|
|
return fmt.Errorf("Der Wert von i muss zw. %[1]v und %[2]v liegen.", 1, len(L))
|
|
|
|
} else if !utils.ContainsNoDuplicatesListInt(L) {
|
|
|
|
return fmt.Errorf("Ungültiger Input: L darf keine Duplikate enthalten!")
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func postChecks(L []int, i int, value int, _ ...interface{}) error {
|
|
|
|
L_ := make([]int, len(L))
|
|
|
|
copy(L_, L)
|
|
|
|
sort.Ints(L_)
|
|
|
|
if !(L_[i-1] == value) {
|
|
|
|
return fmt.Errorf("Das i=%[1]v. kleinste Element ist %[2]v und nicht %[3]v.", i, L_[i-1], value)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* ALGORITHM find ith smallest + Display
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
func FancyFindIthSmallest(input_L []int, input_i int) (int, error) {
|
|
|
|
var name = "Auswahlproblem (i. kleinstes Element)"
|
|
|
|
var inputs = map[string]interface{}{
|
|
|
|
"L": input_L,
|
|
|
|
"i": input_i,
|
|
|
|
}
|
|
|
|
var outputs map[string]interface{}
|
|
|
|
var (
|
|
|
|
output_value int
|
|
|
|
)
|
|
|
|
var err error
|
|
|
|
|
|
|
|
do_once := true
|
|
|
|
for do_once {
|
|
|
|
do_once = false
|
2021-11-02 09:07:04 +01:00
|
|
|
|
|
|
|
// Start Message
|
2021-11-01 19:58:55 +01:00
|
|
|
setup.DisplayStartOfAlgorithm(name, inputs)
|
2021-11-02 09:07:04 +01:00
|
|
|
|
2021-11-01 19:58:55 +01:00
|
|
|
// Prechecks:
|
2021-11-02 09:07:04 +01:00
|
|
|
if setup.AppConfigPerformChecks() {
|
|
|
|
err = preChecks(input_L, input_i)
|
|
|
|
if err != nil {
|
|
|
|
break
|
|
|
|
}
|
2021-11-01 19:58:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Ausführung des Algorithmus:
|
2021-11-02 13:05:34 +01:00
|
|
|
metrics.ResetMetrics()
|
|
|
|
metrics.StartMetrics()
|
2021-11-01 19:58:55 +01:00
|
|
|
output_value = FindIthSmallest(input_L, input_i)
|
2021-11-02 13:05:34 +01:00
|
|
|
metrics.StopMetrics()
|
2021-11-01 19:58:55 +01:00
|
|
|
outputs = map[string]interface{}{
|
|
|
|
"value": output_value,
|
|
|
|
}
|
|
|
|
|
2021-11-02 09:07:04 +01:00
|
|
|
// Metriken anzeigen
|
|
|
|
if setup.AppConfigShowMetrics() {
|
|
|
|
setup.DisplayMetrics()
|
|
|
|
}
|
|
|
|
|
|
|
|
// End Message
|
2021-11-01 19:58:55 +01:00
|
|
|
setup.DisplayEndOfAlgorithm(outputs)
|
|
|
|
|
|
|
|
// Postchecks:
|
2021-11-02 09:07:04 +01:00
|
|
|
if setup.AppConfigPerformChecks() {
|
|
|
|
err = postChecks(input_L, input_i, output_value)
|
|
|
|
if err != nil {
|
|
|
|
break
|
|
|
|
}
|
2021-11-01 19:58:55 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return output_value, err
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* ALGORITHM find ith smallest (D & C) + Display
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
func FancyFindIthSmallestDC(input_L []int, input_i int) (int, error) {
|
|
|
|
var name = "Auswahlproblem (i. kleinstes Element, D & C)"
|
|
|
|
var inputs = map[string]interface{}{
|
|
|
|
"L": input_L,
|
|
|
|
"i": input_i,
|
|
|
|
}
|
|
|
|
var outputs map[string]interface{}
|
|
|
|
var (
|
|
|
|
output_value int
|
|
|
|
)
|
|
|
|
var err error
|
|
|
|
|
|
|
|
do_once := true
|
|
|
|
for do_once {
|
|
|
|
do_once = false
|
2021-11-02 09:07:04 +01:00
|
|
|
|
|
|
|
// Start Message
|
2021-11-01 19:58:55 +01:00
|
|
|
setup.DisplayStartOfAlgorithm(name, inputs)
|
2021-11-02 09:07:04 +01:00
|
|
|
|
2021-11-01 19:58:55 +01:00
|
|
|
// Prechecks:
|
2021-11-02 09:07:04 +01:00
|
|
|
if setup.AppConfigPerformChecks() {
|
|
|
|
err = preChecks(input_L, input_i)
|
|
|
|
if err != nil {
|
|
|
|
break
|
|
|
|
}
|
2021-11-01 19:58:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Ausführung des Algorithmus:
|
2021-11-02 13:05:34 +01:00
|
|
|
metrics.ResetMetrics()
|
|
|
|
metrics.StartMetrics()
|
2021-11-01 19:58:55 +01:00
|
|
|
output_value = FindIthSmallestDC(input_L, input_i)
|
2021-11-02 13:05:34 +01:00
|
|
|
metrics.StopMetrics()
|
2021-11-01 19:58:55 +01:00
|
|
|
outputs = map[string]interface{}{
|
|
|
|
"value": output_value,
|
|
|
|
}
|
|
|
|
|
2021-11-02 09:07:04 +01:00
|
|
|
// Metriken anzeigen
|
|
|
|
if setup.AppConfigShowMetrics() {
|
|
|
|
setup.DisplayMetrics()
|
|
|
|
}
|
|
|
|
|
|
|
|
// End Message
|
2021-11-01 19:58:55 +01:00
|
|
|
setup.DisplayEndOfAlgorithm(outputs)
|
|
|
|
|
|
|
|
// Postchecks:
|
2021-11-02 09:07:04 +01:00
|
|
|
if setup.AppConfigPerformChecks() {
|
|
|
|
err = postChecks(input_L, input_i, output_value)
|
|
|
|
if err != nil {
|
|
|
|
break
|
|
|
|
}
|
2021-11-01 19:58:55 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return output_value, err
|
|
|
|
}
|