Risonna

Алгоритм Рабина-Карпа

Jul 31st, 2018
586
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.33 KB | None | 0 0
  1. def simple_find(s, sub):
  2.     N = 0
  3.     for pos in range(0, len(s) - len(sub) + 1):
  4.         N += 1
  5.         flag = True
  6.         for i in range(len(sub)):
  7.             if s[pos+i] != sub[i]:
  8.                 flag = False
  9.                 break
  10.             N += 1
  11.         if flag:
  12.             print(pos)
  13.     print('Потребовалось N=%d операций'%(N))
  14.  
  15.  
  16.  
  17. def rabin_karp_find(s, sub):
  18.     N = 0
  19.     h_sub = sum(ord(c) for c in sub)
  20.     h = sum(ord(c) for c in s[:len(sub)])
  21.     for pos in range(0, len(s) - len(sub)):
  22.         N += 1
  23.         if h != h_sub: # не совпали хеш-функции подстроки и кусочка строки
  24.             h = h - ord(s[pos]) + ord(s[pos + len(sub)])  # перевычисление хеш-функции
  25.             continue
  26.         h = h - ord(s[pos]) + ord(s[pos + len(sub)])  # перевычисление хеш-функции
  27.         flag = True
  28.         for i in range(len(sub)):
  29.             if s[pos+i] != sub[i]:
  30.                 flag = False
  31.                 break
  32.             N += 1
  33.         if flag:
  34.             print(pos)
  35.     print('Потребовалось N=%d операций'%(N))
  36.  
  37. #s = 'АТАГАТАЦАТАГАТАЦАТАГАТАГАЦАТА'
  38. s = ('A'*10 + 'T')*100 + 'A'*11 + 'T'
  39. simple_find(s, 'A'*11)
  40. rabin_karp_find(s, 'A'*11)
Advertisement
Add Comment
Please, Sign In to add comment