]> git.llucax.com Git - z.facultad/75.52/treemulator.git/commitdiff
Test del orto :S
authorRicardo Markiewicz <rmarkie@fi.uba.ar>
Tue, 1 Nov 2005 04:00:25 +0000 (04:00 +0000)
committerRicardo Markiewicz <rmarkie@fi.uba.ar>
Tue, 1 Nov 2005 04:00:25 +0000 (04:00 +0000)
src/btree.h
viewer/main.cpp
viewer/new_tree_dialog.cpp
viewer/new_tree_dialog.h
viewer/view_btree.cpp
viewer/view_btree.h
viewer/view_btree_data.cpp

index 2d9ca6a204072cf4eb569b8013a099710773145c..5d05ae43226c6550642c56fe8c5c37ad515638da 100644 (file)
@@ -82,9 +82,7 @@
  *
  * Para saber si hay que romper en dos un nodo, se debe ver si la clave
  * a agregar entra en el espacio libre del nodo encontrado como "lugar
- * de inserción". Ahora, un problema a resolver es cuando se debe
- * juntar nodos, ya que el árbol B este es particular <b>(Preguntar a
- * Cerveto?)</b>.
+ * de inserción".
  *
  * \section page_model_op Operaciones Básicas
  *
  * al algoritmo de borrado en una hoja. De acá en más todo sigue como fue descripto
  * en el borrado en una hoja.
  *
+ * \subsubsection page_model_problema El problema de la Clave Mayor.
+ *
+ * Este es un problema que hemos encontrado en la actual implementación de árbol
+ * B con claves variables.
+ *
+ * Este puede ocurrir únicamente cuando sucede una junta de nodos. Lo que ocurre
+ * se ejemplifica a continuación. Supongamos por un momento que tenemos dos
+ * nodos a unir cuya suma de tamaños ocupados es N. Ahora supongamos que la clave
+ * del padre, que debe ser unida con los nodos es de tamaño M.
+ *
+ * Si por algun caso particular de las claves N+M es mayor al tamaño del bloque,
+ * la junta no podrá ser realizada.
+ *
+ * Hemos detectado este problema seguido en árboles con bloques de 128 o 256, y muy
+ * rara vez en nodos de 512 o superiores, por lo que no hemos tomado medida alguna
+ * más que documentar su existencia.
+ * 
  * \subsection page_model_find Búsqueda de una Clave.
  *
  * Esta operación se realiza haciendo una búsqueda en profundidad en el árbol.
index b4f3c6354666996f5e479066d776651c3451d908..89b66bc278701842b037e8cdfa57765600791022 100644 (file)
@@ -118,7 +118,8 @@ void nuevo_arbol ()
                double paltas = bajas / (double)altas;
 
                int type = d.getKeyType ();
-               tree = Glib::RefPtr<ViewBTree>(new ViewBTree (real_canvas->root(), "test.idx", d.getBlockSize (), type));
+               int atype = d.getTreeType ();
+               tree = Glib::RefPtr<ViewBTree>(new ViewBTree (real_canvas->root(), "test.idx", d.getBlockSize (), atype, type));
                tree->signal_selected ().connect ( sigc::mem_fun (*real_frame, &ViewProperties::ShowItem) );
                if (type == BTree::KEY_FIXED) {
                        std::list<int> lst;
index edb1f5a81eeebd895af191cfb8d51fec92dbe9f7..a2a955276c82f2232892ea88a30a5b18574f7d3d 100644 (file)
@@ -3,22 +3,26 @@
 
 
 NewTreeDialog::NewTreeDialog(): Gtk::Dialog ("Nuevo Arbol", true, true),
-       fixed_key ("Clave Fija"), variable_key ("Clave Variable")
+       fixed_key ("Clave Fija"), variable_key ("Clave Variable"),
+       tree_ident ("Arbol de Indentificación"), tree_class ("Arbol de Clasificacion")
 {
-       table.attach (fixed_key, 0, 1, 0, 1);
-       table.attach (variable_key, 1, 2, 0, 1);
+       table.attach (tree_ident, 0, 1, 0, 1);
+       table.attach (tree_class, 1, 2, 0, 1);
+
+       table.attach (fixed_key, 0, 1, 1, 2);
+       table.attach (variable_key, 1, 2, 1, 2);
 
        label_block.set_label ("Tamaño de Bloque : ");
-       table.attach (label_block, 0, 1, 1, 2, Gtk::FILL|Gtk::SHRINK, Gtk::SHRINK, 8, 8);
-       table.attach (entry_block, 1, 2, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 8, 8);
+       table.attach (label_block, 0, 1, 2, 3, Gtk::FILL|Gtk::SHRINK, Gtk::SHRINK, 8, 8);
+       table.attach (entry_block, 1, 2, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 8, 8);
 
        label_count.set_label ("Cantidad a insertar : ");
-       table.attach (label_count, 0, 1, 2, 3, Gtk::FILL|Gtk::SHRINK, Gtk::SHRINK, 8, 8);
-       table.attach (entry_count, 1, 2, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 8, 8);
+       table.attach (label_count, 0, 1, 3, 4, Gtk::FILL|Gtk::SHRINK, Gtk::SHRINK, 8, 8);
+       table.attach (entry_count, 1, 2, 3, 4, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 8, 8);
 
        label_dels.set_label ("Cantidad a eliminar : ");
-       table.attach (label_dels, 0, 1, 3, 4, Gtk::FILL|Gtk::SHRINK, Gtk::SHRINK, 8, 8);
-       table.attach (entry_dels, 1, 2, 3, 4, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 8, 8);
+       table.attach (label_dels, 0, 1, 4, 5, Gtk::FILL|Gtk::SHRINK, Gtk::SHRINK, 8, 8);
+       table.attach (entry_dels, 1, 2, 4, 5, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 8, 8);
 
        get_vbox ()->add (table);
 
@@ -28,6 +32,10 @@ NewTreeDialog::NewTreeDialog(): Gtk::Dialog ("Nuevo Arbol", true, true),
        Gtk::RadioButton::Group group = fixed_key.get_group();
        fixed_key.set_group (group);
        variable_key.set_group (group);
+
+       Gtk::RadioButton::Group group1 = tree_ident.get_group();
+       tree_ident.set_group (group);
+       tree_class.set_group (group);
        show_all ();
 }
 
@@ -55,3 +63,11 @@ int NewTreeDialog::getKeyType ()
        return BTree::KEY_VARIABLE;
 }
 
+int NewTreeDialog::getTreeType ()
+{
+       if (tree_ident.get_active ())
+               return BTree::TYPE_IDENTIFICACION;
+
+       return BTree::TYPE_CLASIFICACION;
+}
+
index 1edb27c2240c0f22721b4cd51917d6c2d142c08b..63a5e561e4e838c149604b49d010ad13f3f16bea 100644 (file)
@@ -13,16 +13,20 @@ class NewTreeDialog : public Gtk::Dialog {
                uint getDels ();
                uint getBlockSize ();
                int getKeyType ();
+               int getTreeType ();
        private:
                Gtk::Table table;
                Gtk::Label label_count;
                Gtk::Label label_block;
                Gtk::Label label_dels;
+               Gtk::Label label_tt;
                Gtk::Entry entry_count;
                Gtk::Entry entry_dels;
                Gtk::Entry entry_block;
                Gtk::RadioButton fixed_key;
                Gtk::RadioButton variable_key;
+               Gtk::RadioButton tree_ident;
+               Gtk::RadioButton tree_class;
 };
 
 #endif
index 353fd2bb59361aea736bb178f1d12ee5400d2139..6a1fd165563557bd98717013c28f3d4c53bec63d 100644 (file)
@@ -7,8 +7,8 @@ double ViewBTree::byte_to_pixels = 0;
 double ViewBTree::node_width = 0;
 double ViewBTree::node_height = 0;
 
-ViewBTree::ViewBTree (Canvas::Group *parent, std::string filename, uint block_size, int type):Canvas::Group (*parent, 0, 0),
-       BTree (filename, block_size, BTree::TYPE_IDENTIFICACION, type)
+ViewBTree::ViewBTree (Canvas::Group *parent, std::string filename, uint block_size, int tree_type, int type):Canvas::Group (*parent, 0, 0),
+       BTree (filename, block_size, tree_type, type)
 {
        /* Cada bytes lo hago de 5 units de ancho */
        node_width = 4 * block_size;
index bb955bd5dc88f567fdc1fc9987cd95c907d37198..894bf5d03a49dd2c124436b97ad790166e79a738 100644 (file)
@@ -14,7 +14,7 @@ class ViewNode;
 
 class ViewBTree : public Canvas::Group, public BTree {
        public:
-               ViewBTree (Canvas::Group *parent, std::string filename, uint block_size, int type);
+               ViewBTree (Canvas::Group *parent, std::string filename, uint block_size, int tree_type, int type);
 
                void Clear ();
                void HighliteKey (Clave &k);
index e1df3c2a69b5b304a57ff5ca48c45ba75117fb1e..2d4a753bb53771204877be50979b1229976a9d28 100644 (file)
@@ -12,8 +12,6 @@ ViewBTreeData::ViewBTreeData (BTreeData *data, Canvas::Group *parent, double x1,
 
 void ViewBTreeData::init (Canvas::Group *parent)
 {
-       double w = property_x2() - property_x1();
-       double h = property_y2() - property_y1();
 }
                
 bool ViewBTreeData::on_event (GdkEvent *p1)