说我有很多具有很多属性的对象。在我的系统中,我知道总属性集,并且在任何给定时间我都可以为这些属性生成一组权重。存储对象的最佳方法是什么,以便我能够根据这些属性权重找到前n个对象。
E.g
对象A => [attribute1,attribute2,attribute4] 对象B => [attribute2,attribute5]
重量=> {attribute1 => 0.5,attribute2 => 1.2,attribute3 => 1,attribute4 => -1,attribute5 => 10}
使用这些权重: 对象A的得分为0.5 + 1.2 +( - 1)= .7 对象B的得分为1.2 + 10 = 11.2
所以对象B将是顶级对象。
答案 0 :(得分:2)
我会将对象保存在数组中。当找到顶部加权对象时,我会通过qsort放置数组。 qsort的比较例程将通过添加对象属性的权重来比较给定对象的权重。排序后,数组中的对象按加权顺序排列,取第一个n。
答案 1 :(得分:0)
如果我正确理解了问题,最好的方法是使用标准的平衡搜索树(如AVL树,RB树,笛卡尔树。在c ++中使用std :: set)。在这棵树中我会存储对
<AttributesWeightsSum, ObjectID>.
然后,插入和移除对象将花费O(P + logN)时间,其中P是计算属性权重和的复杂度(即O(max_attributes_in_objects_count)),并且N是集合中的最大对象数。通过遍历此树,查找前K个对象的ID-s将只是O(K)。
如果您不必枚举前K个对象,但只找到一个顶部对象,而不是平衡搜索树,则可以使用包含上述相同对的二进制堆。