我收集了 10 条消息,这些消息按喜欢消息的数量排序。 定期 我更新该集合,用同时获得更多喜欢的新消息替换一些旧消息,以便该集合再次包含 10 条消息并按喜欢的数量排序。
我有 api 可以相对于现有成员消息从集合中插入或删除消息。 insert(message_id, relative_to, above_or_bellow)
和 remove(message_id)
。我想通过优化插入新消息的位置来最大程度地减少 api 调用的数量,以便始终对集合进行排序,并且最后的长度为 10。 (在流程中长度和顺序无关,只是在流程结束时)
我知道我可以计算新的集合,然后只替换不匹配其新位置的消息,但我相信它可以进一步优化并且算法已经存在。
编辑:
请注意“定期”一词,意思是消息不会一条一条地传来,但在时间间隔内,我会收集新消息,对它们进行排序,并制作新的集合,然后通过 API 在网站上发布。所以我有 2 个集合,一个是内存中的简单数组,另一个在现场。
想法是重用应该保留的已插入消息及其在更新集合中的顺序以保存 http api 调用。我相信可以重复使用现有算法,以将现有集合转换为已知的结果集合,只需最少的插入、删除操作。
最佳答案
首先删除所有不再位于前 10 位喜欢的消息中的消息。
为了从现有列表中获得最大 yield ,我们现在应该寻找按喜欢排序的最长消息子序列(我们可以使用此处提到的算法,使用喜欢的数量作为值 How to determine the longest increasing subsequence using dynamic programming? )
然后我们将删除所有其他消息(不在后续消息中)并按顺序插入缺失的消息。
关于algorithm - 有序集合中的高效插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37364407/