Me gustaría ver la implementación de tu algoritmo en pseudo-código.
¿Lo sacaste de algún libro o sitio en particular? . Esto nos podría
ayudar a encontrar dónde está el problema.
Aclarando que muy poco sé de Python, los síntomas que describes
suenan a que no estás instanciando correctamente los objetos, más
parece que los estuvieras clonando/copiando o creando nuevas
referencias a objetos ya existentes en memoria. Me inclino a creer que
no es un bug del intérprete :-P.
Saludos,
-Óscar.
Ya encontre la causa del problema. En una clase, los campos que
declaras por fuera del constructor, son tomados como miembros de clase
(estaticos). En el caso del B-Tree, todas las operaciones sobre el
arbol se hacian sobre *el mismo* campo `raiz' , por eso los cambios en
una instancia de la clase ArbolB afectaban a todas las demas
instancias. La version corregida del codigo quedaria asi:
---
#! /usr/bin/python
class Arbol :
def __init__(self) :
self.pagina = []
self.hijos = []
self.pad = None
def insertar(self, dato, min, max, padre = None) :
tmp = []
self.pad = padre
if len(self.pagina) == max :
self.pagina.append(dato)
self.pagina.sort()
for i in range(0, max/2) :
tmp.append(self.pagina.pop())
dato = self.pagina.pop()
if self.pad == None :
self.pad = Arbol()
self.pad.pagina = []
self.pad.hijos = []
self.pad.insertar(dato, min, max)
self.pad.hijos.append(self)
arboltmp = Arbol()
arboltmp.pagina = []
arboltmp.hijos = []
for a in len(tmp) :
arboltmp.insertar(tmp.pop(), min, max)
self.pad.hijos.append(arboltmp)
return self.pad
print "Ud quiere insertar el dato " + str(dato) + " pero la
pagina ya esta llena"
else :
self.pagina.append(dato)
self.pagina.sort()
return self
class ArbolB :
def __init__(self, d) :
self.dmax = 2*d
self.dmin = d
self.raiz = Arbol()
def insertar(self, dato) :
self.raiz = self.raiz.insertar(dato, self.dmin, self.dmax)
def __repr__(self) :
return str(self.raiz.pagina)
---
Nos cuentas cuando termines la implementacion de este B-Tree,
-Oscar.
self.pad.pagina = []
self.pad.hijos = []
arboltmp.pagina = []
arboltmp.hijos = []
Como dije en el primer correo, sería bueno mirar los algoritmos que
vas a utilizar, yo veo que hay lugar para algunas mejoras. Por ejemplo,
los parámetros min y max del árbol siempre son los mismos, podrías
hacerlos miembros de instancia de la clase Arbol y pasarlos en el
constructor; no estás pasando el parámetro `padre' en ningún
momento. También creo que la parte de la inserción cuando se ha
llenado una página se podría hacer de manera más sencilla.
Finalmente, considera usar una estructura de datos ordenada, así no
tienes que llamar sort() luego de cada inserción.
-Óscar.