我必须按应用下载次数排序“最受欢迎的应用RSS”。这是问题所在:
假设有1,000个应用程序。
RSS数据列出了每个应用类别的前100个应用。
RSS数据还提供前100名应用列表,无论其类别如何。
RSS按每个应用的下载次数排序,但确切的下载次数是未知的。
每个应用程序都有两个已知属性:类别,以及它在RSS排名中的位置。
现在我想根据估计的下载次数对所有1,000个应用进行排序。
排序不需要非常准确,只是从统计学上讲,大多数情况都可以。
我怎样才能实现这种排序算法? TIA。
答案 0 :(得分:3)
你可以这样处理:(我假设每个应用只属于一个类别)
假设您对每个类别C1 ..C10
有以下排名C1 C2 ... C10
app1-1 app2-1
app1-2 &pp2-2
.. ...
app1-100 app2-100 app10-100
和
整体100个顶级应用程序分类(例如):
C app1-1 app1-2 app2 -1 ... app2-10
现在使用这两个表,首先你需要以与app1-1到app10-1相同的顺序命令C1到C10出现在列表C中,这样你就“知道”(这更像是猜测)什么类别是在排名方面更重要。
然后使用此信息对其余信息进行排序。
现在我使用一个更简单的例子来展示如何订购剩余的元素。
让我们分3个类别和12个应用程序。
C1 C2 C3
app1 app21 app31
app2 app22 app32
app3 app23 app33
app4 app24 app34
和C = app1 app2 app21 app31
1.首先在表格中标记C中的所有元素:
app1 app21 ->app31
| /
app2 app22 app32
app3 app23 app33
app4 app24 app34
2.秒,对剩余元素进行排序
由于你没有更多的信息,一个很好的近似是从左到右(从较大的排名顶部列表到较小排名的顶部列表)查看每一行,这给出了:
app3 app22 app32 app4 app23 app33 app24 app34
然后整体分裂将是:
app1 app2 app21 app31 app3 app22 app32 app4 app23 app33 app24 app34
我希望这个例子能让我的想法变得清晰,并且有所帮助。
我认为这种方法使用了C1 ... C10和C中的所有信息。
答案 1 :(得分:1)
一种简单的方法是使用整体top-100来确定从哪个类别获取下一个应用程序。
在pesudo-code中:
While (not finished)
i++
category = Overall_list(i).getCategory()
Overall_list.add(get next app from list for category)
end while
在最后100位中没有任何条目的任何类别都会被添加。
答案 2 :(得分:1)
按如下方式构建有向图:
然后,在构造的图上做topological sort。最终的订购将保证与每个前100名列表兼容。
即使应用程序出现在多个类别列表中,此方法也会起作用 - 假设类别列表是相互一致的(例如:根据总下载排名,而不是按类别下载排名)。例如,如果您有一个案例,其中X在一个列表中排名高于Y但是Y在另一个列表上排名高于X,那么这将无法正常工作(我不确定会是什么)。
如果没有更多的信息(例如:某种概率模型),我无法真正解释“从统计学上说最可能”的含义。