图形数据结构&在C ++中实现

时间:2014-05-05 19:45:42

标签: c++ data-structures

我在c ++中编写一个模拟,其中包含许多由整数索引的小实体,每个实体都有各种类型的关系。我有一个存储关系数据的基本结构,关系是单向的(A可以是B的朋友,但B不一定与A有任何关系)。

所以我有很多具有形式的数据(整数索引,整数索引,数据......)

  1. 我经常需要从实体(索引)开始,找到它与其他人的所有关系(所以所有三元组的第一个条目都等于某个索引)。

  2. 我有时也需要从模拟中删除实体并销毁引用它们的所有关系(删除所有三元组,其中第一个或第二个条目等于给定的整数)。

  3. 在一个极端情况下,我可以按任意顺序存储所有内容并每次搜索它以构建我需要的任何列表(我在上面的#1和#2中引用的列表)。这需要最少量的数据,但也会非常慢。另一个极端是我跟踪多个索引结构,这些结构允许我更快地执行上面描述的两个操作但占用一些内存。很难巧妙地描述我的意思,但是你可以想象一个列表列表,它可以让你快速回答问题"所有关系中有47个作为他们在三联中的第一个条目。& #34;

    我对数据结构一无所知,但我认为这一定是人们以前遇到和想过的问题。是否有任何C ++库具有自动跟踪此类索引信息或与我所描述的内容相关的数据结构?谢谢!

2 个答案:

答案 0 :(得分:2)

我做这样的事情:

class Entity;

class Relationship // usually called Edge
{
  Entity *from;
  Entity *to;
  // other data
};

class Entity // usually called Node
{
  list<Relationship*> incoming;
  list<Relationship*> outgoing;
};

vector<Entity*> roster;

您可能希望将roster包装在某种EntityHandler类中,以管理所有这些指针。

对于#1,按照其编号(例如roster[5])查找名单中的实体,并且该实体的outgoing是您想要的 - 您可以执行浅拷贝(指针),或深度副本(关系)。

对于#2,查找实体并迭代其两个关系列表;对于每个关系,从另一端的实体列表中删除相应的指针,然后删除关系。然后删除实体。并且不要忘记将名单中的指针设置为NULL。

答案 1 :(得分:0)

Wikipedia有一个关于如何实现图形的好部分,甚至还有时间和存储复杂性。 有三种主要类型:关联矩阵邻接矩阵和邻接列表。一般来说:

关联矩阵使用节点*边缘大小的矩阵,最适用于超图,具有多个节点和多图的边/连接的图,图表允许两个节点之间有多个连接。然而,边缘越多,空间越大。

邻接列表是最有效的,如果它们是大量调整大小,因为数据是非连续的,稀疏图形,因为它们只为那里的链接分配空间,但使用占用更多空间的指针。邻接列表可能是有向图的最容易实现的)

最后是邻接矩阵,它存储节点*节点矩阵以检查两个节点是否连接,例如,如果[1] [3]为真,则第一个节点连接到第三个节点。

https://en.wikipedia.org/wiki/Graph_(data_structure)对他们的实现有很好的描述,但请注意,他们说这是一个'发生率列表',但它只是一个邻接列表实现的链接