Created
December 19, 2012 23:35
-
-
Save heyhuyen/4341692 to your computer and use it in GitHub Desktop.
Naive string search algorithm implementations in Python 2.7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# In the middle of implementing Boyer-Moore's string search algorithm, I decided to play with my original naive search algorithm. It's implemented as an instance method that takes a string to be searched. The object has an attribute 'pattern' which is the pattern to match. | |
# 1) Here is the original version of the search method, using a double for-loop. | |
# Makes calls to range and len | |
def search(self, string): | |
for i in range(len(string)): | |
for j in range(len(self.pattern)): | |
if string[i+j] != self.pattern[j]: | |
break | |
elif j == len(self.pattern) - 1: | |
return i | |
return -1 | |
# 2) Here is the second version, using a double while-loop instead. | |
# Slightly faster, not making calls to range | |
def search(self, string): | |
i = 0 | |
while i < len(string): | |
j = 0 | |
while j < len(self.pattern) and self.pattern[j] == string[i+j]: | |
j += 1 | |
if j == len(self.pattern): | |
return i | |
i += 1 | |
return -1 | |
# 3) Here is the original, replacing range with xrange. | |
# Faster than both of the previous two. | |
def search(self, string): | |
for i in xrange(len(string)): | |
for j in xrange(len(self.pattern)): | |
if string[i+j] != self.pattern[j]: | |
break | |
elif j == len(self.pattern) - 1: | |
return i | |
return -1 | |
# 4) Storing values in local variables = win! With the double while loop, this is the fastest. | |
def search(self, string): | |
len_pat = len(self.pattern) | |
len_str = len(string) | |
i = 0 | |
while i < len_str: | |
j = 0 | |
while j < len_pat and self.pattern[j] == string[i+j]: | |
j += 1 | |
if j == len_pat: | |
return i | |
i += 1 | |
return -1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment