我收集了10条消息,按照喜欢的消息数排序。 定期我更新该集合,同时将新消息替换为同时获得更多喜欢的新消息,以便该集合再次包含10条消息并按喜欢的数量排序。
我有api来从集合中插入或删除相对于现有成员消息的消息。 insert(message_id, relative_to, above_or_bellow)
和remove(message_id)
。我希望通过优化插入新消息的位置来最小化api调用次数,以便始终对集合进行排序,并在结束时排长10。 (在过程中长度和顺序无关紧要,只是在过程结束时)
我知道我可以计算新的集合,然后只替换那些与新位置不匹配的消息,但我相信它可以进一步优化,并且算法已经存在。
编辑:
注意单词"周期性地#34;,意思是消息不是一个接一个地出现,但是在时间间隔中我收集新消息,对它们进行排序,然后制作新的集合,然后通过api在网站上发布。所以我有2个集合,一个是内存中的简单数组,另一个是现场。
想法是重用已经插入的消息以及它们在更新集合中的顺序以保存http api调用。我相信现有的算法可以重用,将现有的集合转换为已知的结果集合,只需最少的插入,删除操作。
答案 0 :(得分:1)
我认为您只需要保留一个消息列表/向量,并始终对其进行排序,并对每条新消息进行更新。
由于此集合将始终排序并假设它具有随机访问权限,您可以使用二进制搜索来查找插入点,即O(log_2 ^ M)其中M是您的最大列表大小,例如10.但是当你插入这里时,无论如何它都需要O(M)来移动元素。因此,我只是使用链接列表并迭代它,而插入(或更新)的消息比当前消息更少。
答案 1 :(得分:1)
首先删除所有不在前10个喜欢的邮件中的邮件。
为了从现有列表中获得最大收益,我们现在应该查找按其喜欢的顺序排序的消息的最长子序列(我们可以使用此处提到的算法使用喜欢的数量作为值How to determine the longest increasing subsequence using dynamic programming?)
然后我们会删除所有其他消息(不在子序列中)并按顺序插入缺少的消息。