|
|
||||||
Реализация LIKE как в VB или SQL на С++ или Си04.06.2023, 10:06. Показов 12798. Ответов 62
Метки нет (Все метки)
Мое почтение, джентльмены.
Нужна быстрая реализация LIKE как в VB или SQL (алгоритм аналогичный) на С++ или Си. Из вменяемого нашел только часть алгоритма (ссылка не вставляется, напишу ниже). А так же в Win32 SymMatchString(), которая на порядок медленее чем моя текущая реализация. Не хочу колхозить свой велосипед, возможно кто-то сможет поделится проверенным алгоритмом. Добавлено через 11 минут Из stackoverflow: Как-проверить-соответствие-имени-файла-маске Маска может содержать: ? - означает 1 любой символ * - означает 0 или более любых символов любые другие символы означают сами себя
0
|
||||||
| 04.06.2023, 10:06 | |
|
Ответы с готовыми решениями:
62
Реализация Round Robin Algoritm, данные должны храниться или в памяти, или на внешнем SQL хранилище Есть ли в VB или в ADO, DAO или RDO функция преобразования MS SQL типов данных в MS Access? Создайте приложение с SQL Server 2012 (или более поздней версии), .NET 4.8 и Entity Framework 6.2 (или 6.4) с по |
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
|
| 06.06.2023, 10:42 | |
|
bedvit, подправил https://onlinegdb.com/1DArXcTR5
0
|
|
|
|
|
| 06.06.2023, 11:38 [ТС] | |
|
Алексей1153, сделал общий тест: https://onlinegdb.com/VuJWz2F2_
Раскомментируйте остальные строки в тесте, там ваша функция спотыкается. К сожалению, пока не могу обойти проблему с повторяющейся маской в строке, когда отличие появляется в последних символах, к примеру "ac5c5b" Like "a*[1-56-9][!c-e]" должно быть true. видимо нужен перебор нескольких вариантов, с которых начинаются совпадения в случае спецсимвола * Добавлено через 1 минуту Алексей1153, у вас такая же проблема) Добавлено через 2 минуты там 3 функции на тестировании, Алексей1153, моя и check с из stackoverflow (которая умеет только * и ?), но полезна в качестве сравнить скорость. Добавлено через 1 минуту По скорости: Speed test... check, ms: 208 LikeVB, ms: 210 MatchWildcardAndText, ms: 326 Но к сожалению, это только промежуточный результат, т.к. все функции не отрабатывают шаблон без ошибок.
0
|
|
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
||
| 06.06.2023, 13:04 | ||
|
bedvit, я кое-что подправил в коде https://onlinegdb.com/FZxuGEFxk
, но для теста
ac5 c5ba*[1-56-9][!c-e] кстати, вопрос - она должна быть жадная или нет ?
0
|
||
|
|
|||||||
| 06.06.2023, 14:11 [ТС] | |||||||
|
MS SQL тоже (SELECT iif('ac5c5b' Like 'a%[1-56-9][^c-e]','True','False') = True) Добавлено через 9 минут Алексей1153, все равно спотыкается на тех строках, которые закоментированы, вы их раскомментируйте. Добавлено через 28 секунд Кликните здесь для просмотра всего текста
0
|
|||||||
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
|
| 06.06.2023, 14:45 | |
|
bedvit, остальные строки я не смотрел. Сейчас звёздочка работает неправильно. Я позже поразбираюсь, сейчас не могу
Добавлено через 9 минут bedvit, я понял, в чём загвоздка - сейчас я добираюсь по маске до определённого момента на строке, остаются лишние символы. В этой ситуации нужно делать возврат на звёздочку и пробовать там забрать ещё один символ. При нескольких звёздочках таких переборов будет много Сейчас я понятия не имею, как это разруливать в один проход. Разве что делать разветвление разбора, складывать в стек. И возвращаться к сложенным вариантам, если строка не совпалаДобавлено через 9 минут собственно, можно попробовать рекурсию: когда дошли до звезды, вызываем функцию поиска, куда подаём остаток маски (исключая саму звезду) и остаток строки1. Если не сматчилось, меняем подаваемый хвост строки1 1 - тут возможны варианты: 1) подавать, увеличивая по одному символу. 2) подавать половинным делением думаю, второй вариант будет быстрее. И более безопасным в плане переполнения стека
0
|
|
|
|
|
| 06.06.2023, 15:19 [ТС] | |
|
Алексей1153, да, я поэтому и не хотел свой велосипед придумывать
Наверняка, это где-то и кто-то делал, проводил тесты в разных сочетаниях, всех возможных, отлавливал ошибки и т.д. Этому функционалу десятки лет.
0
|
|
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
||||||
| 06.06.2023, 22:51 | ||||||
|
bedvit, сделал рекурсивный вариант https://onlinegdb.com/Lde-z8ozZ
прошёлся ещё статическим анализатором и подправил несколько глупых ошибок с char Только половинным делением не обойтись, изначально я предполагаю, что звезда хавает всю оставшуюся строку, а если это не удалось, то уменьшаю по одному символу. Иначе тут никак, судя по всему. Проваленные тесты, с моей точки зрения, просто составлены неверно (инвертирован ожидаемый результат). Ведь неверных масок тут не может быть. Если квадратная скобка не закрыта, то это обычный символ. Также, конструкция [1-4-9] раскроется в [12349-]. [*] - это отдельный символ '*' в строке.Под вопросом для меня только совпадение пустой строки и [].А остальное всё парсится норм (как я считаю)
1
|
||||||
|
|
|||||
| 07.06.2023, 00:10 [ТС] | |||||
|
Здесь пишут, что это ошибка. В своей реализации я делаю throw. Квадратные скобки экранируют спецсимволы, т.е. если это обычный символ нужно знать это заранее, т.к. после скобки могут идти спецсимволы, их экранировать или нет? Поэтому я экранирую всегда, если не нахожу закрывающую скобку - throw
0
|
|||||
|
|
|||||||||||
| 07.06.2023, 20:31 [ТС] | |||||||||||
|
Первый вариант, похожий на говнокод, но который проходит проверку тестового набора
Замер времени в сравнении с базовой из топика (которая умеет только ? и *) Проверка: https://onlinegdb.com/ygawXf-so (вывод ошибок и времени).
Нужен спец по Си, как ускорить LikeVB()? Алексей1153, слежу за вашим вариантом, интересный подход, чисто на С++. Я то ушёл в Си. Хотелось бы видеть и ваше решение.
0
|
|||||||||||
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
||
| 08.06.2023, 09:47 | ||
|
bedvit, свой вариант я пока не доделывал. На твоём попробовал по 10 раз запускать тесты с флагом
-O3 (при переходе по ссылке флаг сам не выставится, заходи в шестерёнку -> extra compiler flags -> -O3 -> done)https://onlinegdb.com/fai4bbbz4 Test pattern...Добавлено через 54 минуты bedvit, а каким образом предполагается экранировать закрывающую квадратную скобку ? [[]?*[[] или как [[]?*[[]
0
|
||
|
|
|
| 08.06.2023, 12:14 [ТС] | |
|
Алексей1153, выше по ссылке: "
Note To match the special characters left bracket ([), question mark (?), number sign (#), and asterisk (*), enclose them in brackets. The right bracket (]) can't be used within a group to match itself, but it can be used outside a group as an individual character."
0
|
|
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
||
| 08.06.2023, 13:14 | ||
NULL, а nullptr. Или {}во-вторых - почему не должно матчится, я не могу понять? a->a [*]->* b->b всё совпадает
0
|
||
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
|
| 08.06.2023, 14:15 | |
|
bedvit, а как должна работать маска
[!] ? Тоже пустая строка?
0
|
|
|
|
|
| 08.06.2023, 14:34 [ТС] | |
|
"во-первых, не NULL, а nullptr. Или {}" здесь это не важно. nullptr нет в Си. NULL валидное значение для указателя в Си.
Добавлено через 2 минуты маска [!] это поиск одного символа '!' (восклицательный знак). В тесте есть {L"!", L"[!]", L"True"}, Добавлено через 9 минут А другой диалект VB говорит False https://onlinegdb.com/yYBmoRqmN Я использовал для проверки транслятор VBA, там True Добавлено через 47 секунд Надо посмотреть, что SQL скажет Добавлено через 6 минут MS SQL говорит True SELECT iif('^' Like '[^]','True','False')=True https://dev.sqliteonline.com/
0
|
|
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
|||||||
| 08.06.2023, 15:06 | |||||||
|
bedvit, теперь вот так https://onlinegdb.com/qEZqOehf3
0
|
|||||||
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
|
| 08.06.2023, 15:16 | |
|
bedvit, нет
0
|
|
|
|
||
| 08.06.2023, 20:42 [ТС] | ||
|
Замеры скорости (пока Си обгоняет С++).
Оба варианта выполняют тестовые шаблоны без ошибок. Speed test... check, ms: 1180 LikeVB, ms: 1345 WildCardParser::Match, ms: 15941 https://onlinegdb.com/UY9nlDVqJ Добавлено через 6 минут С флагом
LikeVB, ms: 913 WildCardParser::Match, ms: 3588 Добавлено через 9 минут https://onlinegdb.com/OFHw6N97i Добавлено через 1 минуту Из замеченного, флаг -O3 серьёзно ускоряет С++, в отличии от Си Добавлено через 3 минуты третий замер, видимо что-то кешируется: check, ms: 422 LikeVB, ms: 648 WildCardParser::Match, ms: 2516
0
|
||
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
|
|||
| 08.06.2023, 22:19 | |||
|
bedvit, конечно же, нужно смотреть с оптимизацией. Попробую покрутить свой код,
а тут я немного почистил тест (ещё без изменений кода) https://onlinegdb.com/CM__vaI7C
bedvit, удалось немного сократить разницу https://onlinegdb.com/y5pnhUTkN (с -O3 , конечно)пока что не знаю, что где ещё подпнуть ![]()
0
|
|||
| 08.06.2023, 22:19 | |
|
SQL или Visual Basic? Или Макросы?
Есть ли такая функция даты SQL которая позволяет вытащить записи по опред году, или месяцу или дню Как лучше и быстрее из SQL в QVector и в GUI или сразу из SQL в GUI Что лучше, учить команды CMD или BASH или PowerShell или все они важны или лучше язык программирования? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса
Калибровка параметров симбиотической модели: технический обзор
Содержание:
Введение
Постановка проблемы
Технические аспекты реализации
Процесс внедрения изменений
|
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0»
https:/ / ibb. co/ NnkGpfMd
Представленная интегрированная схема описывает непрерывную нелинейную. . .
|
|
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы
### Аннотация
Представлено исследование по разработке агентной модели микоризной. . .
|
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики
Контекст
Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
|
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии
Введение
Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
|
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np
class PlantAgent:
def __init__(self, name, strategy, initial_biomass):
self. name = name
self. strategy = strategy # "greedy" (широколиственные) или. . .
|