Вот как я мог бы сделать это на чистом Python.
Сложность по времени составляет O(um+n)
, где m
- размер шаблона поиска, u
- количество пользователей во входном дикте.и n
- это размер входного диктанта.Для сравнительно небольших шаблонов поиска, описанных в определении проблемы, этот метод эффективен O(n)
.
# Inputs
userDict = {
'User 1': [123, 254, 225, 367, 125, 745, 587],
'User 2': [333, 444, 225, 123, 254],
'User 3': [777, 451, 225, 745, 254, 458],
'User 4': [111, 222, 333, 444, 555, 666, 777, 888]
}
filterList = [254, 225, 125, 587, 745]
# Filter a dictionary of lists based on a search pattern
# Returns for each value in the dictionary, the elements from the search pattern
# which were not found in the list
#
def filterLists(inputDict, filterList):
# Use a Set for the O(1) lookup
filterSet = set(filterList)
res = {}
for key, vals in inputDict.items():
# Creating a Set from a list of size n is O(n)
# Set difference is O(size of the leftmost set)
# Assuming the search pattern is shorter than the average User list,
# this gives us effectively O(n)
res[key] = list(filterSet - set(vals))
return res
print(filterLists(userDict, filterList))
По сути, не переусердствуйте, алгоритмы Apriori и FP-Growth предназначены для другого классапроблемы с этим.Здесь вы в основном реализуете фильтр или сито, и поскольку ваши входные данные не структурированы и не упорядочены, вы действительно не можете прочитать каждое целое число хотя бы один раз, а это означает, что вы не можете получить скорость быстрее, чем O (n).
Итак, в моем коде я просто делаю пару операций над множествами за O (n) и возвращаю вывод.Нет необходимости в более сложных или умных представлениях.Вы можете добиться большего успеха, чем мой код, с небольшими изменениями, но не асимптотически лучше в общем случае.
Обратите внимание, что если вы работаете с большими данными, вы, вероятно, захотите использовать что-то вроде Spark вместо,То же самое можно сделать элегантно с небольшим количеством кода Scala, и у вас будет что-то, что будет хорошо распараллеливаться в кластере для наборов данных произвольного размера.