我有一个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'
对于给定的user_id,我想计算其响应与每个其他用户的响应之间的相似性。因此,用户111和用户222是相似的0.333(因为它们具有3个相同的响应中的1个),并且用户111和用户333是0.666相似的(因为它们具有3个相同响应中的2个)。
然后,我想确定给定用户的中位数相似度值,并将其与所有其他用户的中位数相似度进行排名,以得出该用户“唯一性”的度量。
这种操作的时间复杂度是多少?
*(注意:目前,我在响应表中有大约25,000个user_id,400个poll_id和大约500,000行。显然,并非所有用户都对每个轮询问题做出响应。这是否会影响时间复杂度计算?)*
答案 0 :(得分:2)
对于每个用户,您必须计算与所有其他用户的相似度;那是 n 2 - n ,或者是 n 2 。但是你还必须对这些结果进行排序才能找到中位数。因此,假设您的排序为 n log n ,则主导项将为 n 2 log n 。
如果你使用平均值而不是中位数,你可以摆脱排序;然后时间复杂度 O(n 2 )。
答案 1 :(得分:0)
让我们让n
=用户数,p
=投票问题的数量,以及r
=响应表中的总行数。 (根据您的情况n = 25,000
,p = 400
,r = 500,000
。)
对于单个用户,数据库将遍历所有响应,每个响应都进行哈希查找,以确定它是否与此用户的响应之一匹配。如果确实如此,则需要O(1)
时间来跟踪正在运行的计数。然后它接受用户的民意调查问题,并做一个简单的总和。只要响应的数量远远大于轮询问题的数量(在您的情况下),这主要取决于运行响应的时间。因此每个用户都需要时间O(r)
。您有n
个用户,因此总时间为O(n*r)
。