【问题标题】:Merits of implementing tree by array over pointer?通过指针数组实现树的优点?
【发布时间】:2016-10-27 08:02:11
【问题描述】:

最近我学会了通过结构实现树,例如

struct Node{
     Node *parent;
     vector<Node*> child;
     Node(void):parent(nullptr){}
}

我认为这是实现树的一种非常直接的方式, 并且在结构中包含更多用于进程的内容也更容易。

但是,我注意到在很多人的代码中, 他们更喜欢使用数组而不是指针。 对于二叉树,我可以理解这一点,因为它也很容易通过数组来完成 ,但是为什么要在其他更复杂的图上呢?

【问题讨论】:

  • 你可能不想使用pointers at all
  • 我在课堂上学到的方法是,如果你想用这种结构来表示一个连通图,那么数组数组更适合密集图(因为数组几乎完整),但如果 Graph 稀疏(连接较少),请改用指针(列表数组)。数据结构的选择始终取决于应用程序!
  • @πάντα ῥεῖ 为什么不呢?我看不出它背后的原因,如果树没有完全填充,数组不会浪费更多的内存吗?
  • 考虑这篇文章:stackoverflow.com/questions/3287003/…。您当前正在使用带有指向边的指针的节点。那篇文章讨论了存储连接图的各种其他方式及其优点和局限性。请记住,一般的树结构只是一个连通的无环图。
  • 通过指针数组实现树的优点?还是通过数组而不是结构实现树的优点?在您的标题中,您指的是“通过指针通过数组实现树的优点”,但在您的文章中,我发现您觉得访问数组比访问结构更容易。你想使用数组而不是结构吗?还是您想使用数组而不是指针?请澄清一下……这样我就可以给你一个解决方案。

标签: c++ tree


【解决方案1】:

从 Skiena:2008:ADM:1410219 和 Cormen:2001:IA:580470 比较 图的邻接矩阵和邻接列表得出:

  • 邻接矩阵更快地测试(x, y),两个节点是否有连接边
  • 邻接表可以更快地找到给定节点的度数(邻居的数量)。
  • 与使用邻接矩阵的n^2 相比,如果使用邻接列表实现具有m 节点和n 边的图会消耗m + n 空间。
  • 邻接矩阵对大图使用稍微更少的内存。
  • 使用邻接矩阵时,边插入/删除在O(1) 中执行。
  • 遍历使用邻接表实现的图在Θ(m + n) 和矩阵Θ(n^2) 中执行

如果一个图有很多顶点但很少有边,邻接矩阵会消耗过多的内存。

因此,一般来说,邻接表的性能更好。

【讨论】:

  • 邻接矩阵占用的空间,实际上是m^2(节点数的平方)吗?
猜你喜欢
  • 2020-09-09
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
相关资源
最近更新 更多