根据属性权重查找对象

时间:2013-02-10 06:47:13

标签: algorithm search data-structures storage

说我有很多具有很多属性的对象。在我的系统中,我知道总属性集,并且在任何给定时间我都可以为这些属性生成一组权重。存储对象的最佳方法是什么,以便我能够根据这些属性权重找到前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将是顶级对象。

2 个答案:

答案 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个对象,但只找到一个顶部对象,而不是平衡搜索树,则可以使用包含上述相同对的二进制堆。