#include <stdio.h>
Class XObject
{
int id;
char *type;
}
Class XSubObject : XObject
{
int remark;
char* place;
}
**抱歉我的错误示例,但或多或少的数据看起来像这样。
std :: vector对象;
存储在对象中的数据如下:
#1=XObject(1001,"chair"), #2=XObject(1002,"spoon"), #3=XSubObject(1004,"table",2,"center"), #4=XSubObject(1005,"item",0,"left")
等等......
我们可以使用相同类型的不同XObject。
Class XStructure
{
XObject parent;
}
Class XStructureRow
{
XObject child;
XStructure parentStruct;
}
std :: vector结构;
存储在Structures中的数据是这样的:
#5=XStructure(NULL), #7=XStructure(#1),#8=XStructure(#2),#9=XStructure(#3),#10=XStructure(#4)
等等......
std :: vector structurerows;
存储在Structures中的数据是这样的:
XStructureRow(#4,#5), XStructureRow(#2,#1),XStructureRow(#2,#7),XStructureRow(#3,#10),XStructureRow(#4,#8)
等等......
我如何编写一个以XObject开头的快速alogirthm,并在哪个structurerow中找到它并获取其结构并获取其父级。对于ex,我想检索名称为“table”的Object的所有父对象 并将其父母的名字改为“椅子”。
我的书面算法是:
std::vector<XObject> getParents(XObject "chair")
{
std::vector<XObject> objs;
for (int i=0;i<structurerows.size() ;i++ )
{
XStructurerow sr=structurerows[i];
XStructutre parent= sr.fetchParent();
if(parent!=NULL)
{
if(parent.fetchName()=="chair")
objs.push_back(parent);
}
}
return objs;
}
如果我必须获取所有父对象,那么如果我有大量数据则需要花费太多时间。我的意思是有没有任何解决方案有助于以O(1)方式找到父对象而不是迭代完整的循环?我想用最少的迭代来获取这些父级。这里的复杂性是O(n),我不满意。我希望我提出一些有效的观点。建议请..
答案 0 :(得分:2)
一些建议。
首先,你的getParents()函数正在制作对象和数组的多个副本。它构造了一个名为objs的向量的新实例,用行中的副本项填充它。然后返回数组的副本(它创建每个对象的新副本,从而创建其成员的副本)。这可能是导致性能问题的根本原因。
其次,您的类层次结构具有包含“子”和“父”对象的类,但是存储这些XObject实例的副本。因此,如果您要独立更新其中一个对象,则您认为引用它们的所有父对象和子对象都具有不同的副本。 (因此,稍后会创建一些奇怪的错误,特别是因为基类包含指针)。类声明中的对象关系应该是通过指针,而不是实例副本。
第三,查找算法期间的字符串比较对性能也很苛刻。如果可能的话,您应该用整数表示对象的唯一键。
不知道你的问题集还有什么,如果你解决了这三件事,你可能会有更好的表现而不关心找到O(1)解决方案。
现在实际回答你的问题:
我会保留数组的map或(hash_map)表来跟踪某种类型的所有对象。那就是:
std::map<std::string, std::vector<XObject*>> lookupmap;
然后在创建每个对象时,您可以在“lookupmap”中查找它的类型并添加它:
void OnObjectCreated(XObject* pObj)
{
std::string strType(pObj->type);
lookupmap[strType].push_back(pObj);
}
我将把你使用std :: map或std :: hash_map的部分留作你的练习。
答案 1 :(得分:1)
“找到”具有O(1)复杂性的东西的唯一方法是使用哈希表。从键值创建哈希值然后访问由该哈希值索引到表中的对象的过程将具有O(1)复杂度。否则,任何其他搜索算法最多只能是排序列表或排序树型结构的O(log n)。