Arborescence de segments retardée en Python (demande de débogage)

Veuillez me dire les points d'amélioration si vous le souhaitez.

Section minimale, mise à jour de section

#####segfunc#####
def segfunc(x, y):
    return min(x, y)
#################

#####ide_ele#####
ide_ele = 2**31 - 1
#################

class LazySegmentTree:
    """
    init(init_val, ide_ele):Array init_Initialiser avec val O(N)
    update(l, r, x):section[l, r)Vers x O(logN)
    query(l, r):section[l, r)Renvoie le segfunc de O(logN)
    """
    def __init__(self, init_val, segfunc, ide_ele):
        """
        init_val:Valeur initiale du tableau
        segfunc:Opération que vous souhaitez créer une section
        ide_ele:Élément d'unité
        num:Puissance minimale de 2 supérieure ou égale à n
        data:Tableau de valeurs(1-index)
        lazy:Tableau de retard(1-index)
        """
        n = len(init_val)
        self.segfunc = segfunc
        self.ide_ele = ide_ele
        self.num = 1 << (n - 1).bit_length()
        self.data = [ide_ele] * 2 * self.num
        self.lazy = [None] * 2 * self.num
        #Définissez la valeur du tableau sur la feuille
        for i in range(n):
            self.data[self.num + i] = init_val[i]
        #Construire
        for i in range(self.num - 1, 0, -1):
            self.data[i] = self.segfunc(self.data[2 * i], self.data[2 * i + 1])

    def gindex(self, l, r):
            """
Trouvez la section à propager
            lm:Intervalle fermé maximal à gauche qui doit être propagé
            rm:Section maximale ouverte à droite qui doit se propager
            """
            l += self.num
            r += self.num
            lm = l >> (l & -l).bit_length()
            rm = r >> (r & -r).bit_length()
         
            while r > l:
                if l <= lm:
                    yield l
                if r <= rm:
                    yield r
                r >>= 1
                l >>= 1
            while l:
                yield l
                l >>= 1

    def propagates(self, *ids):
        """
Retarder le traitement de la propagation
        ids:La section à propager
        """
        for i in reversed(ids):
            v = self.lazy[i]
            if v is None:
                continue
            self.lazy[2 * i] = v
            self.lazy[2 * i + 1] = v
            self.data[2 * i] = v
            self.data[2 * i + 1] = v
            self.lazy[i] = None

    def update(self, l, r, x):
        """
section[l, r)Mettre à jour la valeur de à x
        l, r: index(0-index)
        x: update value
        """
        *ids, = self.gindex(l, r)
        self.propagates(*ids)
        l += self.num
        r += self.num
        while l < r:
            if l & 1:
                self.lazy[l] = x
                self.data[l] = x
                l += 1
            if r & 1:
                self.lazy[r - 1] = x
                self.data[r - 1] = x
            r >>= 1
            l >>= 1
        for i in ids:
            self.data[i] = self.segfunc(self.data[2 * i], self.data[2 * i + 1])


    def query(self, l, r):
        """
        [l, r)Obtenez le segfunc
        l: index(0-index)
        r: index(0-index)
        """
        *ids, = self.gindex(l, r)
        self.propagates(*ids)

        res = self.ide_ele

        l += self.num
        r += self.num
        while l < r:
            if l & 1:
                res = self.segfunc(res, self.data[l])
                l += 1
            if r & 1:
                res = self.segfunc(res, self.data[r - 1])
            l >>= 1
            r >>= 1
        return res

Exemple d'utilisation

a = [1, 2, 3, 4, 5]
seg = LazySegmentTree(a, segfunc, ide_ele)
seg.update(1, 3, 0)
print(seg.(query(0, 3)))

Section minimum, ajout de section

#####segfunc#####
def segfunc(x, y):
    return min(x, y)
#################

#####ide_ele#####
ide_ele = 2**31 - 1
#################

class LazySegmentTree:
    """
    init(init_val, ide_ele):Array init_Initialiser avec val O(N)
    add(l, r, x):section[l, r)Ajouter x à O(logN)
    query(l, r):section[l, r)Renvoie le segfunc de O(logN)
    """
    def __init__(self, init_val, segfunc, ide_ele):
        """
        init_val:Valeur initiale du tableau
        segfunc:Opération que vous souhaitez créer une section
        ide_ele:Élément d'unité
        num:Puissance minimale de 2 supérieure ou égale à n
        data:Tableau de valeurs(1-index)
        lazy:Tableau de retard(1-index)
        """
        n = len(init_val)
        self.segfunc = segfunc
        self.ide_ele = ide_ele
        self.num = 1 << (n - 1).bit_length()
        self.data = [ide_ele] * 2 * self.num
        self.lazy = [0] * 2 * self.num
        #Définissez la valeur du tableau sur la feuille
        for i in range(n):
            self.data[self.num + i] = init_val[i]
        #Construire
        for i in range(self.num - 1, 0, -1):
            self.data[i] = self.segfunc(self.data[2 * i], self.data[2 * i + 1])

    def gindex(self, l, r):
            """
Trouvez la section à propager
            lm:Intervalle fermé maximal à gauche qui doit être propagé
            rm:Section maximale ouverte à droite qui doit se propager
            """
            l += self.num
            r += self.num
            lm = l >> (l & -l).bit_length()
            rm = r >> (r & -r).bit_length()

            while r > l:
                if l <= lm:
                    yield l
                if r <= rm:
                    yield r
                r >>= 1
                l >>= 1
            while l:
                yield l
                l >>= 1

    def propagates(self, *ids):
        """
Retarder le traitement de la propagation
        ids:La section à propager
        """
        for i in reversed(ids):
            v = self.lazy[i]
            if not v:
                continue
            self.lazy[2 * i] += v
            self.lazy[2 * i + 1] += v
            self.data[2 * i] += v
            self.data[2 * i + 1] += v
            self.lazy[i] = 0

    def add(self, l, r, x):
        """
section[l, r)Ajouter x à la valeur de
        l, r: index(0-index)
        x: additional value
        """
        *ids, = self.gindex(l, r)
        l += self.num
        r += self.num
        while l < r:
            if l & 1:
                self.lazy[l] += x
                self.data[l] += x
                l += 1
            if r & 1:
                self.lazy[r - 1] += x
                self.data[r - 1] += x
            r >>= 1
            l >>= 1
        for i in ids:
            self.data[i] = self.segfunc(self.data[2 * i], self.data[2 * i + 1]) + self.lazy[i]


    def query(self, l, r):
        """
        [l, r)Obtenez le segfunc
        l: index(0-index)
        r: index(0-index)
        """
        *ids, = self.gindex(l, r)
        self.propagates(*ids)

        res = self.ide_ele

        l += self.num
        r += self.num
        while l < r:
            if l & 1:
                res = self.segfunc(res, self.data[l])
                l += 1
            if r & 1:
                res = self.segfunc(res, self.data[r - 1])
            l >>= 1
            r >>= 1
        return res

Les références

Version non récursive du mémo d'implémentation de l'arborescence des segments d'évaluation retardée

Recommended Posts

Arborescence de segments retardée en Python (demande de débogage)
Algorithme (arborescence de segments) en Python (s'entraîner)
Requête HTTP en Python
Compilateur en Python: arborescence de syntaxe PL / 0
Implémentation Python de l'arborescence de segments non récursive
[Python] Afficher le bloc de données dans la console de débogage VScode
Exécution de l'étape de débogage en Python (Bottle, Intellij)
Je ne peux pas déboguer les scripts python dans Eclipse
Dessinez une structure arborescente en Python 3 à l'aide de graphviz
Manipuler XML avec des espaces de noms en Python (arbre des éléments)
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
Compilateur en Python: Arbre de syntaxe abstraite PL / 0 (AST)
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
2. Analyse multivariée expliquée dans Python 7-3. Arbre de décision [arbre de retour]
2. Analyse multivariée décrite dans Python 7-1. Arbre de décision (scikit-learn)
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python