diff --git a/code/algorithms/search/exports.py b/code/algorithms/search/exports.py index ed8bbd7..f7d5385 100644 --- a/code/algorithms/search/exports.py +++ b/code/algorithms/search/exports.py @@ -9,5 +9,6 @@ from code.algorithms.search.sequential import SequentialSearch; from code.algorithms.search.binary import BinarySearch; from code.algorithms.search.interpol import InterpolationSearch; from code.algorithms.search.jump import JumpSearchLinear; +from code.algorithms.search.jump import JumpSearchExponentiell; from code.algorithms.search.ith_smallest import FindIthSmallest; from code.algorithms.search.ith_smallest_dc import FindIthSmallestDC; diff --git a/code/algorithms/search/jump.py b/code/algorithms/search/jump.py index 3a9ce48..3721463 100644 --- a/code/algorithms/search/jump.py +++ b/code/algorithms/search/jump.py @@ -39,7 +39,7 @@ def postChecks(L: List[int], x: int, index: int, **_): @algorithmInfos(name='Sprungsuche', outputnames='index', checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks) def JumpSearchLinear(L: List[int], x: int, m: int) -> int: ''' - Inputs: L = Liste von Zahlen, x = Zahl, [u, v] = Suchinterval. + Inputs: L = Liste von Zahlen, x = Zahl, m = lineare Sprunggröße. Annahmen: - L sei aufsteigend sortiert. @@ -54,9 +54,39 @@ def JumpSearchLinear(L: List[int], x: int, m: int) -> int: block = L[offset:][:m]; elementAfterBlock = block[-1] + 1; if x < elementAfterBlock: - logDebug('Element muss sich im Block {} befinden.'.format(i)); + logDebug('Element muss sich im Block [{i0}, {i1}) befinden.'.format(i0 = i*m, i1 = (i+1)*m)); index = SequentialSearch(L=block, x=x); return offset + index; # NOTE: muss wegen Offset kompensieren - logDebug('Element befindet sich nicht im Block {}.'.format(i)); + logDebug('Element befindet sich nicht im im Block [{i0}, {i1}) befinden.'.format(i0 = i*m, i1 = (i+1)*m)); i += 1; return -1; + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ALGORITHM jump search - exponentiell +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +@algorithmInfos(name='Sprungsuche (exponentiell)', outputnames='index', checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks) +def JumpSearchExponentiell(L: List[int], x: int) -> int: + ''' + 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. + ''' + i0 = 0; + i1 = 1; + while i0 < len(L): + AddToCounter(); + block = L[i0:i1]; + elementAfterBlock = block[-1] + 1; + if x < elementAfterBlock: + logDebug('Element muss sich im Block [{i0}, {i1}) befinden.'.format(i0 = i0, i1 = i1)); + index = SequentialSearch(L=block, x=x); + return i0 + index; # NOTE: muss wegen Offset kompensieren + logDebug('Element befindet sich nicht im Block [{i0}, {i1}) befinden.'.format(i0 = i0, i1 = i1)); + i0 = i1; + i1 *= 2; + return -1; diff --git a/code/main.py b/code/main.py index 01c27a8..82065e0 100644 --- a/code/main.py +++ b/code/main.py @@ -47,11 +47,12 @@ def LoopThroughCases(path: str): config = ReadConfigFile(path); cases = GetAttribute(config, 'parts', 'cases', expectedtype=list, default=[]); for caseindex, case in enumerate(cases): - DisplayStartOfCase(caseindex); - command = GetAttribute(case, 'command', expectedtype=str, default=''); + descr = GetAttribute(case, 'description', expectedtype=str, default=''); inputs = GetAttribute(case, 'inputs', expectedtype=dict, default={}); + DisplayStartOfCase(caseindex, descr); + try: if command == 'algorithm-sum-maxsub': MaxSubSum(L=inputs['L']); @@ -65,6 +66,8 @@ def LoopThroughCases(path: str): InterpolationSearch(L=inputs['L'], x=inputs['x'], u=0, v=len(inputs['L'])-1); elif command == 'algorithm-search-jump': JumpSearchLinear(L=inputs['L'], x=inputs['x'], m=inputs['m']); + elif command == 'algorithm-search-jump-exp': + JumpSearchExponentiell(L=inputs['L'], x=inputs['x']); elif command == 'algorithm-search-ith-element': FindIthSmallest(L=inputs['L'], i=inputs['i']); elif command == 'algorithm-search-ith-element-dc':