Рассматривайте метку времени каждого поста как начало такого часа и считайте все остальные посты, приходящиеся на этот час, включая пост, который его начал. Отсортируйте полученные часы в порядке убывания по количеству сообщений в каждом из них.
Сделав это, вы найдете самый верхний «час», в котором содержится наибольшее количество сообщений, но этот период времени может быть не ровно один час, он может быть короче (но никогда не длиннее).
Чтобы получить «более симпатичный» период, вы можете рассчитать, сколько он на самом деле, поделить на два и скорректировать начало периода обратно на эту сумму и конец вперед, это «центрирует» сообщения в течение часа. , Эта корректировка, как гарантируют, не включает никаких новых сообщений, таким образом, счет все еще действителен. Если сообщения достаточно близки, чтобы их можно было внезапно включить в период после того, как вы расширили его до одного часа, то в более ранней точке было бы «наибольшее количество сообщений» вместо того, который вы выбрали.
Если это вопрос SQL, вы можете повторно использовать SQL, который Джош разместил здесь , просто замените таблицу минут другой ссылкой на вашу таблицу сообщений.
Другой метод , который вы можете использовать, это использовать скользящее окно.
Сначала отсортируйте все сообщения по отметке времени. Следите за сообщениями, используя список, для этого может использоваться связанный список.
Теперь для каждого сообщения добавьте его в конец списка. Затем, для каждого поста в начале списка, если этот пост более чем за час до поста, который вы только что добавили, удалите его из списка.
После выполнения этой двухэтапной операции для одного нового поста в списке, проверьте, больше ли количество постов в списке, чем предыдущий максимум, и если это так, то сделайте копию списка или, по крайней мере, сохранить сообщение, которое вы только что добавили.
После того, как вы закончите, у вас будет «копия списка» с наибольшим количеством сообщений за час, или вы получите сообщение, которое является концом 1-часового окна, содержащего большинство сообщений.
Псевдо-код:
initialize posts-window-list to empty list
for each post in sorted-posts-list:
add post to end of posts-window-list
for each other-post from start of posts-window-list:
if other-post is more than one hour older than post, remove it
otherwise, end this inner loop
if number of posts in list is more than previous maximum:
make copy of list, this is the new maximum