У меня есть небольшая интересная (по крайней мере для меня) проблема, которую нужно решить (и, нет, это не домашняя работа). Это эквивалентно следующему: вам нужно определить «сеансы» и «время начала и окончания сеансов», в которых пользователь находился перед своим компьютером.
Вы получаете время, в которое было выполнено любое взаимодействие с пользователем, и максимальный период бездействия. Если между двумя пользовательскими входами прошло время, большее или равное периоду бездействия, то они являются частью разных сеансов.
По сути, я получаю следующие данные (входные данные не отсортированы, и я бы предпочел не сортировать их до определения сеансов):
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 *) 1025 *) выполните поиск, чтобы определить, попадает ли он в известный интервал, или создайте новый интервал.
Я бы повторял это для каждого ввода, делая решение 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)
Я не знаю, очень ли понятно описание, но это то, что мне нужно сделать.
У такой проблемы есть имя? Как вы решите это?
EDIT
Мне очень интересно знать, какую структуру данных мне следует использовать, если я планирую решить ее так, как планирую. Мне нужны оба log n возможность поиска и вставки / слияния.