2017-11-19 15 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つの質問があると思います。まず、リンクされたリストのアプローチを維持しながら、上記の質問をどのように行うことができますか。第二に、リンクされたリストを使用しない方がよい方法です。私は、キュー/キューまたは制限付きのheapqを使うことができると思うが、他のものと関連してデータを取得するのは難しいだろうか?リンクリストの最後の要素を取り除く

+0

*ノード数を制限したい場合*リストを作成することはもちろん可能ですが、実装する方法はあなた次第です:もし完全であれば、新しいノードを追加する要求を無視するか、最古のノードを削除するか、メモリ内のものを制御したいのですが、AFAIKではPythonでは実行できませんが、たとえそうであっても意味がありません。下位レベルで作業したい場合は、下位レベルの言語を使用します。あなたはそのような要件を思いつくために*本当の理由がありますか? – 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 

あなたはどちらかが、リンクされたリスト(行うにはない非常に自然なこと)で最後から2番目のノードを追跡する、または全体リンクリストをトラバースしなければならないことを意味します毎回。 self.tail.prev.next = Noneのようなやり方や、dequeの組み込みを使って、これを回避することができます。

+0

私は可能な実装を表示してくれてありがとう。しかし、確かに私はリンクリストは実際にこのシナリオに行く方法ではないと思う。再度、感謝します – user1179317

関連する問題