66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
|
#!/usr/bin/env python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
# IMPORTS
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
from local.maths import *;
|
||
|
from local.typing import *;
|
||
|
|
||
|
from code.core.log import *;
|
||
|
from code.algorithms.search.sequential import SequentialSearch;
|
||
|
from code.algorithms.methods import *;
|
||
|
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
# GLOBAL VARIABLES/CONSTANTS
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
#
|
||
|
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
# CHECKS
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
def preChecks(L: List[int], i: int, **_):
|
||
|
assert 1 <= i and i <= len(L), 'Der Wert von i muss zw. {lb} und {ub} liegen.'.format(lb = 1, ub = len(L));
|
||
|
assert sorted(L) == sorted(list(set(L))), 'Ungültiger Input: L darf keine Duplikate enthalten!';
|
||
|
return;
|
||
|
|
||
|
def postChecks(L: List[int], i: int, value: int, **_):
|
||
|
L_ = sorted(L);
|
||
|
assert L_[i-1] == value, 'Der Algorithmus hat versagt.';
|
||
|
return;
|
||
|
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
# ALGORITHM jump search
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
@algorithmInfos(name='Auswahlproblem (i. kleinstes Element, D & C)', outputnames='value', checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
||
|
def FindIthSmallestDC(L: List[int], i: int) -> int:
|
||
|
'''
|
||
|
Inputs: L = Liste von Zahlen, i = Ordinalzahl
|
||
|
|
||
|
Annahmen:
|
||
|
|
||
|
- L enthält keine Duplikate.
|
||
|
- L enthält mindestens i Elemente.
|
||
|
|
||
|
Outputs: Wert des i. kleinste Element in L.
|
||
|
Beachte 1.kleinstes <==> Minimum.
|
||
|
'''
|
||
|
AddToCounter();
|
||
|
p = L[len(L)-1]; # NOTE: Pivotelement kann beliebig gewählt werden
|
||
|
Ll = [ x for x in L if x < p ];
|
||
|
Lr = [ x for x in L if x > p ];
|
||
|
if len(Ll) == i - 1:
|
||
|
logDebug('Es gibt genau i-1 Elemente vorm Pivotelment, p. Also ist p das i. kleinste Element.');
|
||
|
return p;
|
||
|
elif len(Ll) >= i:
|
||
|
logDebug('Es gibt mindestens i Elemente vorm Pivotelement, p. Suche wird in linker Hälfte fortgesetzt.');
|
||
|
return FindIthSmallestDC(L=Ll, i=i);
|
||
|
else:
|
||
|
i = i - (len(Ll) + 1)
|
||
|
logDebug('Es gibt weniger als i-1 Elemente vorm Pivotelement, p. Suche wird in rechte Hälfte nach {i}. kleinstem Element fortgesetzt.'.format(i=i));
|
||
|
return FindIthSmallestDC(L=Lr, i=i);
|