class BrownianVariableHistory(object): ''' Represents the set of known time value pairs for a particular Brownian variable ''' def __init__(self): self._historyTree = RBTree() def insertData(self, t, val): ''' Inserts a data point into the history object t (float) : time val (float) : value ''' self._historyTree.insert(t, val) def getMartingaleRelevantPoints(self, t): ''' Returns 2 data points. The first will be the data point with the largest 't' in the history that is still smaller than the given user provided argument 't'. The second will be the datapoint with the smallest 't' that is still larger than the user provided 't'. If one or both of the data points do not exist, this function will return None in that data point's place. t (float) : time returns ((t1,val1), (t2,val2)) where t1, t2, val1, val2 are floats : 2 data points Ex: bh.getMartingaleRelevantPoints(3.1) == ((3.0, 0.07), (3.5, 0.21)) bh.getMartingaleRelevantPoints(3.6) == ((3.5, 0.21), None) ''' if self._historyTree.is_empty(): return None, None leftPoint = None rightPoint = None if self._historyTree.min_key() <= t: leftPoint = self._historyTree.floor_item(t) if self._historyTree.max_key() >= t: rightPoint = self._historyTree.ceiling_item(t) return leftPoint, rightPoint
def max_sum_mod(array, size, m): sum = [0] * size # Első elem létrehozása, ez után ciklus kell sum[0] = array[0] % m RB = RBTree() RB.insert(sum[0], sum[0]) #key, value páros result = sum[0] for i in range(1, size): #flag azért kell, mert implementáció szerint ha egy elemnek nincs rákövetkezője, #akkor kivételt dobna flag = True sum[i] = sum[i - 1] + array[i] sum[i] %= m try: (k, v) = RB.ceiling_item(sum[i]) #következő elem except KeyError as e: #ha nincs rákövetkező akkor nem tudjuk a különbségét venni print(e) result = max(sum[i], result) flag = False if flag: #pythonban a % művelet negatív számokra is úgy működik, ahogy azt elvárjuk #C-ben például a sum[i] -k -hoz hozzá kéne adni az m-et. result = max((sum[i] - k) % m, result) #ez egy potenciális gyorsítás, ha elértük a maximális értéket (mod m), ami m-1 #akkor nincs értelme tovább keresni, kiléphetünk a ciklusból if result == (m - 1): break RB.insert(sum[i], sum[i]) #RB.foreach(print, 0) return result
''' Created on May 27, 2013 @author: Yubin Bai ''' from bintrees import RBTree infinity = (1 << 33) - 1 if __name__ == "__main__": tree = RBTree() tree[infinity] = 0 tree[-1 * infinity] = 0 print(tree.floor_item(0)) print(tree.ceiling_item(0))
''' Created on May 27, 2013 @author: Yubin Bai ''' from bintrees import RBTree infinity = (1 << 33) - 1 if __name__ == "__main__": tree = RBTree() tree[infinity] = 0 tree[-1 * infinity] = 0 print(tree.floor_item(0)) print(tree.ceiling_item(0))