Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将这些自定义对象列表的时间复杂度从O(n)降低到O(1)?_C++_List_Time Complexity - Fatal编程技术网

C++ 如何将这些自定义对象列表的时间复杂度从O(n)降低到O(1)?

C++ 如何将这些自定义对象列表的时间复杂度从O(n)降低到O(1)?,c++,list,time-complexity,C++,List,Time Complexity,std::向量结构; 存储在结构中的数据如下所示: #5=xsstructure(NULL),#7=xsstructure(#1),#8=xsstructure(#2),#9=xsstructure(#3),#10=xsstructure(#4)等等 std::向量结构行; 存储在结构中的数据如下所示: xsstructureRow(#4,#5)、xsstructureRow(#2,#1)、xsstructureRow(#2,#7)、xsstructureRow(#3,#10)、xsstruct

std::向量结构; 存储在结构中的数据如下所示:
#5=xsstructure(NULL),#7=xsstructure(#1),#8=xsstructure(#2),#9=xsstructure(#3),#10=xsstructure(#4)
等等

std::向量结构行; 存储在结构中的数据如下所示:
xsstructureRow(#4,#5)、xsstructureRow(#2,#1)、xsstructureRow(#2,#7)、xsstructureRow(#3,#10)、xsstructureRow(#4,#8)
等等

如何编写一个快速算法,从XObject开始,在哪个structurerow中找到它,并获取其结构和其父级。例如,我想检索名为“table”的对象的所有父对象 并用“椅子”这个名字来检索它的父母

我写的算法是:

Class XStructure
{
    XObject parent;
}

Class XStructureRow
{
    XObject child;
    XStructure parentStruct;
}
std::vector getParents(XObject“椅子”)
{
std::矢量对象;
对于(int i=0;i“查找”复杂度为O(1)的对象的唯一方法是使用哈希表。从键值创建哈希值,然后访问通过该哈希值索引到表中的对象的过程将具有O(1)复杂度。否则,任何其他搜索算法最多只能是O(logn)用于排序列表或排序树类型结构。

一些建议

首先,getParents()函数正在创建对象和数组的多个副本。它构造一个名为objs的向量的新实例,用行中项目的副本填充它。然后返回数组的副本(这将创建每个对象的新副本,这将创建其成员的副本)。这可能是您的性能问题的根本原因

其次,您的类层次结构中有带有“子”和“父”对象的类,但存储的是这些XObject实例的副本。因此,如果要独立更新其中一个对象,则您认为引用它们的所有父对象和子对象都有不同的副本。(因此,以后会产生一些奇怪的bug,特别是因为基类包含指针)。类声明中的对象关系应该通过指针,而不是实例副本

第三,查找算法中的字符串比较对性能也很苛刻。如果可能的话,应该用整数表示对象的唯一键

如果你对你的问题集一无所知,那么如果你解决了这三件事,你可能会有更好的表现,也不会在意找到O(1)解决方案

现在来实际回答你的问题:

我会保留一个数组映射或(hash_-map)表来跟踪特定类型的所有对象。即:

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;
}

我将把你使用std::map或std::hash_map的部分留给你作为练习。

你能重新阅读你的文本,纠正拼写错误并扩展示例以使其清晰吗?读完你的帖子后,我想说“切换到gentoo linux,使用适当的标志和指令集重新编译整个系统,您将获得6%的性能”,但是尝试一些编译器标志,它们很好。无论如何,这无法真正工作,按照这里的布局:要存储从
XObject
派生的对象,您需要多态指针(
unique\u ptr
在这里可能是正确的类型),不可能简单地按值存储。谢谢……我希望这能起作用……在我重新设计解决方案后让您知道。
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;
}
std::map<std::string, std::vector<XObject*>> lookupmap;
void OnObjectCreated(XObject* pObj)
{
    std::string strType(pObj->type);

    lookupmap[strType].push_back(pObj);
}