【问题标题】:Limit the nodes in a linked list限制链表中的节点
【发布时间】:2017-11-19 04:17:08
【问题描述】:

是否可以限制保存在链表中的节点?

为简单起见,举以下例子:

import numpy as np

class LinkedList():
    def __init__(self,data,prev):
        self.data = data
        self.prev = prev

myData_prev = None

for x in range(10):
    data = np.random.random((3,2))
    myData = LinkedList(data,myData_prev)

    myData_prev = myData

print(myData.data)
print(myData.prev.data)
print(myData.prev.prev.data)
print(myData.prev.prev.prev.data)  ## DELETED OR NO LONGER AVAILABLE

假装“数据”非常大或范围不确定。是否可以限制保存在内存中的节点?为简单起见,假设我只需要最新的 3 个节点或 30%。

我想我有 2 个问题。首先,上面的问题怎么做,维护链表的方式。其次,有没有更好的方法不使用链表。我想我可以使用有限制的队列/双端队列或 heapq,但是获取与另一个相关的数据会有点困难,对吧?

【问题讨论】:

  • 你的问题不清楚:如果你想限制列表中的节点数 - 当然你可以做到,这取决于你想如何实现它:如果它是“满的”,您可以忽略“添加”新节点的请求,删除最旧的节点等。如果您想控制内存中的内容以及不存在的内容,那么 AFAIK 在 Python 中是不可行的,但即使如果会的话 - 这没有任何意义。如果您想在较低级别上工作 - 使用较低级别的语言。你有真正的理由提出这样的要求吗?
  • 您是否对应用程序进行了基准测试,测量了正在使用的内存并发现 this 是一个瓶颈?
  • 链表不是一个很好的数据结构。这是可行的,但您可能正在寻找deque
  • 我如何从链表中“删除”最旧的?我没有进行基准测试,但我可以看到运行程序时使用的内存高达 4GB。它适用于我正在尝试实现机器学习的编程游戏。没有必要保留很久以前的非常旧的输入数据,这就是为什么我想限制保留的节点。它没有必要,它仍然有效,只是想知道它是否可能。

标签: python linked-list queue heap


【解决方案1】:
class Node:
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next
    def __repr__(self):
        return 'Node({}, {})'.format(self.data, self.next)

class LinkedList:      
    def __init__(self, iterable=(), maxlen=3):
        self.head = None
        self.length = 0
        if maxlen < 2:
            raise ValueError
        self.maxlen = maxlen
        for item in iterable:
            self.add(item)
    def add(self, data):
        self._check_and_remove_last()
        self.head = Node(data, self.head)
        self.length += 1
    def _check_and_remove_last(self):
        if self.length < self.maxlen:
            return
        new_tail = self.head
        while new_tail.next.next:
            new_tail = new_tail.next
        # new_tail.next is now the last Node in the Linked List
        new_tail.next = None
        self.length -= 1

删除链表的最后一个元素意味着您要么必须跟踪链表中的倒数第二个节点(这不是一件很自然的事情),要么每次都遍历整个链表。您可以通过使用双向链表并执行self.tail.prev.next = None 之类的操作来解决此问题,或者只使用内置的deque,这一切都变得轻而易举

【讨论】:

  • 好的,感谢您向我展示了一个可能的实现。但是是的,我猜链表并不是这种情况的真正方法。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多