![]() |
1
9
您可以先应用一些优先顺序来比较电子邮件。 性能限制的一个关键原因是 二 )将每个地址与其他电子邮件地址进行比较的性能。 优先级排序是提高这种搜索算法性能的关键。 例如,您可以将长度相似(+/-一定数量)的所有电子邮件都存储起来,并首先比较该子集。您还可以从电子邮件中删除所有特殊字符(数字、符号),并在减少后找到相同的字符。 您可能还希望从数据中创建一个trie,而不是逐行处理它,并使用它查找共享一组后缀/前缀的所有电子邮件,并从该缩减中驱动比较逻辑。从您提供的示例中,您似乎在查找一个地址的一部分可能在另一个地址中显示为子字符串的地址。 Tries (和) suffix trees )是执行这些类型搜索的有效数据结构。 优化此算法的另一种可能方法是使用创建电子邮件帐户的日期(假设您知道)。如果创建了重复的电子邮件,它们可能会在短时间内彼此创建-这可能有助于减少查找重复邮件时要执行的比较数。 |
![]() |
2
5
好吧,假设Levenshtein差异是您的瓶颈,您可以进行一些优化。
1)当Levenshtein距离为2时,电子邮件之间的长度将在2个字符以内,因此不要费心计算距离,除非
2)同样,如果距离为2,则不会有超过2个字符不同,因此您可以对电子邮件中的字符进行哈希集,并取联合的长度减去两个字符相交的长度。(我认为这是对称例外)如果结果为>2,请跳到下一个比较。 或 编写自己的Levenshtein距离算法。如果您只对长度感兴趣,可以优化运行时间。参见维基百科页面上的“可能的改进: http://en.wikipedia.org/wiki/Levenshtein_distance . |
![]() |
3
2
您可以添加一些优化: 1)保留一份已知欺诈的清单,并与之进行比较。在你开始使用你的算法之后,你可能会比点击主列表更快地点击这个列表。 2)首先对列表进行排序。它不会花费太长时间(相比之下),并且会增加先匹配字符串前面的机会。先按域名排序,然后按用户名排序。也许将每个域放入自己的bucket中,然后进行排序并与该域进行比较。 3)一般考虑剥离域。spammer3@gmail.com和spammer3@hotmail.com将永远不会触发您的标志。 |
![]() |
4
1
如果你能定义一个合适的映射到某个K维空间,并且在这个空间上定义一个合适的范数,这就减少到 All Nearest Neighbours Problem 它可以在O(n log n)时间内解决。 然而,找到这样的地图可能是困难的。也许有人会接受这个部分答案,然后用它来运行。 |
![]() |
5
1
为了完整起见,您还应该考虑电子邮件地址的语义,包括:
|
![]() |
6
0
您可能希望查看完整的数据集,以了解具有欺骗电子邮件的帐户之间是否存在其他共性。 我不知道你的应用程序是做什么的,但是如果还有其他的关键点,那么就用它们来过滤你要比较的地址。 |
![]() |
7
0
首先将所有内容排序到哈希表中。密钥应该是电子邮件的域名;“gmail.com”。从值中去掉特殊字符,如上所述。 然后检查所有的gmail.com。那应该是 许多的 更快。不要比较长度超过3个字符的内容。 作为第二步,检查所有键,并在那里开发分组。(例如,gmail.com==googlemail.com。) |
![]() |
8
0
我同意其他人关于比较电子邮件地址没有帮助的意见,因为用户也可以创建具有欺骗性的恶意地址。 我认为最好使用其他解决方案,例如限制您每小时/天可以写下的电子邮件数量,或者限制您收到这些地址与发送给用户之间的时间间隔。基本上,以一种每天发送几封邀请信比较舒服的方式进行计算,但是发送很多邀请信需要一个pita。我想大多数用户会忘记/放弃去做它,如果他们不得不做一个相对较长的时间,以获得他们的免费赠品。 |
![]() |
9
0
您是否可以检查创建电子邮件的人的IP地址。这将是一个简单的方法来确定,或者至少给您提供有关不同电子邮件地址是否来自同一个人的附加信息。 |