C# 查找链表邻域滚动密度

C# 查找链表邻域滚动密度,c#,linked-list,C#,Linked List,我有这样一个链表: public class Node { public Node next; public Node prev; public int length; public int weight; } 我试图为使用特定长度作为窗口的非循环链表(具有清晰的开始和结束)找到滚动密度。这增加了复杂性,因为结束节点将只使用权重的一个百分比 这意味着给定3个节点 A (L: 10, W:10) -> B (L: 5, W:10) -> C (L:20

我有这样一个链表:

public class Node {
    public Node next;
    public Node prev;
    public int length;
    public int weight;
}
我试图为使用特定长度作为窗口的非循环链表(具有清晰的开始和结束)找到滚动密度。这增加了复杂性,因为结束节点将只使用权重的一个百分比

这意味着给定3个节点

A (L: 10, W:10) -> B (L: 5, W:10) -> C (L:20, W:5)
(其中L表示长度,W表示重量)

节点
B
9
窗口将使用所有节点B,现在剩下4个窗口。它将在so 2从A和C的2之前和之后均匀地分割窗口

所以密度应该是:

[(2/10)*(10) + (5/5)*(10) + (2/20)*(5)] / 9 = 1.3889
这种常见的情况并不是我正在努力解决的部分,它的终点是当左侧没有足够的空间时,窗口应该从右侧取更多的空间,反之亦然。还有一种情况是两边的长度都不够

我不确定是应该实现为递归函数还是循环。我知道循环需要更少的计算,但是递归函数更容易理解

案例1:链表中只有一个节点 取忽略窗口的1节点的密度

情况2:左侧/右侧没有足够的长度 从右/左侧取剩余部分

情况3:两侧的长度不够,但不止一个节点。
采用所有节点,不要求满足窗口要求。

在您编写的所有内容中,您唯一的问题似乎是:“我应该循环还是应该递归?”这取决于您的需要,以最容易读取和维护的为准(或者如果性能是您的最高优先级,则以性能更高的为准)

你正在处理一个链表。我建议简单地循环,而不是递归。(如果你处理的是一棵树,那将是一个不同的故事。)在这两种情况下,你都可以通过某种形式的记忆来节省大量的计算。如果您的窗口涉及到从左到右穿过数百个节点,则可以存储节点n的大部分密度计算,并且几乎所有密度计算都可以用于n+1。在你开始之前,我会先测试非记忆版本,看看它是否有足够的性能

一种可能有助于消除边缘案例数量的设计模式是使用空节点:

Node nullNodeBeginning = new nullNode(length=0, weight=0);
nullNodeBeginning.prev = nullNodeBeginning;
Node nullNodeEnding = new nullNode(length=0, weight=0);
nullNodeEnding.next = nullNodeEnding;
如果将
nullNodeBegining
添加到链接列表的开头,并将
nullNodeBegining
添加到链接列表的结尾,则实际上拥有无限的链接列表。然后你的逻辑会变成这样:

  • 获取特定中心节点的长度
  • 对于上一个,下一个:
  • 获取该方向上n个节点的长度(可能总计为0)
  • 如果总长度=列表的总长度,则无法填充窗口
  • 如果长度

  • 还有其他方法可以做到这一点(这需要保持所有节点的长度),但通过使用nullNode来限制列表,您应该能够避免除“窗口节点不足”之外的所有特殊情况,并使逻辑更加清晰。

    您能详细阐述一下“循环需要更少的计算”的含义吗?如果单独执行每个节点,您将不止一次地访问/计算内容。一个常见的用例是窗口将包括100个节点。计算一个节点(X),它向左移动50个节点(X-50),向右移动50个节点(X+50)…然后移动到下一个节点(X+1),它向左移动50个节点(X-49),向右移动50个节点(X+51)。所有节点X-49到X+50都计算了两次如果窗口大小小于给定节点的长度,它是否忽略“余数”该节点的权重值?可能会发布父滚动窗口函数的函数签名?否,如果当前节点大于窗口,它将使用完整节点并完全忽略窗口。这种逻辑只适用于正在处理的节点,递归函数的种子。在这种情况下,两边都没有足够的长度。在这种情况下会发生什么?你需要从定义所有的情况和预期的行为开始,我认为在最后有一个自循环的想法是个好主意,但我没有很好地遵循你的逻辑。在我原始问题的例子中,我首先得到中心节点长度(5),然后如果我处理下一个问题,我得到n个节点的长度。什么是n?我不知道需要多少节点。n是此链接中的节点总数吗?然后,如果此方向总长度=全长,则无法填充窗口。我不明白为什么窗户不能填满?