У меня есть набор входных множеств, каждый элемент состоит из 50 символов. Подумайте о таблице базы данных с столбцами varchar (50), каждая из которых представляет собой один набор входных данных. Количество столбцов обычно находится в пределах 5-8. Количество строк обычно составляет около 2-3 миллионов, но может составлять до 150 миллионов. Каждый столбец должен иметь ненулевое значение. Назовем эту таблицу T, и каждая ее строка RTАлгоритм поиска соответствия для заданного набора входов
У меня есть второй набор входов, которые обозначают соответствующий шаблон. Точно так же, как и исходный ввод, он также может считаться таблицей базы данных с тем же фиксированным числом столбцов (плюс метаданные для сопоставления цели, но эта часть не имеет значения). Однако на этот раз только один столбец должен иметь значение, но любой из них может быть нулевым. Назовем эту таблицу M и каждый ее ряд RM. Типичный размер этой таблицы составляет 4000-5000 строк. Но может быть до 40 000.
Задача здесь для каждого RT, мы должны найти соответствующий RM. Ниже приведены правила соответствия для данного RT:
найдено совпадение, если все элементы RM такой же, как соответствующий элемент в РТ. (точное совпадение строк считается таким же). Если элемент имеет значение null в RM, RT не проверяется на соответствие.
Возможно только одно совпадение. Если идентифицировано несколько совпадений, то самый длинный RM считается правильным. Здесь можно игнорировать случай с несколькими RM с одинаковой длиной. Мы выбираем только первый из них.
Код будет работать на типичном клиенте Windows с 4 ГБ ОЗУ. Таким образом, MT может храниться в памяти, но T не может.
Я ищу технику, чтобы уменьшить количество сравнений. В частности, знаете ли вы о методе, в котором весь MT может быть проверен для данного RT. Если нет, то какой самый эффективный способ справиться с этой проблемой?
Это кодируется в .NET, и любой существующий код или библиотека для .NET очень ценится.
Спасибо,
Кемаль
ПРИМЕЧАНИЯ:
Это не домашнее задание. Я закончил около 20 лет назад :)
Существует вариант этой проблемы с регулярным выражением RM. Но для текущей версии достаточно совпадения с простой эквивалентной строкой.
Вот некоторые примеры:
RT = {А, В, С, D, Е}
RM1 = {А} ,,,, RM2 = {A, B ,,,} RM3 = {A ,,, D, E}
Для этого RT все это соответствует. Но из-за правила 2 мы выбираем RM3 как матч.Надеюсь, что этот пример уточняет
- Данные Т фактически не хранятся в дБ. Это во многих форматах, включая excel, text, xml и некоторые статистические файлы SW. У нас есть структура данных, которая читает данные из их собственных форматов «на лету» и держит курсор. RT является частью этого курсора и представляет собой просто массив строк
Это звучит как домашнее задание упражнение, так: * что вы пробовали до сих пор *? [SO] поможет с вопросами, но мы предпочитаем, если вы попробуете и попросите о помощи для прогресса. – Richard
Нам нужны полные правила соответствия, которые я в M следуют. Регулярные выражения RM или что-то еще? – Dialecticus
Я думаю, вам следует привести несколько примеров RM и RT и то, как они соответствуют –