C++ 避免此功能的递归

C++ 避免此功能的递归,c++,algorithm,C++,Algorithm,我的代码如下所示 myParent = curreObj->getmyParent(); if(myParent != NULL && myParent->getAttrib() != "abc") myParent=myParent->getmyParent(); return myParent; 重要提示:财产“abc”可以由许多人持有。它不是1-1属性。因此,维护地图可能是不可能的。我也希望我的血统中有这样的东西。因此,如果我维护一个多重映射,从

我的代码如下所示

myParent = curreObj->getmyParent();
if(myParent != NULL && myParent->getAttrib() != "abc")
    myParent=myParent->getmyParent();
return myParent;
重要提示:财产“abc”可以由许多人持有。它不是1-1属性。因此,维护地图可能是不可能的。我也希望我的血统中有这样的东西。因此,如果我维护一个多重映射,从属性我将有一个对象列表,通过它我必须循环到我的对象,这将使它成为一个O(n)操作。我试图让它小于O(n),最好是O(1),如果不是O(logn)至少。有解决办法吗

我想让我的祖先拥有与某个值相等的属性。如果不是,则返回NULL

我使用Visual Studio 2013,C++。 上面的代码可以做到这一点,但我想做得更好,至少要避免递归


有什么办法我能做到吗?是否有一个数据结构可用于完成此任务?

您可以将指向父对象的指针存储在对象中,然后执行以下操作:-

myParent = curreObj->parent;
while(myParent != NULL && myParent->getAttrib() != "abc")
    myParent=myParent->parent;

您可以将指向父对象的指针存储在对象中,然后执行以下操作:-

myParent = curreObj->parent;
while(myParent != NULL && myParent->getAttrib() != "abc")
    myParent=myParent->parent;
O(n)是不可能的,除非您进行预处理并将所有信息保存在某个数据结构中

我还假设O(n)中的n是指curreObj与其最远祖先之间的长度。如果n是“curreObj”的所有节点数,并且您正在使用二叉树来保存关系,那么您应该已经达到了O(logn)

如果您仍然希望通过在预处理步骤中保存一些额外数据来提高效率,我建议您在hashmap中嵌入一个hashmap,因此对于每个键,可能会存储一个hashmap作为值,在这个hashmap中,对象引用的hash将是键,对象本身将是值

我多年来一直没有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;
//它应该是您指定的值
HashMap 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);
}
HashMap;
myParent=curreObj->getmyParent();
如果(myParent!=NULL&&myParent->getAttrib()!=NULL){
HashMap嵌入映射;
embeddedMap.put(curreObj.hash(),myParent);
put(myParent->getAttrib(),embeddedMap);
}
这样,您可以检索O(1)中的值,但必须将所有额外信息保存在O(n2)中

希望我能正确理解您的问题,这会给您一些启发。

O(n)不可能,除非您进行预处理并将所有信息保存在某些数据结构中

我还假设O(n)中的n是指curreObj与其最远祖先之间的长度。如果n是“curreObj”的所有节点数,并且您正在使用二叉树来保存关系,那么您应该已经达到了O(logn)

如果您仍然希望通过在预处理步骤中保存一些额外数据来提高效率,我建议您在hashmap中嵌入一个hashmap,因此对于每个键,可能会存储一个hashmap作为值,在这个hashmap中,对象引用的hash将是键,对象本身将是值

我多年来一直没有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;
//它应该是您指定的值
HashMap 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);
}
HashMap;
myParent=curreObj->getmyParent();
如果(myParent!=NULL&&myParent->getAttrib()!=NULL){
HashMap嵌入映射;
embeddedMap.put(curreObj.hash(),myParent);
put(myParent->getAttrib(),embeddedMap);
}
这样,您可以检索O(1)中的值,但必须将所有额外信息保存在O(n2)中


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

这保存了递归,但仍然是O(n)。也许我想去O(1)?这是可能的吗?不,您必须循环所有父级以检查while条件。这将保存递归,但仍然是O(n)。也许我想去O(1)?有可能吗?没有,您必须循环检查所有家长的while条件。
此功能
/
我的代码看起来
代码实现了什么?(把
get[an/最近的]祖先[满足某个谓词]
放在更突出的位置:标题、第一句话、a/过程的名称。)
避免递归
在我的书中,递归直接或间接地读取了相同的更多实例:我在你的问题中看不到这一点。(什么是沿袭?)
此功能
/
我的代码看起来
代码实现了什么?(把
get[an/最近的]祖先[满足某个谓词]
放在更突出的位置:标题、第一句话、a/过程的名称。)
避免递归
在我的书中,递归直接或间接地读取了相同的更多实例:我在你的问题中看不到这一点。(什么是血统