我们有一个自动完成列表,当您向某人发送电子邮件时,该列表已经填充,这一切都很好,直到列表变得非常大,您需要输入越来越多的地址才能找到您想要的地址,这违背了自动完成的目的
我认为应该添加一些逻辑,以便自动完成结果应按最近联系或最常联系的某个功能排序,而不仅仅是字母顺序。
我想知道的是,是否有任何已知的良好算法用于此类搜索,或者是否有人有任何建议。
我认为只是一个点系统的事情,当天的事情是5分,最后3天是4分,上周是3分,上个月是2分,最后6个月是1分。然后大多数情况下,25 +是5分,15 +是4,10 +是3,5 +是2,2 +是1.没有真正的逻辑,除了那些数字“感觉”正确。除了任意选择的数字之外,是否有人有任何输入?如果你能说出你认为他们比我更好的原因,其他数字也欢迎
编辑:这主要是在一个商业环境中,近期(yay for making words)通常和频率一样重要。而且,过了某一点,说你跟80次说话的人和30次说话的人之间真的没什么区别。
答案 0 :(得分:3)
看看自组织清单。
快速而肮脏的外观:
转到前端启发式: 链表,这样无论何时选择节点,它都会移动到列表的前面。
频率启发式: 一个链表,这样无论何时选择一个节点,其频率计数都会递增,然后该节点向列表的前面冒泡,以便最常访问的位于列表的开头。
看起来前端实施最适合您的需求。
编辑:选择地址后,在其频率上添加一个地址,然后移动到具有相同权重的节点组的前面(或者(权重div x)用于courser分组)。我认为老化是您提议的实施的一个真正问题,因为它需要计算每个项目的权重。自组织列表是一个很好的方法,但算法需要一些调整来做你想要的。
进一步编辑: 老化指的是权重随着时间的推移而减少的事实,这意味着您需要知道每次使用地址。这意味着,在构建列表时,您必须拥有整个电子邮件历史记录。
问题是我们只想在节点上实际访问时才在节点上执行计算(搜索除外) - 这为我们提供了统计上的良好性能。
答案 1 :(得分:2)
这种事情看起来类似于firefox在暗示你输入的网站时所做的事情。
不幸的是我不知道firefox到底是怎么做的,点系统看起来也不错,也许你需要平衡你的观点:)
我会选择类似的东西:
NoM =邮件数量
(NoM今天发送给X)+ 1/2 *(上周发送给NoM的NoM)/ 7 + 1/3 *(上个月发送给NoM的NoM)/ 30
您在上个月没有写的联系人(可以更改)将获得0分。你可以开始为总共发送的NoM排序它们(因为它在联系人列表:)。这些将在与点>联系后显示 0
这只是一个想法,无论如何,它是对最多和刚刚邮寄的联系人给予不同的重视。
答案 2 :(得分:2)
如果您想发疯,请通过以下几种方式标记最“活跃”的电子邮件:
然后,在列表顶部显示活动电子邮件。注意您的用户最常使用的“群组”。在收集到足够的数据后,切换到该排序策略。
这是很多工作但很有趣......
答案 3 :(得分:1)
可能会计算发送到每个地址的电子邮件数量。然后:
ORDER BY EmailCount DESC,LastName,FirstName
这样,即使它们在几天内没有使用过,您最常使用的地址也是第一位的。
答案 4 :(得分:1)
我喜欢基于点的系统的想法,包括最近使用的点数,使用频率以及可能的其他因素(更喜欢本地域中的联系人?)。
我曾经在这样的一些系统上工作过,“最近使用过的”和“最常用的”都不能很好地工作。如果你不小心错误输入一次,“最近的”可能是一个真正的痛苦。或者,如果你去年与某人有很多接触,那么“最常用”并不会随着时间的推移而发展很多,但现在你的工作已经改变了。例如。
一旦你想要使用一组测量值,就可以创建一个交互式apoplication来测试不同的权重,并看看哪些权重可以为一些样本数据提供最佳结果。
答案 5 :(得分:0)
This paper描述了一个单参数缓存逐出策略系列,其中包括最近最少使用和最不常用的策略作为特殊情况。
参数lambda的范围是0到1.当lambda为0时,它的执行方式与LFU缓存完全相同,当lambda为1时,它的执行方式与LRU缓存完全相同。在0到1之间,它以自然的方式结合了新近度和频率信息。
答案 6 :(得分:0)
尽管已经选择了答案,但我想提交我的方法以供考虑和反馈。
我会通过每次使用递增一个计数器来计算频率,但会使用一些大于一的值,例如10(为第二点添加精度)。
我会通过将所有计数器定期(例如24小时)乘以一些缩小器(比如0.9)来说明新近度。
每次使用:
UPDATE `addresslist` SET `favor` = `favor` + 10 WHERE `address` = 'foo@bar.com'
每个间隔:
UPDATE `addresslist` SET `favor` = FLOOR(`favor` * 0.9)
通过这种方式,我将频率和新近度都折叠到一个字段,避免需要保留详细的历史记录来导出{上一天,上周,上个月}并保持数学(大部分)整数。
当然,增量和减小器必须根据偏好进行调整。