避免此功能的递归

时间:2017-02-04 06:30:01

标签: c++ algorithm

我的代码如下,

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 ++。

上面的代码可以做到,但我想做得更好,至少避免递归。

我有办法吗?我可以用一种数据结构来实现这个目标吗?

2 个答案:

答案 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)中。

希望我能正确理解你的问题,这可以给你一些启发。