【问题标题】:Algorithm for most recently/often contacts for auto-complete?最近/经常联系的自动完成算法?
【发布时间】:2010-09-17 14:33:25
【问题描述】:

我们有一个自动完成列表,当您向某人发送电子邮件时会填充该列表,这一切都很好,直到列表变得非常大,您需要输入越来越多的地址才能找到您想要的地址,这违背了自动完成的目的

我在想应该添加一些逻辑,以便自动完成结果应该按最近联系或最常联系的某些功能进行排序,而不仅仅是按字母顺序。

我想知道是否有任何已知的用于此类搜索的好的算法,或者是否有人有任何建议。

我在想只是一个积分系统的东西,比如当天是 5 分,过去三天是 4 分,上周是 3 分,上个月是 2 分,过去 6 个月是 1 分。那么在大多数情况下,25+ 是 5 分,15+ 是 4,10+ 是 3,5+ 是 2,2+ 是 1。除了这些数字“感觉”正确之外,没有其他真正的逻辑。

除了随意挑选的数字之外,还有没有人有任何意见?如果您能说明您认为它们比我的更好的原因,也欢迎其他数字

编辑:这主要是在一个商业环境中,其中最近(是的,可以编造单词)通常与频率一样重要。此外,在某个特定点之后,说与您交谈 80 次和说 30 次的人之间确实没有太大区别。

【问题讨论】:

    标签: algorithm language-agnostic usability


    【解决方案1】:

    尽管已经选择了答案,但我想提交我的方法以供考虑和反馈。

    我会通过每次使用增加一个计数器来计算频率,但是增加一些大于一的值,比如 10(为了增加第二点的精度)。

    我会通过将 所有 个计数器定期(例如 24 小时)乘以某个较小的值(例如 0.9)来计算新近度。

    每次使用:

    UPDATE `addresslist` SET `favor` = `favor` + 10 WHERE `address` = 'foo@bar.com'
    

    每个区间:

    UPDATE `addresslist` SET `favor` = FLOOR(`favor` * 0.9)
    

    通过这种方式,我将频率和新近度合并到一个字段,避免需要保留详细的历史来推导 {last day, last week, last month} 并保持数学(大部分)整数。

    当然,增量和减量必须根据偏好进行调整。

    【讨论】:

      【解决方案2】:

      This paper 描述了一个缓存逐出策略的单参数系列,其中包括最近最少使用和最不常用策略作为特殊情况。

      参数 lambda 的范围是 0 到 1。当 lambda 为 0 时,它的性能与 LFU 缓存完全相同,当 lambda 为 1 时,它的性能与 LRU 缓存完全相同。在 0 和 1 之间,它以一种自然的方式结合了新近度和频率信息。

      【讨论】:

        【解决方案3】:

        看看自组织列表。

        快速而肮脏的外观:

        移至前端启发式: 一个链表,这样每当一个节点被选中时,它就会被移动到链表的前面。

        频率启发式: 一个链表,这样每当一个节点被选中时,它的频率计数就会增加,然后该节点会冒泡到链表的最前面,这样访问频率最高的就在链表的头部。

        看起来迁移到前端实现最适合您的需求。

        编辑:选择地址后,将其频率加一,然后移动到具有相同权重的节点组的前面(对于课程分组,或(权重 div x))。我认为老化是您提议的实施的一个真正问题,因为它需要计算每个项目的权重。自组织列表是一个不错的方法,但算法需要一些调整才能完成您想要的操作。

        进一步编辑: 老化是指权重随着时间的推移而减少的事实,这意味着您每次使用地址时都需要知道。这意味着,当您构建列表时,您必须拥有完整的电子邮件历史记录。

        问题是我们希望仅在实际访问节点时才对节点执行计算(搜索除外)——这为我们提供了良好的统计性能。

        【讨论】:

        • 有趣的实现,但是这仍然会导致最近在前面或最频繁在前面,而不是两者的组合。
        • 我不完全确定你所说的衰老是什么意思。我对这个解决方案的问题是它更加强调频率,而不是(或多或少)相等。
        • 一个可能存在问题的例子是说你和客户来回交谈了很多(有一个非常大的问题要解决)但现在已经完成了,你不需要很长一段时间不再联系他们。由于频率很高,它们仍然处于领先地位,并且会持续很长时间。
        【解决方案4】:

        我喜欢基于积分的系统的想法,其中包含最近使用的积分、使用频率以及可能的其他因素(更喜欢本地域中的联系人?)。

        我曾在一些这样的系统上工作过,“最近使用”和“最常用”都不能很好地工作。如果您不小心打错了一次,“最近的”可能会很痛苦。或者,如果您去年与某人有很多接触,但现在您的工作发生了变化,那么“最常用”不会随着时间的推移而发生很大变化。

        一旦您有了想要使用的一组测量值,您就可以创建一个交互式应用程序来测试不同的权重,并查看哪些权重可以为您提供一些样本数据的最佳结果。

        【讨论】:

          【解决方案5】:

          如果您想发疯,请通过以下几种方式之一标记最“活跃”的电子邮件:

          • 上次访问
          • 使用频率
          • 有待处理销售的联系人
          • 直接老板
          • 等

          然后,在列表顶部显示活动的电子邮件。注意您的用户最常使用的“组”。收集到足够的数据后,才切换到该排序策略。

          工作量很大,但很有趣......

          【讨论】:

          • 嘿,比我想的要复杂,但可能对其他人有用,所以 +1
          【解决方案6】:

          这种事情似乎类似于 Firefox 在提示您正在输入的网站时所做的事情。

          不幸的是我不知道firefox到底是怎么做的,积分系统似乎也不错,也许你需要平衡你的积分:)

          我会选择类似的东西:

          NoM = 邮件数量

          (今天发送给 X 的 NoM)+ 1/2 *(上周发送给 X 的 NoM)/7 + 1/3 *(上个月发送给 X 的 NoM)/30

          您在上个月未写的联系人(可以更改)将获得 0 分。您可以开始为总共发送的 NoM 对它们进行排序(因为它在联系人列表中:)。这些将在 与点 > 0

          的接触后显示

          这只是一个想法,无论如何它是对大多数和刚刚邮寄的联系人给予不同的重视。

          【讨论】:

          • 嘿,猜猜这是我刚刚发布的答案的稍微计算的版本
          • 这只是导数的总和,每个导数都有自己的权重(系数 1、1/2、1/3 :)
          • 删除了我的,因为你基本上说了同样的话,然后又说了一些
          • 你还有老化的问题。
          • 上个月未写信的联系人获得 0 分。它们将在积分> 0的联系人之后列出,按“发送给该联系人的邮件总数”排序,我的回答不清楚吗?我需要重新措辞吗?
          【解决方案7】:

          也许计算发送到每个地址的电子邮件数量。那么:

          ORDER BY EmailCount DESC、姓氏、名字

          这样,您最常用的地址会排在第一位,即使它们已经有几天没有使用了。

          【讨论】:

          • 是的,但在商业环境中(我想我应该指定),可能会与客户/客户联系几天/几周,要么解决问题,要么达成交易/agreement,在这种情况下,最新的比最常见的更相关。
          • 当然,有各种各样的潜在用户——我可能永远每两周给我的远程老板发一封电子邮件,我可能有一个活跃的销售帐户一个月,我可能支持需要额外帮助的客户新建后。也许是频率和时间即时性的结合?
          • “可能是频率和时间即时性的组合?”是的,这就是我想要的更多,有点像如何平衡两者的细节。
          猜你喜欢
          • 2011-02-23
          • 2017-07-26
          • 2017-06-02
          • 2012-08-09
          • 1970-01-01
          • 2011-02-07
          • 2023-04-02
          • 1970-01-01
          • 2019-04-14
          相关资源
          最近更新 更多