0

シリアル接続からの入力を記録しています。

現時点では、入力が更新によって実行される基本クラスを使用していますself.min & self.max

しかし、おそらくこれを行うためのより効率的な方法はありますか?

おそらくデキュー?これには効率上の利点がありますか?おそらくクラスは必要ありませんか?


私が使用した例:

class RangeFinder(object):

    def __init__(self, _mem=3) :
        self._mem = deque(maxlen=_mem)
        self.absmax = -10**10
        self.absmin = 10**10
        self.relmax = None
        self.relmin = None

    def read(self, _data) :
        if _data != None:
            self._mem.append(_data)
            if len(self._mem) == self._mem.maxlen :       
                self.relmax = max(self._mem)
                self.absmax = max(self.absmax, self.relmax)      
                self.relmin = min(self._mem)    
                self.absmin = min(self.absmin, self.relmin) 

別のアイデア:

class MinMax(deque):

    def __init__(self):
        deque.__init__(self, [ 10**10, -10**10 ], maxlen=2)

    def read(self, _data):
        if _data < self[0]:
            self.popleft()
            self.appendleft(_data)
        if _data > self[1]:
            self.pop()
            self.append(_data)

input は int に変換される文字列です。最近シリアル接続をジェネレーターとして使い始めたばかりなので、いくつかの矛盾があります。

次に、最小値と最大値を使用して、バイナリ データを読み取るためのレーザーの強度を計算します。

4

1 に答える 1

0

データを入力するときの順序を維持するために、ここで二分法を使用します。最小/最大のルックアップがO(1)になり、負荷が挿入(O(nlogn))にかかるようにします。また、ここにクラスは必要ないと思います。関数のみを安全に実装できます(問題が説明どおりの場合)。

>>> import random
>>> import bisect
>>> data = []
>>> input_data = random.sample(range(1000),100) 
>>> #Substitute this with your serial input data
>>> for i in input_data:
...     bisect.insort(data, i)
>>> min = data[0]
>>> max = data[-1]
于 2012-04-15T18:25:29.267 に答える