Как быстро на c# искать в строке массив строк?

Сейчас ищу в строке line вхождение массива строк s
string[] s = { "тест1","тест2","тест3","тест4" };

for (int j = 0; j < s.Length; j++)
{
  if (line.IndexOf(s[j]) > 0)
  {

  }
}


Как можно искать ещё быстрее этого кода?
  • Вопрос задан
  • 6832 просмотра
Решения вопроса 1
@AM5800
Я не нашел точной информации, но, похоже, что string.IndexOf использует простоейший алгоритм поиска подстроки, который работает за O(nm). (n - длина исходной строки, m - длина образца).
А поскольку у вас еще p образцов - получаем кубическую сложность.

Самый простой вариант в данном случае - использовать другой алгоритм поиска подстроки. Вообще, алгоритмов поиска подстроки великое множество. Разные алгоритмы с одинаковой асимптотикой могут очень-по разному себя проявлять на различных данных. В любом случае, стоит попробовать разные варианты, чтобы определить какой алгоритм будет быстрее в вашем случае.

Но, на первый взгляд мне кажется, что вам вполне подойдет алгоритм Ахо—Корасик
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
lam0x86
@lam0x86
Прошу прощение за некропостинг, но есть гораздо более простое решение, чем Ахо-Корасики =)
string[] array = { "тест1", "тест2", "тест3", "тест4" };

if (new Regex(string.Join("|", array.Select(Regex.Escape))).IsMatch(line))
{
    // do work
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы