algorithm - 有序集合中的高效插入

标签 algorithm sorting

我收集了 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/

相关文章:

algorithm - log(n^c) 是否等于 O(log(n))

algorithm - 为我的非 HTTP 业务逻辑实现中间件设计是个好主意吗?

algorithm - 某些排序可以是 P、NP 和 NP-Complete 吗?

javascript - 使用 jquery tablesorter 排序日期/时间不正确

python - 如何在 Python 中将字典值转换为 int?

C++ Intel TBB和Microsoft PPL,如何在并行循环中使用next_permutation?

java - 字谜算法说明

algorithm - 具有平行边和自循环的 Dijkstra

C++:使用STL排序对不同列上的二维整数数组进行排序的时间复杂度

java - 移动数组中的元素