2016-12-02 13 views
2

Вот упрощенный набор данных, который я использую, который охватывает мои основные моменты отключения. Id, дата, местоАлгоритм поиска наибольшей уникальной комбинации элементов из массива

(1, Jan 1, LA), (2, Jan 2, LA), (3, Jan 2, LA), (4, Jan 2, NY), (5, Jan 3, LA), (6, Jan 5, LA) 

Что я хотел бы найти это крупнейшие уникальные комбинированные наборы, суженные к диапазону дат, и сгруппированные по местоположению.

Так что с этими данными выше и вводом

date_range = 3 

Моего выхода (ид для простоты) должно быть:

1,2,3,5 
4, 
5,6 

Так комбинация 1,2,3 не будет включена так как это подмножество 1,2,3,5

Моя первая попытка состояла в том, чтобы найти все возможные комбинации и исключить подмножества после. Я не мог найти здесь отличного решения. Это кажется действительно неэффективным.

Вторая попытка была что-то вдоль линий:

Loop through each item 
Find largest combination 

Это, кажется, работает лучше, но по-прежнему создает дубликаты. Например, он будет возвращать следующее:

1,2,3,5 
2,3,5 
3,5 
4 
5,6 
6 

не имеет массовый набор данных это необходимо для работы на 1000 пунктов будут высоким концом, но производительность будет заметно. Может быть, я чрезмерна, и мне нужно сосредоточиться на устранении подмножеств эффективно вместо того, чтобы делать все за один проход?

+0

Вопросы, требующие помощи по отладке («почему этот код не работает?») Должны включать в себя вопрос о желаемом поведении, конкретной проблеме или ошибке и кратчайший код, необходимый для его воспроизведения *. Вопросы без четкого описания проблемы не полезны другим читателям. См.: [Mcve] – CollinD

+0

Кажется, вам нужен еще один шаг в вашем текущем алгоритме: Петля через каждый элемент Определите самый большой набор , если set не является частью спискаOFSet и не является подмножеством любого списка в спискеOfSets Добавить set to listOfSets Однако я не совсем уверен, что вы подразумеваете под «уникальным». Ваш пример, по-видимому, означает, что 2 и 3 уникальны, несмотря на то, что они имеют ту же дату и местоположение. – Erikest

ответ

1

Первый раздел по местоположению, а затем сортировать каждое местоположение по дате. Учитывая диапазон дат N дней, пройти через отсортированных данных, отображение его в массив кортежей как

(count(entries where date in (this_date-N:this_date)), [indexes])

Вы должны быть в состоянии сделать это в линейном времени за счет поддержания двух индексов: «сегодня» и «N дней назад».

Теперь просто найдите максимальное количество, а затем удалите все записи за предыдущие N дней. Повторяйте до тех пор, пока массив не будет пуст.

 Смежные вопросы

  • Нет связанных вопросов^_^