关系的数据结构

时间:2008-12-22 15:08:15

标签: c# algorithm data-structures

我正在将VB6转换为C#,我希望使我的数据结构更有效地保持值和关系。在VB中,我有一组值和另一组关系,这些值与这些关系的优先级之间存在关系。我还有一个算法,当一组值传递给它时,返回将这些值连接在一起所需的所有关系。例如,假设值集合包含1-10,而关系集合包含

1,2
3,2
5,2
2,8
8,10
9,10

如果输入为1,9,10,则返回的关系为 -

1,2
2,8
8,10
9,10

由于可能存在多条路径,因此会返回最少量的关系,但需要注意关系优先级。如果关系具有更高的优先级,则将添加该关系,并且将从那里添加其余关系。我正在考虑使用Disjoint-set data structure,但我不确定。

有什么想法吗?

更多信息 -

值的数量通常小于100且关系小于500.集合是静态的,并且将一次又一次地使用算法来查找路径。另外,我没有问这个,但Disjoint-set data structure中的算法效率最高吗?

2 个答案:

答案 0 :(得分:7)

听起来你拥有的是Graph。这是一个带有节点和边缘的结构。有many many libraries和处理图形的工具。 Microsoft甚至发表了一篇关于如何处理它们的论文。我认为图形很棒,在很多情况下非常有用。

图表的一大好处是能够为节点之间的边缘分配优先级。然后,当您想要找到两个节点之间的路径时,图表可以选择具有理想优先级的路径。

在您的情况下,您的值是节点,您的关系是边缘。

答案 1 :(得分:2)

您需要问自己(并告诉我们)您期望使用何种模式。这些关系是按顺序添加还是随机添加,您的查询是按顺序(如您显示)还是随机添加的,这实际上是一个批处理过程 - 加载它们,读取查询 - 或者您希望做什么?它“在线”,你可以添加一些,然后查询一些,然后再添加一些并查询更多?

您是否知道您希望预先存储多少,以及您希望存储多少?许多?成千上万的?数千万?

以下是一些建议:

  • 如果你事先知道你有多少人 期待存储,这不是真的 大数字,你不要指望添加 他们在第一次装货后,就在那里 不是重复的 这对的左手边,和 它们在“合理”中相当“密集” 意识到没有大的差距 在左边的数字之间 那对,你可能想要的 数组。插入是 O(1),访问是 O(1), 但不能有重复的索引和 在你构建它之后扩展它是一种痛苦。
  • 如果数字真的很大,比如> 10 8 , 你可能想要某种数据库。 数据库相对非常慢 - 4到5个订单 幅度大于内存数据结构 - 但处理真正的大数据。
  • 如果你有插入后 首先加载,你关心 订单,你会想要一些 一种树,就像一棵2-3树。插入 并访问 O(lg n)。 你可能会发现一个瑕疵 在“有序列表”之类的名称下 (我不是C#家伙。)
  • 大多数情况下,你可能 想要哈希。平均插入和 像数组一样访问 O(1); 最糟糕的情况[你不会打 此数据]是 O(n)