Algorithm 常用和最近使用的项目排序算法
我正在搜索一个排名算法,它将根据使用量和最新使用量对项目(文件、应用程序、访问过的网站…)进行排序 例如,在应用程序启动器中,用户键入应用程序名称的一些短前缀,符合条件的应用程序将被排序。应用程序A是用户最喜欢的应用程序,使用频率也很高,但现在他经常使用应用程序B,只是偶尔使用应用程序A。应用程序A的发布次数比应用程序B多,但上次B的使用次数比A多 因此,应用程序B排在应用程序A之前 此外,如果应用程序C想要超过应用程序B,它必须(在最近一段时间内)更频繁地使用,但应用程序A要成为第一个应用程序,它不需要太多的使用,因为它是用户最喜欢的应用程序,并且在过去比其他应用程序有更多的使用Algorithm 常用和最近使用的项目排序算法,algorithm,ranking,Algorithm,Ranking,我正在搜索一个排名算法,它将根据使用量和最新使用量对项目(文件、应用程序、访问过的网站…)进行排序 例如,在应用程序启动器中,用户键入应用程序名称的一些短前缀,符合条件的应用程序将被排序。应用程序A是用户最喜欢的应用程序,使用频率也很高,但现在他经常使用应用程序B,只是偶尔使用应用程序A。应用程序A的发布次数比应用程序B多,但上次B的使用次数比A多 因此,应用程序B排在应用程序A之前 此外,如果应用程序C想要超过应用程序B,它必须(在最近一段时间内)更频繁地使用,但应用程序A要成为第一个应用程序
我不知道这是否是我想要的一个很好的解释,但我希望一些人能理解。我认为您可以通过一个实现来实现这一点 这些算法帮助计算机处理器(CPU)确定要在缓存(L1、L2等)中保留主存(RAM)的哪些部分(“页面”),CPU可以比RAM更快地访问这些部分。但是它们可以很容易地适应你的问题 按最近使用情况对项目进行排序的算法类似于缓存策略LRU,当缓存已满时,该策略将过期/替换Least-R最近的Used页面 按最频繁使用情况对项目进行排序的算法(此处“frequent”实际上是指“使用次数”)类似于缓存策略LFU,当缓存已满时,它将过期/替换Least-F频繁-Used页 有几个策略以您请求的方式显式或隐式地结合了这两个概念。有些还涉及“时间”(以实际计算机时钟时间或简单的页面请求递增计数器等表示),以更好地了解页面访问的“时间”或“频率”(而不是简单的使用次数) 这些算法变得稍微复杂一些,更难实现,特别是当您需要一个非常高效的算法时。但是对于大多数与用户界面相关的应用,即使是效率低下的算法也应该非常快,因为项目数量很少,用户很少修改列表 一个可能适用于您的算法示例是LRFU(最近使用次数最少/经常使用)策略,该策略直接寻求结合LRU和LFU以根据结合使用频率和最近程度的公式使页面过期。您可以在上面列出的同一页上找到对此的引用。您还可以查看报告的位置 本文结合使用堆和链表数据结构来实现它,并包含一些用于实现的伪代码 对于您的使用,您可能可以相当容易地编写一个更简单但效率更低的算法 例如,您可以简单地存储具有2个属性的对象数组:
USAGE\u WEIGHT
(一个介于0.5和1.0之间的数字,下面将详细讨论)USAGE\u WEIGHT
因子决定了“最近性”与“频率”(又称使用计数)相比的重要性。值为0.5将导致列表具有完全的LRU行为(其中只有最近性起作用),而值为1.0将导致列表具有完全的LFU行为(其中只有使用计数起作用)。中间值(例如0.9)将导致列表混合使用LRU和LFU行为,如下面的示例输出所示
在下面的每个场景中,“值”都是字母,并按以下顺序添加:
A B C B A A D A C D A B D E C B A
每次添加后,我都会在引号中列出与当前MRU列表一起添加的字母(例如“DBA”)。最大MRU大小为3。我还列出了列表的更详细表示,以{Letter,Score}
的形式显示每个项目的值(字母)和分数
使用量\重量=1.0(完全LFU——仅使用量计数重要)
使用重量=0.5(完全LRU——仅与近期有关)
使用量\重量=0.9(LRFU——LRU和LFU的混合物)
在第一个示例(USAGE_WEIGHT=1.0)中,添加新项目时,现有项目的分数不会改变(这是因为我们在每个步骤上乘以1.0)。这导致每次使用后分数只增加1.0,因此分数直接表示使用计数。请注意,项目总是按减少使用计数的顺序列出
在第二个示例中(USAGE_WEIGHT=0.5),每次添加一个项目时,现有项目的分数都会减半(这是因为我们在每个步骤上都要乘以0.5)。这导致列表中的所有分数都低于最近添加的项目(该项目的分数为1.0),而且在步骤N中添加的项目始终具有
1. (Added A) "A" [ { A, 1.0 } ]
2. (Added B) "AB" [ { A, 1.0 } { B, 1.0 } ]
3. (Added C) "ABC" [ { A, 1.0 } { B, 1.0 } { C, 1.0 } ]
4. (Added B) "BAC" [ { B, 2.0 } { A, 1.0 } { C, 1.0 } ]
5. (Added A) "BAC" [ { B, 2.0 } { A, 2.0 } { C, 1.0 } ]
6. (Added A) "ABC" [ { A, 3.0 } { B, 2.0 } { C, 1.0 } ]
7. (Added D) "ABD" [ { A, 3.0 } { B, 2.0 } { D, 1.0 } ]
8. (Added A) "ABD" [ { A, 4.0 } { B, 2.0 } { D, 1.0 } ]
9. (Added C) "ABC" [ { A, 4.0 } { B, 2.0 } { C, 1.0 } ]
10. (Added D) "ABD" [ { A, 4.0 } { B, 2.0 } { D, 1.0 } ]
11. (Added A) "ABD" [ { A, 5.0 } { B, 2.0 } { D, 1.0 } ]
12. (Added B) "ABD" [ { A, 5.0 } { B, 3.0 } { D, 1.0 } ]
13. (Added D) "ABD" [ { A, 5.0 } { B, 3.0 } { D, 2.0 } ]
14. (Added E) "ABE" [ { A, 5.0 } { B, 3.0 } { E, 1.0 } ]
15. (Added C) "ABC" [ { A, 5.0 } { B, 3.0 } { C, 1.0 } ]
16. (Added B) "ABC" [ { A, 5.0 } { B, 4.0 } { C, 1.0 } ]
17. (Added A) "ABC" [ { A, 6.0 } { B, 4.0 } { C, 1.0 } ]
1. (Added A) "A" [ { A, 1.0 } ]
2. (Added B) "BA" [ { B, 1.0 } { A, 0.5 } ]
3. (Added C) "CBA" [ { C, 1.0 } { B, 0.5 } { A, 0.25 } ]
4. (Added B) "BCA" [ { B, 1.25 } { C, 0.5 } { A, 0.125 } ]
5. (Added A) "ABC" [ { A, 1.0625 } { B, 0.625 } { C, 0.25 } ]
6. (Added A) "ABC" [ { A, 1.5313 } { B, 0.3125 } { C, 0.125 } ]
7. (Added D) "DAB" [ { D, 1.0 } { A, 0.7656 } { B, 0.1563 } ]
8. (Added A) "ADB" [ { A, 1.3828 } { D, 0.5 } { B, 0.0781 } ]
9. (Added C) "CAD" [ { C, 1.0 } { A, 0.6914 } { D, 0.25 } ]
10. (Added D) "DCA" [ { D, 1.125 } { C, 0.5 } { A, 0.3457 } ]
11. (Added A) "ADC" [ { A, 1.1729 } { D, 0.5625 } { C, 0.25 } ]
12. (Added B) "BAD" [ { B, 1.0 } { A, 0.5864 } { D, 0.2813 } ]
13. (Added D) "DBA" [ { D, 1.1406 } { B, 0.5 } { A, 0.2932 } ]
14. (Added E) "EDB" [ { E, 1.0 } { D, 0.5703 } { B, 0.25 } ]
15. (Added C) "CED" [ { C, 1.0 } { E, 0.5 } { D, 0.2852 } ]
16. (Added B) "BCE" [ { B, 1.0 } { C, 0.5 } { E, 0.25 } ]
17. (Added A) "ABC" [ { A, 1.0 } { B, 0.5 } { C, 0.25 } ]
1. (Added A) "A" [ { A, 1.0 } ]
2. (Added B) "BA" [ { B, 1.0 } { A, 0.9 } ]
3. (Added C) "CBA" [ { C, 1.0 } { B, 0.9 } { A, 0.81 } ]
4. (Added B) "BCA" [ { B, 1.81 } { C, 0.9 } { A, 0.729 } ]
5. (Added A) "ABC" [ { A, 1.6561 } { B, 1.629 } { C, 0.81 } ]
6. (Added A) "ABC" [ { A, 2.4905 } { B, 1.4661 } { C, 0.729 } ]
7. (Added D) "ABD" [ { A, 2.2414 } { B, 1.3195 } { D, 1.0 } ]
8. (Added A) "ABD" [ { A, 3.0173 } { B, 1.1875 } { D, 0.9 } ]
9. (Added C) "ABC" [ { A, 2.7156 } { B, 1.0688 } { C, 1.0 } ]
10. (Added D) "ADB" [ { A, 2.444 } { D, 1.0 } { B, 0.9619 } ]
11. (Added A) "ADB" [ { A, 3.1996 } { D, 0.9 } { B, 0.8657 } ]
12. (Added B) "ABD" [ { A, 2.8796 } { B, 1.7791 } { D, 0.81 } ]
13. (Added D) "ADB" [ { A, 2.5917 } { D, 1.729 } { B, 1.6012 } ]
14. (Added E) "ADE" [ { A, 2.3325 } { D, 1.5561 } { E, 1.0 } ]
15. (Added C) "ADC" [ { A, 2.0993 } { D, 1.4005 } { C, 1.0 } ]
16. (Added B) "ADB" [ { A, 1.8893 } { D, 1.2604 } { B, 1.0 } ]
17. (Added A) "ADB" [ { A, 2.7004 } { D, 1.1344 } { B, 0.9 } ]