【问题标题】:What is the best data structure for tree-like data of fixed depth in C#?C# 中固定深度的树状数据的最佳数据结构是什么?
【发布时间】:2009-07-23 15:46:50
【问题描述】:

三级树状数据结构的最佳(易于维护、相当快速、健壮)实现是什么? 我想使用 Dictionary 或 SortedDictionary,因为所有值(节点)都有唯一的键。

第一级应该有大约 300 个项目,每一个都在第二级有 0 到 10 个(几乎不超过 100 个,通常少于 10 个)项目,在第三级大约有 10 个项目。第二层和第三层紧密相连,因此它们可能应该由一个对象表示。所有的关系都是 1:n

++-L1
|++-L2
||+--L3
||+--...1 to 10 L3 items for each L2
||+--L3
|+--L2
|+--...0 to 100, usually <10 L2 items for each L1
|+--L2
+--L1
+--L1
+--...about 300 L1 items
+--L1

在每个包含 2 级对象(真正的树)的 1 级对象中创建一个字典更好还是将所有 2 级对象放在一个目录中更好?

对象不是很大,它们只包含一些字符串和数字。该应用程序应该是独立的(不需要任何 sql server 左右)

或者对象表示是一个错误的选择,我应该选择完全不同的东西?

【问题讨论】:

  • 你期待在树上进行搜索吗?
  • 不是真正的搜索,但我打算添加一些过滤(从数据结构的角度来看可能是一样的......

标签: c# data-structures dictionary tree


【解决方案1】:

为什么不创建一个 TreeNode 类?

class TreeNode
{
  private string _name;
  private int _someNumber;
  private int _uniqueId;
  private List<TreeNode> _childNodes;

  public string Name{get{return _name;}}
  public int SomeNumber{get{return _someNumber;}}
  public int UniqueId{get{return _uniqueId;}}
  public List<TreeNode> ChildNodes{get{return _childNodes;}}

  public void TreeNode(string name, int someNumber, int uniqueId)
  {
    _name=name;
    _someNumber=someNumber;
    _uniqueId = uniqueId;
    _childNodes = new List<TreeNode>();
  }

  public void AddNode(TreeNode node)
  {
    _childNodes.Add(node);
  }

  // other code for deleting, searching, etc.
}

【讨论】:

  • 节点没有太多共同的数据,但是关卡特定的类可以继承这个通用的TreeView...
【解决方案2】:

根据树的动态,一个相对简单且高效(尽管您可能更喜欢高度简单且相对高效)的选项是数组数组(不是单个 3D 数组)。如果每个节点的子节点数量变化很大,那就不好了……不断分配新的子数组。但是如果你只计算每个节点的子节点一次,然后再访问它们,那么数组数组的数组可以非常简单、容易、紧凑和快速。

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多