Chapter 2 8 Search Algorithms Search Algorithms Array

  • Slides: 58
Download presentation
Chapter 2. 8 Search Algorithms

Chapter 2. 8 Search Algorithms

Search Algorithms • Array Search – An array contains a certain number of records

Search Algorithms • Array Search – An array contains a certain number of records – Each record is identified by a certain key – One searches the record with a given key • String Search – A text is represented by an array of characters – One searches one or all occurrences of a certain string

Search Algorithms • Array Search – An array contains a certain number of records

Search Algorithms • Array Search – An array contains a certain number of records – Each record is identified by a certain key – One searches the record with a given key • String Search – A text is represented by an array of characters – One searches one or all occurrences of a certain string

Array Search PROCEDURE Search – Two parameters: • The Array to be searched –

Array Search PROCEDURE Search – Two parameters: • The Array to be searched – Contains n Items – Index in the range 0. . n – Item with index 0 is not used • The Key of the Item to be found – Search returns a Cardinal value • the index of the Item where the key has been found • if the key has not been found , 0.

Array Search TYPE Array. Of. Items = ARRAY[0. . n] OF Item; (* By

Array Search TYPE Array. Of. Items = ARRAY[0. . n] OF Item; (* By convention, the element with index 0 is not used *) Item = RECORD Key : Key. Type (* any ordinal type *); Other record fields ; END;

Straight Search PROCEDURE Search ( VAR A: ARRAY OF Item, Key: Key. Type) :

Straight Search PROCEDURE Search ( VAR A: ARRAY OF Item, Key: Key. Type) : CARDINAL; VAR i : CARDINAL; BEGIN i : = HIGH(A); WHILE A[i]. Key # Key AND i # 0 DO DEC(i) END; RETURN i END Search;

Straight Search PROCEDURE Search ( VAR A: ARRAY OF Item, Key: Key. Type) :

Straight Search PROCEDURE Search ( VAR A: ARRAY OF Item, Key: Key. Type) : CARDINAL; VAR i : CARDINAL; BEGIN i : = HIGH(A); WHILE A[i]. Key # Key AND i # 0 DO DEC(i) END; RETURN i END Search;

Sentinel Search PROCEDURE Search ( VAR A: ARRAY OF Item, Key: Key. Type) :

Sentinel Search PROCEDURE Search ( VAR A: ARRAY OF Item, Key: Key. Type) : CARDINAL; VAR i : CARDINAL; BEGIN i : = HIGH(A); A[0]. Key : = Key; WHILE A[i]. Key # Key DO DEC(i) END; RETURN i END Search;

Binary Search # elements > 1 Yes No Key = Keyelement No Not Found

Binary Search # elements > 1 Yes No Key = Keyelement No Not Found Yes No Found Key < Keymiddle Binary Search right half Yes Binary Search left half # elements > 1

Binary Search (1) PROCEDURE Search(VAR a: ARRAY OF Item, Key: Key. Type): CARDINAL; VAR

Binary Search (1) PROCEDURE Search(VAR a: ARRAY OF Item, Key: Key. Type): CARDINAL; VAR Min, Max, m: CARDINAL; PROCEDURE src(Min, Max: CARDINAL); … END src; BEGIN Min : = 1; Max : = HIGH(a); src(Min, Max); IF a[m]. Key = Key THEN RETURN m ELSE RETURN 0 END Search;

Binary Search (2) PROCEDURE Src(Min, Max : CARDINAL); BEGIN m : = (Min+Max) DIV

Binary Search (2) PROCEDURE Src(Min, Max : CARDINAL); BEGIN m : = (Min+Max) DIV 2; IF Min # Max THEN IF a[m]. Key >= Key THEN src(Min, m) ELSE src(m+1, Max) END; END Src;

Iterative Binary Search PROCEDURE Search(VAR a: ARRAY OF Item, Key: Key. Type): CARDINAL; VAR

Iterative Binary Search PROCEDURE Search(VAR a: ARRAY OF Item, Key: Key. Type): CARDINAL; VAR Min, Max, m: CARDINAL; BEGIN Min : = 1; Max : = HIGH(a); WHILE Min < Max DO m : = (Min+Max) DIV 2; IF a[m]. Key >= Key THEN Max : = m ELSE Min : = m+1 END; (* IF *) END; (* WHILE *) IF a[m]. Key = Key THEN RETURN m ELSE RETURN 0 END Search;

Array Search Performance (Number of comparisons) • Unordered Array – Straight search : 2

Array Search Performance (Number of comparisons) • Unordered Array – Straight search : 2 n – Sentinel search : n • Ordered Array – Binary search : log 2 n

Search Algorithms • Array Search – An array contains a certain number of records

Search Algorithms • Array Search – An array contains a certain number of records – Each record is identified by a certain key – One searches the record with a given key • String Search – A text is represented by an array of characters – One searches one or all occurrences of a certain string

String Search • The problem: Find a given string in a text. • Data

String Search • The problem: Find a given string in a text. • Data structures: Text : ARRAY[1. . Text. Size] OF CHAR; String : ARRAY[1. . String. Size] OF CHAR; • The Algorithms: – Brute Force – Knuth, Morris & Pratt (KPM - 1974) – Boyer & Moore (BM - 1977)

String Search by Brute Force this algorithm tries to find a string WHILE current

String Search by Brute Force this algorithm tries to find a string WHILE current char. in Text # String[1] Move to next character in Text End of Text reached ? No WHILE char. in Text = char. in String Move to next character pair String matched OR Text exhausted

Brute Force String Search (Straightforward coding) PROCEDURE Search (VAR Text: Text. Type; TLength: CARDINAL;

Brute Force String Search (Straightforward coding) PROCEDURE Search (VAR Text: Text. Type; TLength: CARDINAL; VAR String: String. Type; SLength: CARDINAL): CARDINAL; VAR j, jmax : CARDINAL; BEGIN j : = 0; jmax : = TLength - SLength; REPEAT WHILE (Text[j] # String[1]) AND (j <= jmax) DO j : = j+1 END; IF j <= jmax THEN i : = 2; WHILE (Text[j+i] = String[i]) AND (i < SLength) DO i : = i+1 END; (* IF *) j : = j + 1; UNTIL (i = SLength) OR (j > jmax); RETURN j - 1 END Search;

String Search (1) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in first position of

String Search (1) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in first position of string, Move string 1 position in text

String Search(2) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in fourth position of string,

String Search(2) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in fourth position of string, Move string 4 positions in text

String Search(3) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in fifth position of string,

String Search(3) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in fifth position of string, Move string 4 positions in text

String Search(4) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in first position of string,

String Search(4) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in first position of string, Move string 1 position in text

String Search(5) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in first position of string,

String Search(5) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in first position of string, Move string 1 position in text

String Search(6) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in second position of string,

String Search(6) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in second position of string, Move string 1 position in text

String Search(7) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in eight position of string,

String Search(7) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT Mismatch in eight position of string, Move string 3 positions in text

String Search(8) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT String found !

String Search(8) by the KMP algorithm GATCAGCAATCATCATCACATC ATCATCACAT String found !

The KMP algorithm The Next function x x x / A x x x

The KMP algorithm The Next function x x x / A x x x x A T C A C A T Step: 1 ? ? ? ? ? A T C A C A T

The KMP algorithm The Next function x x x A / T x x

The KMP algorithm The Next function x x x A / T x x x A T C A C A T Step: 1 1 ? ? ? ? A T C A C A T

The KMP algorithm The Next function x x x A T C / x

The KMP algorithm The Next function x x x A T C / x x x A T C A C A T Step: 1 1 2 ? ? ? ? A T C A C A T

The KMP algorithm The Next function / x x x x A T C

The KMP algorithm The Next function / x x x x A T C A T Step: 1 1 2 4 ? ? ? A T C A C A T

The KMP algorithm The Next function x x x A T C A /

The KMP algorithm The Next function x x x A T C A / T x x x x x A T C A C A T Step: 1 1 2 4 4 ? ? ? A T C A C A T

The KMP algorithm The Next function x x x A T C A T

The KMP algorithm The Next function x x x A T C A T / C x x x x A T C A C A T Step: 1 1 2 4 4 5 ? ? A T C A C A T

The KMP algorithm The Next function x x x A T C / A

The KMP algorithm The Next function x x x A T C / A x x x x A T C A C A T Step: 1 1 2 4 4 5 7 ? ? ? A T C A

The KMP algorithm The Next function x x x A T C A C

The KMP algorithm The Next function x x x A T C A C / x x x A T C A C A T Step: 1 1 2 4 4 5 7 3 ? ? A T C A C A T

The KMP algorithm The Next function x x x A T C A C

The KMP algorithm The Next function x x x A T C A C A / x x x A T C A C A T Step: 1 1 2 4 4 5 7 3 9 ? A T C A T

The KMP algorithm The Next function x x x A T C A C

The KMP algorithm The Next function x x x A T C A C A / T x x A T C A C A T Step: 1 1 2 4 4 5 7 3 9 9 A T C A T

The KMP algorithm The Next function String: A T C A C A T

The KMP algorithm The Next function String: A T C A C A T 1 1 2 4 4 5 7 3 9 9 0 1 1 0 5 0 1 i = 1 2 3 4 5 6 7 8 9 10 Step: Next: Next[i] = i – Step[i]

Computation of the Next table i : = 1; k : = 0; Next[1]

Computation of the Next table i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *)

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 1 String A Next 0 k : 0 T C A C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 1 String A Next 0 k : 0 T C A C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 1 > 2 String A T Next 0 1 k : 0 > 1 C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 2 String A T Next 0 1 k : 1 > 0 C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 2 > 3 String A T Next 0 1 k : 0 > 1 C 1 A T C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 3 String A T Next 0 1 k : 1 > 0 C 1 A T C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 3 > 4 String A T Next 0 1 k : 0 > 1 C 1 A 0 T C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 4 String A Next 0 k : 1 T 1 C 1 A 0 T C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 4 > 5 String A T Next 0 1 k : 1 > 2 C 1 A 0 T C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 5 String A Next 0 k : 2 T 1 C 1 A 0 T 1 C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 5 > 6 String A T Next 0 1 k : 2 > 3 C 1 A 0 T 1 C 1 A C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 6 String A Next 0 k : 3 T 1 C 1 A 0 T 1 C 1 A C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 6 > 7 String A T Next 0 1 k : 3 > 4 C 1 A 0 T 1 C 1 A 0 C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 7 String A Next 0 k : 4 T 1 C 1 A 0 C A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 7 > 8 String A T Next 0 1 k : 4 > 5 C 1 A 0 T 1 C 1 A 0 C 5 A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 8 String A T C Next 0 1 1 k : 5 > 1 > 0 A 0 T 1 C 1 A 0 C 5 A T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 8 > 9 String A T Next 0 1 k : 0 > 1 C 1 A 0 T 1 C 1 A 0 C 5 A 0 T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 9 String A Next 0 k : 1 T 1 C 1 A 0 C 5 A 0 T

The KMP algorithm Building the Next function i : = 1; k : =

The KMP algorithm Building the Next function i : = 1; k : = 0; Next[1] : = 0; WHILE i < SLength DO WHILE (k > 0) AND (String[i]#String[k]) DO k : = Next[k] END; (* WHILE *) k : = k + 1; i : = i + 1; IF String[i] = String[k] THEN Next[i] : = Next[k] ELSE Next[i] : = k END; (* IF *) END; (* WHILE *) i : 9 > 10 String A T Next 0 1 k : 1 > 2 C 1 A 0 T 1 C 1 A 0 C 5 A 0 T 1

Actual KMP search j : = 1; i : = 1; WHILE (i <=

Actual KMP search j : = 1; i : = 1; WHILE (i <= SLength) AND (j <= TLength) DO WHILE (i > 0) AND (Text[j] # String[i]) DO i : = Next[i] END; (* WHILE *) i : = i + 1; j : = j + 1; END; (* WHILE *) IF i > SLength THEN RETURN j - SLength ELSE RETURN TLength END; (* IF *)

String Search Performance • Text length = n characters • String length = m

String Search Performance • Text length = n characters • String length = m characters • The Algorithms: – Brute Force • Worst case search time : O(n*m) – Knuth, Morris & Pratt (KMP - 1974) • Worst case search time : O(n+m) – Boyer & Moore (BM - 1977) • Similar to but slightly better than KMP.