【问题标题】:C# Efficient Tree Argument Recursion, Efficient sub-array or sub-listC#高效树参数递归,高效子数组或子列表
【发布时间】:2013-04-10 21:55:59
【问题描述】:

我有一个内存树结构,类似于目录树。即:每个节点都有一个命名子节点的字典。我想要一种从名称列表或数组中遍历树的有效方法。

如果我从根节点开始,使用我想要遍历的子节点列表 {"organisms","primates","human","male","John Smith"} 并递归处理一个步骤,然后将剩余的子列表传递给子节点,返回 this.subNodes[myList[0]].GetSubNode(myList.GetRange(1,myList.Count-1)) ... 即使 List.GetRange() 是浅拷贝,它仍然会为每个递归级别创建一个新列表。整个操作看起来非常的时间和空间效率低下。

或者,如果我尝试使用数组,那么我能找到的创建子数组的最佳方法是 Array.Copy,这也是浅拷贝。同样的问题。

我在考虑 C 语言,其中列表的头部只是一个指向一个对象的指针,该对象具有另一个指向另一个对象的指针,因此获取子列表就像跟随一个指针一样简单。或者数组只是指向某个内存的指针,因此获取子数组就像增加指针一样简单。非常节省时间和空间。有没有办法在 C# 中做到这一点?

目前,在 C# 中,我想我只需要忘记递归并从顶层进行某种迭代......

或者我可以递归地传递未修改的数组作为参数,以及一个 int 索引,我将在每个级别更深地递增。这很好,除了我需要将另一个参数传递给递归方法调用,其唯一目的是与第 n 个递归方法调用进行通信,“忽略数组中的前 n 个项目”......这很好,如果这是唯一可能的解决方案(或最好的解决方案),这似乎很愚蠢。

有没有更好的办法?

【问题讨论】:

    标签: c# recursion sublist arrays


    【解决方案1】:

    .net 中有一个LinkedList implementation,它允许您将下一个 LinkedListNode 传递给方法。

    除此之外,使用索引的方法也很好 - 至少它不会消耗额外的内存。

    还有一种方法可以将指针传递给数组元素,就像在 C 中一样。但这会迫使您在不安全模式下编译程序,这通常是不可取的。

    【讨论】:

    • 嗯。我不知道除了 List 类之外还有一个 LinkedList 类。就目前的目的而言,这个答案绝对有效,谢谢。但我会稍等片刻,然后再将其标记为答案,看看是否有其他人提出任何创建子列表或子数组的好方法。
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多