我正在构建一个应用程序,它应该从有限的任务池中为用户提取任务。事情是我想要的:
总结一下我的问题,我需要从池中提取最不常见的任务。
有人可以引用我的已知算法找到最不常见的东西(LFU)。 我也需要理论方面,所以如果有人知道一些关于这方面的文章或研究论文(来自像Scientific American这样的知名杂志),那就太棒了。
答案 0 :(得分:2)
为了获得最少使用的任务,只需给每个任务一个计数器,计算它的使用次数。然后搜索具有最低计数器值的任务。
为了获得一组朋友最不常使用的任务,您可以为每个用户存储他/她所执行的任务(以及次数)。无论如何,这些信息可能很有用。然后,当需要为用户选择新的任务时,可以容易地按频率创建和排序用户及其所有朋友的使用任务及其频率的(临时)组合列表。这不是很贵。
答案 1 :(得分:1)
根据您的2项要求,我不会看到“LEAST”使用的任务与此有什么关系。你说你想要不重复的任务。
选项1:
你用什么容器来完成所有任务?假设它是一个列表,当您或您的朋友选择任务时,将该任务移动到列表的末尾(将其与任务交换)。现在,您已将初始列表拆分为2个子列表。第一部分保留未使用的任务,第二部分保存已使用的任务。跟踪分隔2个列表的数据/索引
现在,每当您或您的朋友选择新任务时,都会从第一个子列表中选择它。然后将其移动到第二个子列表并更新数据透视。
选项2: 如果你最终重复任务,但首先选择那些已被选择最少的时间,那么你可以使你的容器成为最小堆。为每个任务添加一个使用计数器,并根据它将它们添加到堆中。提取任务并增加其使用计数器然后将其放回堆中。这是一个很好的解决方案,但根据程序的简单程度,您甚至可以使用循环缓冲区。
了解更多关于你正在建设的内容会很高兴:)
答案 2 :(得分:0)
一个好的开始是Edmond Blossom V算法,用于在一般图形中实现完美的最小匹配。如果您有二分图,您可以查找Floyd-Warshall算法以找到最短路径。也许你也可以使用拓扑搜索,但我不知道,因为这些算法真的很难学习。
答案 3 :(得分:0)
我认为您需要的结构是min-heap。它允许提取O(Log(n))中的最小值,它允许你增加O(Log(n))中项目的值。