我的代码如下,
myParent = curreObj->getmyParent();
if(myParent != NULL && myParent->getAttrib() != "abc")
myParent=myParent->getmyParent();
return myParent;
重要提示:许多人可以持有“abc”这个属性。它不是1-1财产。因此,维护地图可能是不可能的。而且我想要它在我的血统中。所以,如果我维护一个multimap,从属性我会有一个对象列表,我必须通过它循环到我的对象,这将使它成为一个O(n)操作。我试图让它小于O(n),理想情况下是O(1),如果不是O(log n)至少。有解决方案吗?
我想让我的祖先拥有属性等于某个值。如果不是,则返回NULL。
我正在使用Visual Studio 2013,C ++。
上面的代码可以做到,但我想做得更好,至少避免递归。
我有办法吗?我可以用一种数据结构来实现这个目标吗?
答案 0 :(得分:2)
您可以将指针存储到对象中的父级,然后执行以下操作: -
myParent = curreObj->parent;
while(myParent != NULL && myParent->getAttrib() != "abc")
myParent=myParent->parent;
答案 1 :(得分:0)
除非您进行预处理并将所有信息保存在某些数据结构中,否则无法使用O(n)。
我还假设O(n)中的n指的是curreObj与其最远祖先之间的长度。如果n是“curreObj”的所有节点的数量,并且您使用二叉树来保存关系,那么您应该已经达到了O(log n)。
如果您仍希望通过在预处理步骤中保存一些额外数据来提高效率,我建议您在哈希映射中使用嵌入式哈希映射,因此对于每个键,可能存在一个哈希映射存储为值和在此hashmap中,对象引用的哈希将是键,对象本身将是值。
我多年没有使用过C ++了,所以请原谅我错误的语法,这只是伪代码。
HashMap<string, HashMap<string, Object>> map;
// it should be the value you specify
HashMap<string, Object> embeddedMap = map.get("abc");
embeddedMap.get(curreObj.hash())
要创建此地图,您需要遍历所有节点并使用属性和相应的“父”保存它们,它应该是类似的,
HashMap<string, HashMap<string, Object>> map;
myParent = curreObj->getmyParent();
if(myParent != NULL && myParent->getAttrib() != null){
HashMap<string, Object> embeddedMap;
embeddedMap.put(curreObj.hash(),myParent);
map.put(myParent->getAttrib(), embeddedMap);
}
通过这种方式,您可以在O(1)中检索该值,但您必须将所有额外信息保存在O(n2)中。
希望我能正确理解你的问题,这可以给你一些启发。