Реализовать алгоритм Рабина с использованием хеш функций - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Необходимо реализовать алгоритм Рабина с использованием хеш функций на языке C#. Нашел в википедии реализацию. Помогите перевести на нужный язык. Спасибо!
Листинг программы
  1. function RabinKarp(string s[1..n], string sub[1..m])
  2. hsub := hash(sub[1..m])
  3. hs := hash(s[1..m])
  4. for i from 1 to (n-m+1)
  5. if hs = hsub
  6. if s[i..i+m-1] = sub
  7. return i
  8. hs := hash(s[i+1..i+m])
  9. return not found

Решение задачи: «Реализовать алгоритм Рабина с использованием хеш функций»

textual
Листинг программы
  1. //Хеш-функция для алгоритма Рабина-Карпа
  2. public static int Hash(string x)
  3.         {
  4.             int p = 31; //Простое число
  5.             int rez = 0; //Результат вычисления
  6.             for (int i = 0; i < x.Length; i++)
  7.             {
  8.                 rez += (int)Math.Pow(p,x.Length-1-i)*(int)(x[i]);//Подсчет хеш-функции
  9.             }
  10.             return rez;
  11.         }
  12. //Функция поиска алгоритмом Рабина-Карпа
  13. public static string Rabina(string x, string s)
  14.         {
  15.             string nom = ""; //Номера всех вхождений образца в строку
  16.             if (x.Length > s.Length) return nom; //Если искомая строка больше исходной – возврат пустого поиска
  17.             int xhash = Hash(x); //Вычисление хеш-функции искомой строки
  18.             int shash = Hash(s.Substring(0,x.Length)); //Вычисление хеш-функции первого слова длины образца в строке S
  19.             bool flag;
  20.             int j;
  21.             for (int i = 0; i < s.Length - x.Length; i++)
  22.             {
  23.                 if (xhash == shash)//Если значения хеш-функций совпадают
  24.                 {
  25.                     flag = true;
  26.                     j = 0;
  27.                     while ((flag == true) && (j < x.Length))
  28.                     {
  29.                         if (x[j] != s[i + j]) flag = false;
  30.                         j++;
  31.                     }
  32.                     if (flag == true) //Если искомая строка совпала с частью исходной
  33.                         nom = nom + Convert.ToString(i) + ", "; //Добавление номера вхождения
  34.                 }
  35.                 else //Иначе вычисление нового значения хеш-функции
  36.                     shash = (shash - (int)Math.Pow(31,x.Length-1)*(int)(s[i]))*31+(int)(s[i+x.Length]);
  37.             }
  38.             if (nom != "") //Если вхождение найдено
  39.             {
  40.                 nom = nom.Substring(0, nom.Length - 2); //Удаление запятой и пробела
  41.             }
  42.             return nom; //Возвращение результата поиска
  43.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы