Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Пользовательская функция по поиску в длинных строках, т.е. за гранью возможностей стандартных функций по работе с текстом.
 
Написал небольшую функцию по поиску подстроки в строке. Возможно кому пригодится.
Функция расчитана на работу с любыми строками в ASC II кодировке.

Алгоритм и как все это работает:
- за основу был опробованный ранее матричный вариант разбивки строки посимвольно на группы индексов
- вначале строка с подстрокой поиска превращаются в набор байтов
- берется первый и последний байт подстроки
- по ним осуществляется индексация всех вхождений подобных символов/кодов/байтов в строке
- пару вложенных циклов с замером расстояния между символами/кодами
- встречное сравнение всех промежуточных байтов
- инкреация счетчика и запись начальных индексов в выходной массив - индексы вхождений

На 100кк символьной строке поиск подстроки из трех символов на моей древней АМДэшке занял чуть более 14 сек (около 900 вхождений).
Скорость работы зависит от количества подстрок в основной строке.
Сравнения с учетом регистра.
В качестве UDFки на листе будет возвращать только количество вхождений подстроки.

Тестер:
Скрытый текст
Поисковик:
Скрытый текст
Изменено: Anchoret - 28 Мар 2018 07:04:46
 
Anchoret, не слишком ли сложно? Вот функция, которая делает то же самое, с использованием удобной и быстрой функции Instr, и кстати возвращает правильные индексы в массиве (или я не понял, что возвращает в массиве ваша функция).
На строке длиной 100 млн у меня ошибка Out of memory на команде
Код
bb = StrConv(iStr, 128)
, хотя свободной памяти 800МБ (WinXP SP3, Офис 2007 или 2010).
Так что пробовал со строке длиной 50 млн.
Скрытый текст
Результат
Скрытый текст
 
Цитата
Казанский написал:
или я не понял, что возвращает в массиве ваша функция
Все верно, там ошибка. При разбитии строки на байты массив начинается с нуля. Поэтому и индексы там не правильные.
Вот:
Скрытый текст
Да, и раз InStr способна окучивать такие объемы, то моя недофункция не нужна :) Соревноваться в скорости со встроенными функциями и используя при этом одну из них - глупо.Если только не использовать InStrB. Возможно потом проверю.
Изменено: Anchoret - 28 Мар 2018 07:09:00
 
Модераторам: просьба удалить тему, т.к. она не имеет смысла) Спасибо.
Страницы: 1
Читают тему (гостей: 1)
Наверх