8

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

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

我想知道的是这种搜索是否有任何已知的好算法,或者是否有人有任何建议。

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

除了随意挑选的数字之外,还有没有人有任何意见?如果你能给出你认为它们比我的更好的理由,其他数字也很受欢迎

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

4

7 回答 7

3

看看自组织列表。

快速而肮脏的外观:

Move to Front Heuristic:一个链表,这样每当一个节点被选中时,它就会被移到列表的前面。

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

看起来转向前端实施最适合您的需求。

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

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

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

于 2008-10-16T19:05:58.807 回答
2

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

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

我会去类似的东西:

NoM = 邮件数量

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

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

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

于 2008-10-16T19:15:54.543 回答
2

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

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

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

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

于 2008-10-16T19:21:57.213 回答
1

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

ORDER BY EmailCount DESC、姓氏、名字

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

于 2008-10-16T19:05:13.910 回答
1

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

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

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

于 2008-10-16T19:55:02.623 回答
0

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

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

于 2012-02-17T22:59:24.397 回答
0

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

我会通过每次使用增加一个计数器来计算频率,但是增加一些大于一的值,比如 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} 并保持数学(大部分)整数。

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

于 2012-02-17T23:19:15.733 回答