46 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			46 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: Rabin Karp Algorithm
							 | 
						|||
| 
								 | 
							
								localeTitle: Алгоритм Рабина Карпа
							 | 
						|||
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								## Алгоритм Рабина-Карпа
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   Алгоритм поиска / поиска строк, разработанный Майклом О. Рабиным и Ричардом М. Карпом.
							 | 
						|||
| 
								 | 
							
								*   Использует метод **_хэширования_** и **_грубую силу_** для сравнения.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### Важные условия
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   **_pattern_** - строка, подлежащая поиску. Рассмотрим длину шаблона как **_M_** символов.
							 | 
						|||
| 
								 | 
							
								*   **_текст_** - это весь текст, из которого следует искать шаблон. Рассмотрим длину текста как **_N_** символов.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### Что такое сравнение грубой силы?
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								При сравнении грубой силы каждый символ шаблона сравнивается с каждым символом текста до тех пор, пока не будут найдены символы, не соответствующие символу.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### Работа алгоритма Рабина-Карпа
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								1.  Рассчитать хэш-значение _шаблона_
							 | 
						|||
| 
								 | 
							
								2.  Рассчитать хэш-значение первых _M_ символов _текста_
							 | 
						|||
| 
								 | 
							
								3.  Сравните оба значения хэша
							 | 
						|||
| 
								 | 
							
								4.  Если они не равны, вычислите хэш-значение для следующих _M_ символов _текста_ и сравните их снова.
							 | 
						|||
| 
								 | 
							
								5.  Если они равны, выполните сравнение грубой силы.
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								hash_p = hash value of pattern 
							 | 
						|||
| 
								 | 
							
								 hash_t = hash value of first M letters in body of text 
							 | 
						|||
| 
								 | 
							
								 do 
							 | 
						|||
| 
								 | 
							
								    if (hash_p == hash_t) 
							 | 
						|||
| 
								 | 
							
								        brute force comparison of pattern and selected section of text 
							 | 
						|||
| 
								 | 
							
								    hash_t= hash value of next section of text, one character over 
							 | 
						|||
| 
								 | 
							
								 while (end of text or brute force comparison == true) 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### Преимущество над алгоритмом наивного строкового соответствия
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Этот метод приводит только к одному сравнению для каждой подпоследовательности текста, и грубая сила требуется только тогда, когда значения хэша совпадают.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### Приложения
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   **_Обнаружение плагиата_**
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### Дополнительная информация:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								[Рабин-Карп в Википедии](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm/)
							 |