Binary search: Difference between revisions

From Algowiki
Jump to navigation Jump to search
Line 7: Line 7:
== Abstract view ==
== Abstract view ==


The subroutine does nothing but calling another, recursive subroutine with the same output and the following input: array <math>A</math>, comparison <math>cmp</math>, element <math>s</math> and, in addition, two indices of <math>A</math>, <math>\ell</math> and <math>r</math> such that <math>\ell<r</math>,
The subroutine does nothing but calling another, recursive subroutine with the same output and the following input: array <math>A</math>, comparison <math>cmp</math>, element <math>s</math> and, in addition, two indices of <math>A</math>, <math>\ell</math> and <math>r</math>, such that <math>\ell<r</math>. In the original call to this recursive subroutine, <math>\ell</math> is the first and <math>r</math> the last index of <math>A</math>.


'''Invariant:''' For every recursive call:
'''Invariant:''' For every recursive call:
# The pointer <math>p</math> points to the sequence at position <math>k_i</math>
If <math>s</math> is present at least once in <math>A</math>, then all indices of <math>A</math> where <math>s</math> is present are in the interval <math>[\ell,\ldots,r]</math>.
#The key <math>\Kappa </math> is in the range of <math>[k_i-n/2^i, k_i +n/2^i]</math>


'''Variant:''' The pointer <math>p</math> is moved so the sequence item at the position (rounded) <math>(k_i+k_{i-1})/2</math> with <math>k_0=0 if S[n/2]<\Kappa,k_0=n if S[n/2]>\Kappa  </math>
'''Variant:''' The pointer <math>p</math> is moved so the sequence item at the position (rounded) <math>(k_i+k_{i-1})/2</math> with <math>k_0=0 if S[n/2]<\Kappa,k_0=n if S[n/2]>\Kappa  </math>

Revision as of 06:00, 27 April 2016

Binary search

Algorithmic problem: Finding an element in a sorted array

Type of algorithm: recursion

Abstract view

The subroutine does nothing but calling another, recursive subroutine with the same output and the following input: array [math]\displaystyle{ A }[/math], comparison [math]\displaystyle{ cmp }[/math], element [math]\displaystyle{ s }[/math] and, in addition, two indices of [math]\displaystyle{ A }[/math], [math]\displaystyle{ \ell }[/math] and [math]\displaystyle{ r }[/math], such that [math]\displaystyle{ \ell\lt r }[/math]. In the original call to this recursive subroutine, [math]\displaystyle{ \ell }[/math] is the first and [math]\displaystyle{ r }[/math] the last index of [math]\displaystyle{ A }[/math].

Invariant: For every recursive call: If [math]\displaystyle{ s }[/math] is present at least once in [math]\displaystyle{ A }[/math], then all indices of [math]\displaystyle{ A }[/math] where [math]\displaystyle{ s }[/math] is present are in the interval [math]\displaystyle{ [\ell,\ldots,r] }[/math].

Variant: The pointer [math]\displaystyle{ p }[/math] is moved so the sequence item at the position (rounded) [math]\displaystyle{ (k_i+k_{i-1})/2 }[/math] with [math]\displaystyle{ k_0=0 if S[n/2]\lt \Kappa,k_0=n if S[n/2]\gt \Kappa }[/math]

Break condition: Either [math]\displaystyle{ S[k_i]=\Kappa }[/math] or, otherwise, [math]\displaystyle{ k_i=k_{i+1} with S[k_i]\neq \Kappa }[/math].

Induction basis

Abstract view: Set [math]\displaystyle{ p:= }[/math] n/2.

Implementation: Obvious.

Proof: Nothing to show.

Induction step

Abstract view:

If p points to a node but not with key K, p descends in the appropriate direction, left or right.

Implementation:

  1. If [math]\displaystyle{ p.key = K }[/math], terminate the algorithm and return true.
  2. Otherwise:
    1. If [math]\displaystyle{ K \lt p.key }[/math], set [math]\displaystyle{ p }[/math] to the sequence element [math]\displaystyle{ k_{i+1}=k_i-n/2^i }[/math].
    2. If [math]\displaystyle{ K \gt p.key }[/math], set [math]\displaystyle{ p }[/math]to the sequence element [math]\displaystyle{ k_{i+1}=k_i-n/2^i }[/math].

Correctnes: Obvious.

Complexity

Statement: Log(n)

Proff: Obvious.