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

我认为应该添加一些逻辑,以便自动完成结果应该按最近接触或最常接触的某些功能排序,而不仅仅是按字母顺序排序。

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

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

除了任意挑选的数字之外,还有人有任何输入吗?如果您能给出您认为其他数字比我更好的理由,也欢迎

编辑:这主要是在商业环境中,其中最近性(是的,造词)通常与频率一样重要。而且,超过某一点后,与你交谈过 80 次的人与与你交谈过 30 次的人实际上并没有太大区别。

有帮助吗?

解决方案

这种事情看起来类似于firefox在暗示你输入的网站时所做的事情。

不幸的是我不知道firefox到底是怎么做的,点系统看起来也不错,也许你需要平衡你的观点:)

我会选择类似的东西:

NoM =邮件数量

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

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

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

其他提示

看看自组织名单。

快速而肮脏的外观:

转到前端启发式: 链表,这样无论何时选择节点,它都会移动到列表的前面。

频率启发式: 一个链表,这样无论何时选择一个节点,其频率计数都会递增,然后该节点向列表的前面冒泡,以便最常访问的位于列表的开头。

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

编辑:选择地址时,在频率上加1,然后移动到具有相同权重的节点组的前面(或者(权重div x)用于courser分组)。我认为老化是您提议的实施的一个真正问题,因为它需要计算每个项目的权重。自组织列表是一个很好的方法,但算法需要一些调整来做你想要的。

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

问题是我们只想在节点上实际访问时才在节点上执行计算(搜索除外) - 这为我们提供了统计上的良好性能。

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

  • 上次访问时间
  • 使用频率
  • 与待售销售的联系
  • 直接老板
  • ETC

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

这是很多工作,但也很有趣……

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

ORDER BY EmailCount DESC,LastName,FirstName

这样,即使它们在几天内没有使用过,您最常使用的地址也是第一位的。

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

我曾经在这样的一些系统上工作,而且“最近都没有使用过”。也不是“最常用的”工作得很好。 “最近的”如果你不小心误输了一次,可能会真的很痛苦。或者,“最常用”的是“最常用的”。如果你去年与某人有很多联系,但是现在你的工作已经发生了变化,那么这种情况不会随着时间的推移而发展很多。

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

本文介绍了单参数系列缓存逐出策略包括最近最少使用和最不常用的策略作为特殊情况。

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

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

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

我会通过将所有计数器定期(例如24小时)乘以一些缩小器(比如0.9)来说明新近度。

每次使用:

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

每个间隔:

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

通过这种方式,我将频率和新近度都折叠到一个字段,避免需要保留详细的历史记录来导出{上一天,上周,上个月}并保持数学(大部分)整数。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top