У меня есть очень мало интересная (по крайней мере для меня) проблема для решения (и, нет, это не домашнее задание). Это эквивалентно этому: вам нужно определить "сеансы" и "время начала и окончания сеанса", на котором пользователь находился перед своим компьютером.
Вы получаете время, в которое было сделано какое-либо взаимодействие с пользователем, и максимальный период бездействия. Если время, большее или равное периоду бездействия, прошло между двумя пользовательскими вводами, то они являются частью разных сеансов.
В основном вход, который я получаю, это (входы не сортируются, и я бы не сортировал их до определения сеансов):
06:38
07:12
06:17
09:00
06:49
07:37
08:45
09:51
08:29
И, скажем, период бездействия 30 минут.
Затем мне нужно найти три сеанса:
[06:17...07:12]
[07:37...09:00]
[09:51...09:51]
Если период бездействия установлен на 12 часов, я бы просто нашел один большой сеанс:
[06:17...09:51]
Как я могу решить это просто?
Там минимальный допустимый период бездействия, который должен составлять около 15 минут.
Я предпочел бы не сортировать заранее, так это то, что я получу много данных, и только их хранение в памяти будет проблематичным. Однако большинство этих данных должны быть частью одних и тех же сеансов (должно быть относительно немного сеансов по сравнению с объемом данных, возможно, что-то вроде тысяч до 1 [тысяч пользовательских входов за сеанс]).
До сих пор я думаю о чтении ввода (например, 06:38) и определении интервала [data-max_inactivity... data + max_inactivity], и для каждого нового ввода используйте дихотомический (log n) поиск, чтобы увидеть если он попадает в известный интервал или создает новый интервал.
Я бы повторил это для каждого ввода, сделав решение n log n AFAICT. Кроме того, хорошо, что он не будет использовать слишком много памяти, поскольку он будет создавать только интервалы (и большинство входов будет падать в известном интервале).
Кроме того, каждый раз, если попадает в известный интервал, мне придется изменить нижний или верхний предел интервала, а затем посмотреть, нужно ли мне "сливаться" со следующим интервалом. Например (для максимального периода бездействия 30 минут):
[06:00...07:00] (because I got 06:30)
[06:00...07:00][07:45...08:45] (because I later got 08:15)
[06:00...08:45] (because I just received 07:20)
Я не знаю, является ли описание очень ясным, но это то, что мне нужно сделать.
Есть ли такая проблема с именем? Как бы вы решили его решить?
ИЗМЕНИТЬ
Мне очень интересно знать, какую структуру данных я должен использовать, если планирую решить ее так, как планирую. Мне нужна функция поиска и вставки/слияния log n.