2010-11-08 3 views
2

Я пишу приложение поиска, которое символизирует большой текстовый корпус.String.Split Efficiency Question

текст синтаксический анализатор должен удалить любую чепуху из текста (т.е. [^ A-Za-Z0-9])

У меня было 2 идеи в моей голове, как сделать это:

1) Поместите текст в строку, преобразуйте его в charArray, используя String.tocharArray, а затем запустите char с помощью char с помощью цикла -> while (позиция < string.length) Выполнение этого действия я могу сделать токенизацию всего массива строк за один проход по текст.

2) Сбросьте все non digit/alpha, используя string.replace, а затем string.split с некоторыми разделителями, это означает, что я должен дважды запускать всю строку. Однажды, чтобы удалить плохие символы, а затем снова разбить его.

Я предполагал, что, поскольку # 1 делает то же самое, что и # 2, но в O (n), это будет быстрее, но после тестирования обоих, # 2 - путь (путь!) Быстрее.

Я пошел еще дальше и просмотрел код, стоящий за String.Strip, используя рефлектор red-gate .net. Он запускает неуправляемый символ char, как и # 1, но все еще намного быстрее.

У меня нет подсказки, почему №2 намного быстрее, чем # 1.

Любые идеи?

+0

Как описано, я думаю, что оба метода 1 и метода 2 - O (n) – Greg

+2

Бессмысленно догадываться о перфекте, пока вы не опубликуете код, который каждый может попробовать. Насколько нам известно, вы действительно набрали № 1. String.Replace() сильно оптимизирован, потому что это алгоритм O (nm), но вам все равно нужно запустить его k раз. Ваше нахождение не имеет большого смысла. –

ответ

1

Как насчет этой идеи:

  1. Создание строки
  2. погрузить весь набор данных в строку
  3. Создать StringBuilder с достаточно предварительно выделенное пространство для хранения всей строки
  4. Go символ по символу через строку, и если символ является буквенно-цифровым, добавьте его в StringBuilder.
  5. В конце вы получите строку из StringBuilder.

Я не знаю, будет ли это быстрее, чем вы уже пробовали, но при определении времени выше следует хотя бы ответить на этот вопрос.

+0

После дополнительной отладки я заметил, что моя эффективность очень низкая при обработке чисел. – djTeller

0

djTeller,
Тот факт, что # 2 быстрее, относится только к вашему методу # 1.
Возможно, вам захочется поделиться с нами своим # 1 методом; возможно, это очень медленно, и возможно сделать это быстрее, чем # 2.
Да, оба они суть O (n), но это реализация ACTUAL O (n); как вы на самом деле делали # 1?

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

+0

Я тестировал его на огромном корпусе 1 ГБ. Я скоро вставлю код. – djTeller