1
3
如果你必须将每个用户与其他用户进行匹配,那么无论你做什么,算法都是O(N^2)。 如果你可以利用某种一维的“度量”,那么你可以尝试将每个用户与一个单一的合成值相关联。但这很尴尬,而且可能是不可能的。 但您可以做的是注意哪些用户需要 改变 在他们的配置文件中(每当匹配所基于的任何参数发生变化时)。此时,您可以仅为这些用户批量重新计算表,从而在O(N)中工作:如果您有10000个用户,而只有10个需要重新计算,则必须检查100000条记录,而不是100000000条。 其他策略是只对更有可能被比较的记录运行主算法:在你的例子中,“同一个城市”。或者在更新记录时(但这需要存储(user_1,user_2,ranking,last_calculated),只重新计算那些排名高、非常旧或从未计算过的记录。排名最低的比赛不太可能发生太大变化,以至于在短时间内排名靠前。 更新 该问题也适用于O(N^2) 存储空间 。 如何减少这个空间?我想我可以看到两种方法。一个是 不 在匹配表中输入一些信息 完全 。“匹配”功能越有意义,它就越僵硬和陡峭;有一万场“好比赛”意味着 匹配 意义不大。因此,当User1更改一些关键数据时,我们仍然需要重新计算lotsa,以防它将User1的一些“no”匹配带回“maybe”区域。但我们会为每个用户保留一个较小的活动匹配集团。 存储量仍将呈二次方增长,但增长幅度较小。 另一种策略是 重新计算 匹配,然后我们需要开发一些方法来快速选择哪些用户可能具有良好的匹配(从而限制JOIN检索的行数),以及一些快速计算匹配的方法;这可能需要以某种方式将User1和User2之间的匹配重写为DataUser1、DataUser2的子集的非常简单的函数(可能使用辅助列)。 挑战将是利用MySQL的功能,并将一些计算卸载到MySQL引擎。 为此,您可能会在输入时(因此在O(k)中)将一些数据“映射”到空间信息或字符串,并使用Levenstein距离。
单个用户的存储会增长,但它会线性增长,而不是二次增长,MySQL
|
2
2
如果搜索应该只返回前100个最佳匹配,那么为什么不直接存储这些呢?听起来你无论如何都不想搜索结果的底端,所以不要计算它们。 这样,您的存储空间只有o(n),而不是o(n^2),更新也应该是。如果有人真的想看到超过前100的匹配(而你想让他们),那么你可以选择在这一点上实时运行查询。 |
3
0
我同意@Iserni所说的一切。 如果你有一个网络应用程序,用户需要“登录”,那么你可能有机会在那时创建该用户的排名,并将其存储在一个临时表(或现有表中的行)中。 如果计算所需的所有数据都能放入内存,那么这将在合理的时间内(几秒钟)起作用。然后,数据库引擎应该进行完整的表扫描并创建所有评级。 对于一个用户登录来说,这应该工作得相当好。对于两个用户来说,这是可以通过的。但是,如果你有十几个用户在一秒钟内登录,它就不会很好地扩展。 不过,从根本上讲,你的评级并不符合要求。你必须将所有用户与所有用户进行比较才能得到结果。无论是批量(夜间)还是实时(当有人有查询时)都不会改变问题的性质。它将使用大量的计算资源,并且多个用户同时提出请求将是一个瓶颈。 |
hello_programmers · Mysql从其他表输出一列 1 年前 |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |
Popo · Sql查询:返回数据库中不可用的where条件 1 年前 |
Hamdan Nuramdani · 对账单中一周内不同表中的数据求和 1 年前 |
Kugelfisch · 用php为数据库加密数据 1 年前 |