哪个集合适合此任务?

时间:2017-12-20 05:13:42

标签: c# collections

我正在使用C#,现在正在尝试改进算法(那里有不同的故事),为此,我需要有这样的数据结构:

The data structure

正如您所看到的,它是一个链表,每个节点可以有零个或一个跟随者"(正确的)。我还在考虑是否需要不止一个。

我可以自己实施这些链接列表" raw"但我认为如果我使用可用的集合(例如List等)会好得多。

到目前为止,我正在考虑建立一个班级&#34; PairClass&#34;这将有一个&#34;第一个元素&#34;和&#34;追随者&#34;。 (左侧节点和右侧节点)。如果我决定包含多个链接节点(关注者),这可能会改变。然后使用List<PairClass>

最后一个考虑因素是,如果数据收集允许我通过以有效的方式给出第一个元素来获得跟随者,那将是很好的。

由于最后一次考虑,我不确定List<PairClass>是否是最好的方法。

有人可以告诉我在这些情况下使用什么吗?我总是乐于学习和讨论更好的做事方式。基本上我要求有效的解决方案来解决问题

编辑:(回应评论)

  

如何识别每个节点,是否有ID?或者列表中的索引是否足够?

到目前为止,我对使用简单的整数感到满意。但我想你是对的,你只是给我一个想法,也许我需要的解决方案比我想象的更简单!

  

您的用例是什么?您多久会添加或删除元素?你打算迭代这个集合吗?

我会经常添加元素。 &#34;追随者&#34;也可能经常被替换。这些元素不会被删除。我将最终迭代这个集合,原因是追随者将被淘汰作为考虑因素并被他们的第一个元素取代

(请注意)。我这样做的原因是因为我需要修改一个花费太多时间的算法,这个算法对图像执行太多扫描(这需要时间)所以我打算构建这个结构来解决问题,因此速度是考虑。

2 个答案:

答案 0 :(得分:2)

您确实需要添加更多详细信息,但需要说明

  • 如果您不需要按顺序遍历列表
  • 如果每个节点都有一个密钥
  • 如果您想要快速查找

您可以使用Dictionary<Key,Node>

<强>节点

public class Node
{
   // examples
   public string Id {get;set;}
   public Node Parent {get;set;}
   public Node Child {get;set;}
   public Node Sibling {get;set;}
}

选项1

var nodes = new Dictionary<string,Node>();

// add like this
nodes.Add(node.Id,node);

// look up like this    
node = nodes[key];

// access its relatives 
node.Parent
node.Child
Node.Sibling 
  • 如果您想经常迭代列表
  • 如果索引完全是您需要查找节点
  • 或者如果您想通过Linq查询列表

选项2

var list = new List<Node>;

// lookup via index
var node = list[index];

// lookup via Linq
var node = list.FirstOrDefault(x => x.Id == someId)

答案 1 :(得分:2)

如果它是一个单一的追随者场景,那么我建议将列表作为可能的候选词典,因为词典将使其可以更快地垂直访问,并且成为单个追随者列表,您可以轻松使用链接列表。

如果它是一个多个跟随者场景,我会建议字典集合的字典,这将使整个集合更快地垂直或水平访问。

萨鲁曼给出了一个相当好的实施例子。