def find_gt( self, k ): #return (key,value) where key > k p = self._T.SkipSearch( Map._Item( k ) ) if p._next is None or p._next._next is None: return None p = p._next return (p._elem._key,p._elem._value)
def find_ge( self, k ): #return (key,value) where key >= k p = self._T.SkipSearch( Map._Item( k ) ) p = p.elem._next if p._next is None: return None return (p._elem._key,p._elem._value)
def find_lt( self, k ): #return (key,value) where key < k p = self._T.SkipSearch( Map._Item( k ) ) if p._prev is None or p._prev._prev is None: return None if p._elem._k == k: p = p._prev return (p._elem._key,p._elem._value)
def find_le(self, k): #SkipSearch s'arrête sur key <= k p = self._T.SkipSearch(Map._Item(k)) #si on arrête sur la sentinelle à gauche #il n'existe pas d'élément dont la clé est <= k if p._prev is None: return None #sinon, on s'est arrêté dessus return (p._elem._key, p._elem._value)
def find_range( self, start, stop ): #iterate (key,value) where start <= key < stop if start is None: start = self._T.Min() p = self._T.SkipSearch( Map._Item( start ) ) while not( p._belo is None ): p = p._belo while not( p._next is None ) and ( p._elem._key < stop ): yield (p._elem._key,p._elem._value) p = p._next
def find_ge(self, k): #SkipSearch s'arrête sur key <= k p = self._T.SkipSearch(Map._Item(k)) #si on arrête sur la sentinelle à droite #il n'existe pas d'élément dont la clé est >= k if p._next is None: return None #sinon, si l'élément de clé k n'existe pas, #le plus grand est le suivant if p._elem._key < k: p = p._next return (p._elem._key, p._elem._value)
def find_gt(self, k): #SkipSearch s'arrête sur key <= k p = self._T.SkipSearch(Map._Item(k)) #si on arrête sur le dernier élément ou la sentinelle à droite #il n'existe pas d'élément dont la clé est > k if p._next is None or p._next._next is None: return None #le plus grand est le suivant #s'il l'élément de clé k existe, le > est le suivant #s'il n'existe pas, le > est aussi le suivant #puisqu'on s'est arrêté sur le premier < p = p._next return (p._elem._key, p._elem._value)
def find_lt(self, k): #SkipSearch s'arrête sur key <= k p = self._T.SkipSearch(Map._Item(k)) #si on arrête sur le premier élément ou la sentinelle à gauche #il n'existe pas d'élément dont la clé est < k if p._prev is None or p._prev._prev is None: return None #sinon, soit on s'est arrêté sur l'élément de clé k #et on doit prendre son précédent (le premier < devant k) #ou si l'élément de clé k n'existe pas, on est sur le #premier élément de clé < k if p._elem._key == k: p = p._prev return (p._elem._key, p._elem._value)
def find_range(self, start, stop): #si start est None, on prend start = Min if start is None: start, v = self.find_min() #on cherche l'élément de clé start #on arrête sur ce dernier ou sur le premier élément < p = self._T.SkipSearch(Map._Item(start)) #si l'élément start n'existe pas, on est sur l'élément < #donc, on prend l'élément suivant if p._elem._key < start: p = p._next #tant qu'il y a des éléments dont la clé est < stop #on les rapporte dans l'itérateur while not (p._next is None) and (p._elem._key < stop): yield (p._elem._key, p._elem._value) p = p._next
def find_le( self, k ): #return (key,value) where key <= k p = self._T.SkipSearch( Map._Item( k ) ) if p._prev is None: return None return (p._elem._key,p._elem._value)
def __init__( self, _MIN_VALUE, _MAX_VALUE ): self._T = SkipList( Map._Item( _MIN_VALUE, None ), Map._Item( _MAX_VALUE, None ) )
def __init__(self, _MIN_KEY=_MIN, _MAX_KEY=_MAX): self._T = SkipList(Map._Item(_MIN_KEY, None), Map._Item(_MAX_KEY, None))