Algorithm 常用和最近使用的项目排序算法

Algorithm 常用和最近使用的项目排序算法,algorithm,ranking,Algorithm,Ranking,我正在搜索一个排名算法,它将根据使用量和最新使用量对项目(文件、应用程序、访问过的网站…)进行排序 例如,在应用程序启动器中,用户键入应用程序名称的一些短前缀,符合条件的应用程序将被排序。应用程序A是用户最喜欢的应用程序,使用频率也很高,但现在他经常使用应用程序B,只是偶尔使用应用程序A。应用程序A的发布次数比应用程序B多,但上次B的使用次数比A多 因此,应用程序B排在应用程序A之前 此外,如果应用程序C想要超过应用程序B,它必须(在最近一段时间内)更频繁地使用,但应用程序A要成为第一个应用程序

我正在搜索一个排名算法,它将根据使用量和最新使用量对项目(文件、应用程序、访问过的网站…)进行排序

例如,在应用程序启动器中,用户键入应用程序名称的一些短前缀,符合条件的应用程序将被排序。应用程序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个属性的对象数组:

  • 价值(你关心的东西——例如网站或文件名等)
  • 分数(下文讨论——在文章中称为“CRF”)
  • 每当用户选择某个值时,您都可以按如下方式修改列表:

  • 更新列表中所有现有项目的分数,方法是将每个分数乘以一个恒定的权重因子,
    USAGE\u WEIGHT
    (一个介于0.5和1.0之间的数字,下面将详细讨论)
  • 搜索列表以查看recenty选定项是否已存在。如果是,只需在现有分数上加1.0即可。如果没有,则创建一个初始分数为1.0的新项目,并将其添加到列表中。如果列表中没有更多的空间(意味着它已经包含了您想要显示的最大MRU项目数),则首先删除列表中得分最低的项目(由于下一步,该项目将始终位于列表的末尾)
  • 现在按分数按降序对列表重新排序。(最高分应出现在MRU列表的第一位)
  • 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 } ]