Skip to content

Commit 76aec62

Browse files
Merge pull request wangzheng0822#190 from KPatr1ck/bf_rk
BF & RK implementation in python
2 parents fb121ce + 3fd9a80 commit 76aec62

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

python/32_bf_rk/bf_rk.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#!/usr/bin/python
2+
# -*- coding: UTF-8 -*-
3+
4+
from time import time
5+
6+
7+
def bf(main, pattern):
8+
"""
9+
字符串匹配,bf暴搜
10+
:param main: 主串
11+
:param pattern: 模式串
12+
:return:
13+
"""
14+
n = len(main)
15+
m = len(pattern)
16+
17+
if n <= m:
18+
return 0 if pattern == main else -1
19+
20+
for i in range(n-m+1):
21+
for j in range(m):
22+
if main[i+j] == pattern[j]:
23+
if j == m-1:
24+
return i
25+
else:
26+
continue
27+
else:
28+
break
29+
return -1
30+
31+
32+
def simple_hash(s, start, end):
33+
"""
34+
计算子串的哈希值
35+
每个字符取acs-ii码后求和
36+
:param s:
37+
:param start:
38+
:param end:
39+
:return:
40+
"""
41+
assert start <= end
42+
43+
ret = 0
44+
for c in s[start: end+1]:
45+
ret += ord(c)
46+
return ret
47+
48+
49+
def rk(main, pattern):
50+
n = len(main)
51+
m = len(pattern)
52+
53+
if n <= m:
54+
return 0 if pattern == main else -1
55+
56+
# 子串哈希值表
57+
hash_memo = [None] * (n-m+1)
58+
hash_memo[0] = simple_hash(main, 0, m-1)
59+
for i in range(1, n-m+1):
60+
hash_memo[i] = hash_memo[i-1] - simple_hash(main, i-1, i-1) + simple_hash(main, i+m-1, i+m-1)
61+
62+
# 模式串哈希值
63+
hash_p = simple_hash(pattern, 0, m-1)
64+
65+
for i, h in enumerate(hash_memo):
66+
# 可能存在哈希冲突
67+
if h == hash_p:
68+
if pattern == main[i:i+m]:
69+
return i
70+
else:
71+
continue
72+
return -1
73+
74+
75+
if __name__ == '__main__':
76+
m_str = 'a'*10000
77+
p_str = 'a'*200+'b'
78+
79+
print('--- time consume ---')
80+
t = time()
81+
print('[bf] result:', bf(m_str, p_str))
82+
print('[bf] time cost: {0:.5}s'.format(time()-t))
83+
84+
t = time()
85+
print('[rk] result:', rk(m_str, p_str))
86+
print('[rk] time cost: {0:.5}s'.format(time()-t))
87+
88+
print('')
89+
print('--- search ---')
90+
m_str = 'thequickbrownfoxjumpsoverthelazydog'
91+
p_str = 'jump'
92+
print('[bf] result:', bf(m_str, p_str))
93+
print('[rk] result:', rk(m_str, p_str))

0 commit comments

Comments
 (0)