Найти предметы, которые входят как минимум в

11

Рассмотрим наборов значений (представленных в виде отсортированных массивов без дубликатов и с известным размером (т. Е. Размер можно получить за O (1)). Значения можно проверить на равенство за O (1). Я хочу чтобы получить набор значений, которые присутствуют по меньшей мере в k различных наборах среди n .nКN

Очевидный алгоритм для этого состоит в том, чтобы пройти через все наборы, посчитать количество вхождений каждого значения и вернуть те, у которых число больше . Тем не менее, в некоторых случаях вы можете добиться большего успеха: например, когда n = k = 2 и когда один набор S 1 намного меньше, чем другой набор S 2 , более эффективно просматривать все элементы S 1 и выполнять бинарный поиск для каждого из них в S 2 : подход бинарного поиска стоит O ( | S 1 | log ( | S 2 |Кn=k=2S1S2S1S2 тогда как наивный подход стоит O ( | S 1 | + | S 2 | ), что хуже, когда | S 1 | < < | S 2 | ,О(|S1|журнал(|S2|))О(|S1|+|S2|)|S1|<<|S2|

Имея это в виду, в каких ситуациях мы можем добиться большего успеха, чем наивный алгоритм? (Если это общеизвестная проблема, я был бы рад узнать ее обычное имя и иметь ссылки.)

a3nm
источник
3
Это относится к общей категории результатов «top-K», или «тяжелых нападающих». Последнее ближе к тому, что вы ищете. Большая часть работы в этом пространстве фокусируется на больших наборах данных и ограничениях сублинейной памяти.
Суреш Венкат
9
Указанный вами метод «поиска всех местоположений S1 в S2» может быть выполнен для запуска во времени , всегда по крайней мере так же хорошо, как наивный линейный алгоритм времени. О(|S1|журнал(|S2|/|S1|))
Дэвид Эппштейн

Ответы:

2

Хорошо, я думаю, что нашел что-то уместное: в этой статье упоминается «проблема T-вхождения» в разделе III (стр. 2), которая является именно нашей проблемой (где - то, что мы назвали k ), скрытая за неким специфичным для области жаргоном. Алгоритм ScanCount, который они предлагают, является наивным подходом, который я предложил в своем вопросе. Алгоритм MergeOpt является обобщением уловки двоичного поиска. Их основное предложение (DivideSkip) представляет собой комбинацию этого трюка двоичного поиска и другого трюка (MergeSkip) для пропуска нескольких значений. Даже кажется, что экспериментально умные подходы намного лучше, чем наивные подходы (посмотрите на столбец «Нет фильтров» на стр. 8, фильтры являются эвристикой для их предметно-ориентированного материала).TК

Это может быть объединено с трюком Дэвида Эппштейна, чтобы сделать несколько бинарных поисков в более эффективным, и с идеей использования интерполяционного поиска вместо бинарного поиска (идея из этой другой статьи из той же области ).S2

a3nm
источник
1

Ваша проблема похожа на проблему интеллектуального анализа данных при поиске частых наборов элементов , также известную как изучение правил ассоциации . Если я правильно понял, ваша проблема может быть сведена к поиску частых наборов элементов мощности 1 (т. Е. Синглетонов) с поддержкой > = k . Конечно, доступные алгоритмы (такие как Apriori, Eclat, D-CLUB и т. Д.) Для задачи также позволяют определять частые наборы элементов с числом элементов> 1.

Массимо Кафаро
источник