Рассмотрим наборов значений (представленных в виде отсортированных массивов без дубликатов и с известным размером (т. Е. Размер можно получить за O (1)). Значения можно проверить на равенство за O (1). Я хочу чтобы получить набор значений, которые присутствуют по меньшей мере в k различных наборах среди n .
Очевидный алгоритм для этого состоит в том, чтобы пройти через все наборы, посчитать количество вхождений каждого значения и вернуть те, у которых число больше . Тем не менее, в некоторых случаях вы можете добиться большего успеха: например, когда n = k = 2 и когда один набор S 1 намного меньше, чем другой набор S 2 , более эффективно просматривать все элементы S 1 и выполнять бинарный поиск для каждого из них в S 2 : подход бинарного поиска стоит O ( | S 1 | log ( | S 2 | тогда как наивный подход стоит O ( | S 1 | + | S 2 | ), что хуже, когда | S 1 | < < | S 2 | ,
Имея это в виду, в каких ситуациях мы можем добиться большего успеха, чем наивный алгоритм? (Если это общеизвестная проблема, я был бы рад узнать ее обычное имя и иметь ссылки.)
источник
Ответы:
Хорошо, я думаю, что нашел что-то уместное: в этой статье упоминается «проблема T-вхождения» в разделе III (стр. 2), которая является именно нашей проблемой (где - то, что мы назвали k ), скрытая за неким специфичным для области жаргоном. Алгоритм ScanCount, который они предлагают, является наивным подходом, который я предложил в своем вопросе. Алгоритм MergeOpt является обобщением уловки двоичного поиска. Их основное предложение (DivideSkip) представляет собой комбинацию этого трюка двоичного поиска и другого трюка (MergeSkip) для пропуска нескольких значений. Даже кажется, что экспериментально умные подходы намного лучше, чем наивные подходы (посмотрите на столбец «Нет фильтров» на стр. 8, фильтры являются эвристикой для их предметно-ориентированного материала).T К
Это может быть объединено с трюком Дэвида Эппштейна, чтобы сделать несколько бинарных поисков в более эффективным, и с идеей использования интерполяционного поиска вместо бинарного поиска (идея из этой другой статьи из той же области ).S2
источник
Ваша проблема похожа на проблему интеллектуального анализа данных при поиске частых наборов элементов , также известную как изучение правил ассоциации . Если я правильно понял, ваша проблема может быть сведена к поиску частых наборов элементов мощности 1 (т. Е. Синглетонов) с поддержкой > = k . Конечно, доступные алгоритмы (такие как Apriori, Eclat, D-CLUB и т. Д.) Для задачи также позволяют определять частые наборы элементов с числом элементов> 1.
источник