当前位置: 首页 > 知识库问答 >
问题:

高效的树参数递归,高效的子数组或子列表

党建义
2023-03-14

如果我从根节点开始,使用一个我要遍历的子节点列表,{“有机体”、“灵长类”、“人类”、“男性”、“John Smith”},然后递归处理一个步骤,并将剩余的子列表传递给子节点,返回这个。subnodes[MyList[0]].getSubnode(MyList.getRange(1,MyList.Count-1))...即使list.getRange()是一个浅层副本,它仍然会为每一级递归创建一个新列表。整个操作似乎时间和空间都很低效。

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

我是用C语言来思考的,其中列表的头部只是指向一个对象的指针,该对象有另一个指向另一个对象的指针,所以获得子列表就像跟随一个指针一样简单。或者数组只是指向某个内存的指针,所以获取子数组就像增加指针一样简单。非常高效的时间和空间。在C#中有什么方法可以做到这一点吗?

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

或者,我可以将未修改的数组作为参数递归地传递,同时传递一个int索引,我将在每一个更深的级别上递增该索引。这很好,只是我需要向递归方法调用传递另一个参数,它的唯一目的是与第n个递归方法调用通信,“忽略数组中的前n个项”...这很好,如果这是唯一可能的解决方案(或最好的解决方案),那就太傻了。

有更好的办法吗?

共有1个答案

於功
2023-03-14

NET中有一个LinkedList实现,它允许您将下一个LinkedListNode传递到方法中。

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

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

 类似资料:
  • 问题内容: 我知道,常见的性能重构是用 我想问一下: 何时才真正使system.arraycopy变得有意义(考虑到这是本机方法调用)。复制小东西是否表示<32有什么好处? 是我的印象,还是不能简单地使用arraycopy复制(有效地)像这样的循环: } 问题答案: 可能是复制阵列最快的方法,但它不会进行深复制。 它还不能在第二个问题中做更复杂的示例。

  • 为了更灵活地编写代码,我每天都在尝试做不同的问题,但这一次却让我停滞不前。 下面的代码应该是在预序遍历中从给定的字符串建立一个二叉树。即“5 3 1 N N N 7 N N”表示下面的二叉树。元素之间用空格分隔,N标记空节点,空节点正好为NULL。 它应该像遍历拆分的字符串一样简单,当找到以外的东西时,就用该值构造一个,并增加。 增加之后,我再次将下一个数组元素放入左侧子树中。如果遇到,则不需要执

  • 问题内容: 据我所见,内置实现是一个迭代的实现:python docs python是否有实现用于查找子字符串的更充分技术的实现:Boyer- Moore算法 , Rabin-Karp算法等… ??? 问题答案: 实际的cpython字符串搜索实现在这里: http://hg.python.org/cpython/file/tip/Objects/stringlib/fastsearch.h 它似

  • 原文地址:https://cesiumjs.org/tutorials/Particle-Systems-More-Effects-Tutorial/ 高级粒子系统特效 这篇教程学习更多的效果,包括天气和火箭推进器。 如果没有学习过粒子系统基础知识,请学习这篇教程 粒子系统介绍 . 天气 下雪 下雨 最开始下雪的教程是来自 追踪圣诞老人项目里的实现。 步骤 我们即将介绍如何做下雪效果,然后怎么把下

  • 问题内容: 我有一个像这样的数组: 我试图得到这样的数组: 每行(具有固定的任意宽度)都移动一个。A的数组是10k记录长,我试图在Numpy中找到一种有效的方法。目前,我正在使用vstack和for循环,这很慢。有没有更快的方法? 编辑: 问题答案: 实际上,有一种更有效的方法来执行此操作…使用etc的缺点是,您正在复制数组。 顺便说一句,这实际上与@Paul的答案相同,但我将其发布只是为了更详细

  • 问题内容: (关于省时的稀疏数组存在一些问题,但我正在寻找内存效率。) 我需要一个相当于或哪些 只需设置一个比以前遇到的密钥大的密钥即可按需增长。(可以假定键为非负数。) 与大多数索引不是(即实际数据不是很稀疏时)的情况下的内存效率差不多。 当索引稀疏时,消耗的空间与非索引的数量成正比。 使用的内存少于(因为这会使键自动装箱并且可能不利用标量键类型)。 可以获取或设置摊销log(N)时间中的元素,