我正在寻找最佳解决方案,以便为每个用户检索最相关的输出。
我将模型简化为UserProfile和Groups,如下所示
-Model Name: UserProfile
styles: ['a', 'b', 'f', 'r'] <- ('styles' are field name)
-Group 1
styles: ['a', 'f']
-Group 2
['g', 'a', 'h']
...
-Group 1,000,000
styles: ['s', 'w', 'x']
(Let's say we have millions of Groups)
我想根据用户的样式对组进行排序和检索。 所以在这种情况下,'组1'得分为2,因为样式'a','f', 由于风格'a','组2'得分为1。
我们无法将分数存储在主数据库中,因为每个用户都有不同的样式。
views.py
for group in Group.objects.all():
# store the score to the new field of the group
group.style_count = group.styles.join_count(user.styles)
list_view_output = Group.objects.order_by(style_count)
心中的问题:
您是否也可以提供任何建议来更好地建立这个?
谢谢...... !!!!!
答案 0 :(得分:0)
最重要的是,对于数百万的问题,保存所有内容并对其进行排序可能不是一个好主意。
使用当前的数据结构, - 时间复杂度:O(n);几乎不可能减少那个 - 空间复杂性:我们可以改进它。例如只需要前10名,费用可以是O(1)。我们只能以排序的方式保存前10名。在线性扫描中,我们只将新组的分数与最小分数进行比较,如果新分数较大则将其替换为
但是一个可能的问题是,如果你有太多具有相同分数的小组,那么这可能是一个问题。你需要仔细处理它。
如果您以“排序”的方式组织样式和组,也许它可以更快。 例如,按字母顺序,第2组将是['a','g','h']。我们会跟踪前一个或几个字母的索引。例如,以'a'开头的组将是第一批;然后是以'b'开头的组,依此类推。 在您的情况下,您可以这样进行搜索: 1.首先以'a'开头的组; 2.然后搜索以'b'开头的组; 那么'f'; 然后'r'。 因此,没有涉及[a,b,f,r]中没有任何样式的组。 通过这种方式,它可以为您节省大量时间。