关系的数据结构

我正在将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数据结构,但我不确定。

有任何想法吗?

更多信息 –

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

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

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

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

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

你想知道你想预先存储多少,你期望存储多少? 许多? 成千上万的? 数千万?

以下是一些建议:

  • 如果你事先知道你希望存储多少,它不是一个非常大的数字,你不希望在第一次加载后添加它们,在它们的左侧没有任何重复,他们’合理地说“密集”,即左右一对中的数字之间没有大的间隙,那么你可能想要一个数组。 插入是O(1) ,访问是O(1) ,但不能有重复的索引,并在构建后扩展它是一个痛苦。
  • 如果数字真的很大,比如> 10 8 ,你可能想要某种数据库。 数据库相对非常慢 – 比内存数据结构大4到5个数量级 – 但处理的确非常大。
  • 如果你在第一次加载后插入,并且你关心顺序,你会想要某种树,比如2-3树。 插入并访问O(lg n) 。 您可能会在“有序列表”这样的名称下找到一个名称(我不是C#家伙。)
  • 大多数情况下,你可能想要一个哈希。 平均插入和访问O(1) ,就像一个数组; 最坏的情况[你不会用这个数据命中]是O(n)