2017-11-19 6 views
0

링크 된 목록에 보관 된 노드를 제한 할 수 있습니까?링크 된 목록의 노드 제한

단순화를 위해, 아래의 예를 취

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 가지 질문이있는 것 같습니다. 첫째, 연결된 목록 접근 방식을 유지하면서 위의 질문을 어떻게 수행 할 수 있습니까? 둘째, 연결된 목록을 사용하지 않는 것이 더 나은 방법입니다. 나는 queue/deque 또는 heapq를 제한으로 사용할 수 있다고 생각하지만, 다른 것과 관련하여 데이터를 얻는 것이 더 어려울 것입니다. 맞습니까? 연결리스트의 마지막 요소를 제거

+0

* 노드 수를 제한하고 싶다면 * 목록에서 - 물론 그것을 할 수 있습니다. 구현 방법은 당신에게 달려 있습니다 : "전체"인 경우 새 노드를 "추가"하라는 요청을 무시하거나 가장 오래된 노드를 삭제할 수 있습니다. 메모리에있는 것을 제어하고 싶지 않다면 AFAIK는 파이썬에서 실행 가능하지 않습니다.하지만 그렇게해도 말이됩니다. 하위 수준에서 작업하려면 낮은 수준의 언어를 사용하십시오. 그러한 요구 사항을 충족시킬 실제 이유가 있습니까? – alfasin

+0

응용 프로그램을 벤치마킹하고 사용중인 메모리를 측정했는데 * this *가 병목 현상을 발견 했습니까? – alfasin

+0

연결된 목록은 이에 대한 훌륭한 데이터 구조가 아닙니다. 그것은 가능하지만, 아마도 당신은 (''deque') (https://docs.python.org/3/library/collections.html#collections.deque)를 찾고있을 것입니다. –

답변

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 같은 것을하거나 단지 이것을 만들 수 있습니다.

+0

가능한 구현을 보여 주셔서 감사합니다. 하지만 실제로 나는 연결된 목록이 실제로이 시나리오로가는 길은 아니라고 생각합니다. 다시 한 번 감사드립니다. – user1179317