Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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++ 什么样的数据结构适合facebook模型用户_C++_Algorithm_Performance_Data Structures_Performance Testing - Fatal编程技术网

C++ 什么样的数据结构适合facebook模型用户

C++ 什么样的数据结构适合facebook模型用户,c++,algorithm,performance,data-structures,performance-testing,C++,Algorithm,Performance,Data Structures,Performance Testing,我想为这种情况建立一个有效的数据结构: 有很多用户,每个用户都有一个ID和一个名称。每个用户都可以跟随其他用户。我需要处理四种命令:创建用户、跟随、删除用户和取消跟随。以下是一个例子: create-user id=3 name="Chandler" create-user id=7 name="Janice" create-user id=2 name="Joey" follow id=3 id=7 # Chandler follows Janice follow id=7 id=3

我想为这种情况建立一个有效的数据结构:
有很多用户,每个用户都有一个ID和一个名称。每个用户都可以跟随其他用户。我需要处理四种命令:创建用户、跟随、删除用户和取消跟随。以下是一个例子:

create-user id=3 name="Chandler"
create-user id=7 name="Janice"
create-user id=2 name="Joey"
follow id=3 id=7     # Chandler follows Janice
follow id=7 id=3     # Janice follows Chandler
follow id=2 id=7
follow id=7 id=2
delete-user id=7
follow id=3 id=2
follow id=2 id=3
cancel-follow id=3 id=2
总之,我需要读取一个文件,其中包含大量的命令,如上所述,并处理所有的数据

以下是我尝试过的(处理四种命令的函数):

struct用户
{
无符号长id;
字符串名;
无序的追随者;
无序设置的风扇;
用户(无符号长pid,常量字符串和pname):id(pid),名称(pname){}
};
列出用户名单;
用户和getUserById(列表和用户,未签名的长id)
{
auto it=std::find_if(users.begin(),users.end(),[&](User&u){return id==u.id;});
归还它;
}
void createUser(列表和用户、无符号长id、常量字符串和str)
{
用户。向后放置(用户(id,str));
}
void deleteUser(列表和用户,未签名的长id)
{
auto-itUser=std::find_if(users.begin(),users.end(),[&](User&u){return id==u.id;});
自动itFans=itUser->fans;
对于(自动it=itFans.begin();it!=itFans.end();++it)
{
(*it)->followers.erase(&*itUser);
}
自动itFollowers=itUser->followers;
for(auto-it=itFollowers.begin();it!=itFollowers.end();++it)
{
(*it)->fans.erase(&*itUser);
}
用户。擦除(itUser);
}
void buildRelation(列表和用户、未签名的长跟随者、未签名的长风扇)
{
User&u1=getUserById(用户,跟随者);//3
User&u2=getUserById(用户,风扇);//7
u1.风扇。插入(&u2);
u2.跟随者。插入(&u1);
}
void cancelRelation(列表和用户、未签名的长跟随者、未签名的长风扇)
{
User&u1=getUserById(用户,跟随者);//3
User&u2=getUserById(用户,风扇);//2
u1.风扇。擦除(&u2);
u2.followers.擦除(&u1);
}
它工作正常,没有任何错误

然而,我用我的代码处理了一个包含70000行命令的文件,耗时约67秒


我真的很想获得更好的性能(可能是20秒?),我知道我需要一个更好的数据结构,但现在我不知道如何设计一个更好的数据结构。

您的输入数据看起来非常适合一个键值数据结构,如std::无序映射()

其中id值可以用作存储和检索用户数据结构的键

如果你能把数据处理成这样的结构 std::无序的_映射而不是列表
这样,您的getUserById函数就不需要每次搜索列表来检索用户数据。

对于用户,请使用映射类型的数据结构键作为I'd,值作为Name

实现一个有向图作为结构

Graph{ intV;LinkedList<Map<Long,String>>adjList[]; }
图形{intV;LinkedListDjList[];}
  • 创建用户:
    在图形中创建节点

  • 跟踪用户: 创建从该用户到其他用户的定向链接

  • 删除用户: 使用图遍历技术查找用户并删除节点

  • 取消-遵循: 从图中删除链接,因为它是有向图


  • 希望它有帮助

    您正在使用优化的构建进行测试,对吗?你是不是想看看是什么花了你的时间?关于
    std::list
    :它非常适合在任何地方进行插入和删除,而且它对你有很大的好处,你可以充分利用它,但是对于你能用它做的几乎所有事情来说,它简直糟透了
    getUserById
    有可能成为指针追踪和缓存未命中的绝对恐怖表演。另外,
    unordered_map
    具有非常宽容的引用无效性,即使在插入项时迭代器可以很容易地无效。太棒了。我刚刚测试了
    std::unordered_map
    ,现在只需13秒。不错。谢谢
    Graph{ intV;LinkedList<Map<Long,String>>adjList[]; }