Skip to content

Instantly share code, notes, and snippets.

@heyhuyen
Created December 19, 2012 23:35
Show Gist options
  • Save heyhuyen/4341692 to your computer and use it in GitHub Desktop.
Save heyhuyen/4341692 to your computer and use it in GitHub Desktop.
Naive string search algorithm implementations in Python 2.7
# 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