binary search: illustrated step-by-step walk through

Post on 13-Dec-2014

803 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

A step-by-step illustration of Binary Search to help you walk through a series of operations. Illustration is accompanied by actual code with bold line indicating the current operation. https://github.com/yoshiwatanabe/Algorithms/blob/master/Finding/BinarySearch.cs

TRANSCRIPT

Binary SearchIllustrated walk through

int begin = 0;int last = array.Length - 1; int mid = 0;

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

Part #1 Initialize pointers

Part #2 Search

Iterative binary search

2 4 5 6

[0] [1] [2] [3]

begin last mid4x

This is what we search for

Let’s look for 4

2 4 5 6

[0] [1] [2] [3]

int begin = 0;int last = array.Length - 1; int mid = 0;

begin

last

mid

4x0

0

3

2 4 5 6

[0] [1] [2] [3]

0begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

4x0 <= 3is true

0

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

4x

(0+3)/2 = 1

0

1

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

4x

4 < 4is false

0

1

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

4x

4 > 4is false

0

1

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

4x0

1

3

We found x=4 at index 1!

2 4 5 6

[0] [1] [2] [3]

begin last mid5x

This is what we search for

Let’s look for 5

2 4 5 6

[0] [1] [2] [3]

int begin = 0;int last = array.Length - 1; int mid = 0;

begin

last

mid

5x0

0

3

2 4 5 6

[0] [1] [2] [3]

0begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

5x0 <= 3is true

0

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

5x

(0+3)/2 = 1

0

1

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

5x

4 < 5is true

0

1

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

5x2

1

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

5x2

1

32 <= 3is true

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

5x2

2

3

(2+3)/2 =2

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

5x2

2

3

5 < 5is false

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

5x2

2

3

5 > 5is false

2 4 5 6

[0] [1] [2] [3]

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

5xbegin

last

mid

2

2

3

We found x=5 at index 2!

2 4 5 6

[0] [1] [2] [3]

begin last mid6x

This is what we search for

Let’s look for 6

2 4 5 6

[0] [1] [2] [3]

int begin = 0;int last = array.Length - 1; int mid = 0;

begin

last

mid

6x0

0

3

2 4 5 6

[0] [1] [2] [3]

0begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x0 <= 3is true

0

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x

(0+3)/2 = 1

0

1

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x

4 < 6is true

0

1

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x2

1

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x2

1

32 <= 3is true

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x2

2

3

(2+3)/2 =2

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x2

2

3

5 < 6is true

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x3

2

3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x3

2

33 <= 3is true

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x3

3

3

(3+3)/2 = 3

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x3

3

3

6 < 6is false

2 4 5 6

[0] [1] [2] [3]

begin

last

mid

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x3

3

3

6 > 6is false

2 4 5 6

[0] [1] [2] [3]

while (begin <= last) { mid = (begin + last) / 2; if (array[mid] < x) { begin = mid + 1; } else if (array[mid] > x) { last = mid - 1; } else { return mid; }}

return -1;

6x

We found x=6 at index 3!

begin

last

mid

3

3

3

top related