尝试选择正确的数据结构

时间:2019-04-27 20:00:13

标签: c data-structures graph structure undirected-graph

因此,我想将生产中的所有参与者存储在图中。因此,从输入中我们将像这样:

N是我们阅读的电影的数量,对于我们阅读的每部电影:电影的名称,在下一行将是演员的数量(假设为nr)现在,在接下来的nr行中,将是每个演员的名字。在电影中,每个演员都与其他演员“连接”。

到目前为止我所做的:

我根据演员的名字建立了一个二进制搜索树,并在该二进制搜索树的每个“节点”中存储了:演员的ID,他上演过的所有电影以及他/她的名字。

所以会是这样:

typedef struct binaryTree
{
    int size;
    int id;
    int movieSize;
    int movieCapacity;
    char **movieName;
    char *actorName;
    struct binaryTree *left;
    struct binaryTree *right;
} *BinaryTree;

现在,使用此二叉搜索树,我想搜索电影中的每个电影,以及每个电影中的演员,我想在图中将他们的ID链接到gheter。

现在是问题所在:我制作了BST,但是现在在搜索每个电影名称时,我将不得不在每个演员中搜索它,因此每次搜索仍然是O(nr),因此并没有真正帮助我。有什么其他方式可以使图形的初始化更容易和更有效?

编辑:

为了更好地可视化数据:

Movie1:      Movie2:       Movie3:    Movie5:
Actor1       Actor1        Actor2     Actor6
Actor5       Actor3        Actor4     Actor7
Actor3       Actor4        Actor5     Actor8

将被读取的实际输入:

4
Movie1
3
Actor1
Actor5
Actor3
Movie2
3
Actor1
Actor3
Actor4
Movie3
3
Actor2
Actor4
Actor5
Movie4
3
Actor6
Actor7
Actor8

将按以下顺序读取:具有Actor1,Motor5,Actor3的Movie1,具有Actor1,Actor3,Actor4的Movie2等(如您所见,第二次读取Actor1时不会再添加新的节点,但它将在Actor1的电影列表中添加新电影。 这也是基于此数据的二叉树的照片:

我希望我的数据结构支持id和actor名称之间的快速访问,以及数据的快速排序。这就是为什么我认为BST会很合适,然后从那里开始用ID来建立图表的问题。问题是我要在每个演员的名字上建立这个二叉搜索树并建立图表之后,我该如何真正进行呢? (更好的)存储/完成方式?

这是我要构建的图形的照片,其中节点的每个数字都是参与者名称内的数字(为简化起见):

1 个答案:

答案 0 :(得分:0)

您可能希望用邻接表来表示演员图(请参见https://www.geeksforgeeks.org/graph-and-its-representations/)。

对于每个Actor A ,您将创建与 A 连接的Actor数组。

struct Actor {
  int   id;
  char  *name;
}

struct AdjacencyRow {
  struct Actor  *actor;
  unsigned      connected_actors_count;
  struct Actor  **connected_actors;
}

struct AdjacencyList {
  unsigned             row_count;
  struct AdjacencyRow  *rows;
}

在输入解析期间,每当遇到新的Actor时,便为他分配一个新的struct Actor,并在struct AdjacencyRow中为其分配一个新的struct AdjacencyList

然后在这个新Actor的行中,添加指向同一电影中播放的其他Actor的指针(您需要记住其id对于当前正在处理的Movie的指针),并将指向该Actor的指针添加到所有其他演员的行。

遇到已知的Actor时,只需添加指针(不过要注意重复的内容)。

这给您O(n log n)的复杂性(对于n =每部电影的演员数量),因为必须对 k 执行 k -演员被添加。


这样,您最终得到一个结构,该结构可让您在O(e)的时间内找到直接连接的演员,在O(e^2)的时间内都连接到同一演员的演员,等等(其中{{1} } =每个参与者的平均连接数)。


可以通过完全摆脱e并仅构建名称数组和int数组(如AdjacencyList)来简化上面的示例。