Mysql 什么';这是决定用户的大O'&引用;“独特性”;根据民意调查的结果?

Mysql 什么';这是决定用户的大O'&引用;“独特性”;根据民意调查的结果?,mysql,database,algorithm,big-o,time-complexity,Mysql,Database,Algorithm,Big O,Time Complexity,我有一个MySQL表,其中列出了用户对是/否调查问题的回答。看起来有点像这样: | user_id | poll_id | response | 111 | 1 | 'yes' | 111 | 2 | 'no' | 111 | 3 | 'no' | 222 | 1 | 'yes' | 222 | 2 | 'yes' | 222

我有一个MySQL表,其中列出了用户对是/否调查问题的回答。看起来有点像这样:

| user_id    | poll_id    | response
| 111        | 1         | 'yes'
| 111        | 2         | 'no'
| 111        | 3         | 'no'
| 222        | 1         | 'yes'
| 222        | 2         | 'yes'
| 222        | 3         | 'yes'
| 333        | 1         | 'no'
| 333        | 2         | 'no'
| 333        | 3         | 'no'
对于一个给定的用户id,我想计算他们的响应与其他用户的响应之间的相似性。因此,用户111和用户222的相似性为0.333(因为它们有三分之一的相同响应),用户111和用户333的相似性为0.666(因为它们有三分之二的相同响应)

然后,我想确定给定用户的相似性中值,并将其与所有其他用户的相似性中值进行排序,从而得出该用户“唯一性”的度量

这种操作的时间复杂度是多少


*(注意:目前,我有大约25000个用户ID,400个投票ID,响应表中有大约500000行。显然,并非所有用户都对每个投票问题做出响应。这会影响时间复杂度计算吗?*

对于每个用户,您必须计算与所有其他用户的相似性;这是n2-n,或者实际上是n2。但你也必须对这些结果进行排序,以找到中位数。因此,假设您的排序是n log n,则主要项将是n2 log n


如果你使用平均值,而不是中位数,你就可以摆脱排序;那么时间复杂度将是O(n2)

让我们让
n
=用户数量,
p
=投票问题数量,
r
=响应表中的总行数。(在您的情况下,
n=25000
p=400
r=500000


对于单个用户,数据库将遍历所有响应,对于每个响应,都进行哈希查找,以确定它是否匹配该用户的响应之一。如果是这样的话,则需要
O(1)
时间来跟踪正在运行的计数。然后,它接受该用户的投票问题,并进行简单的求和。只要回答的数量远大于调查问题的数量(在你的情况下),这就取决于浏览回答的时间。因此,每个用户都需要时间
O(r)
。您有
n
用户,因此总时间是
O(n*r)

对于您的注释,记录数不影响时间复杂度的表达,因为时间复杂度是以记录数作为自变量来表示的。例如,无论n是50个项目还是5000万个项目,快速排序都是平均情况O(n log n)和最坏情况O(n^2)!当我问“这会影响时间复杂度计算吗?”时,我指的不是记录本身的数量——我指的是并非所有用户都对每个民意测验问题做出响应的事实。我明白了。在这种情况下,遗漏的问题如何计入百分比?如果有3个问题,用户A的答案
是、否、省略
,而用户B的答案
是、省略、否
,它们是否50%相似,因为提交的答案有一半匹配,还是33%相似,因为它们的答案匹配了问题总数的1/3?你可以在线性时间内找到中位数: