Autor
|
Tema: Formula o algoritmo??? (Leído 11,720 veces)
|
TomaSs
Desconectado
Mensajes: 101
|
Pues la distribución siempre va a ser la misma, no se que más quieres que te explique jeje Es decir, siempre va a seguir este esquema: http://oi47.tinypic.com/2dwcnes.jpgteniendo en cuenta que siempre los nodos de la columna 0 van a ser potencias de 2, es decir, 2, 4, 8, 16, etc, pero el recorrido del arbol siempre se hará como en esta última foto
|
|
« Última modificación: 29 Mayo 2012, 20:07 pm por TomaSs »
|
En línea
|
|
|
|
$Edu$
Desconectado
Mensajes: 1.842
|
Bueno veo a ver si puedo, sino alguien lo hara
|
|
|
En línea
|
|
|
|
79137913
Desconectado
Mensajes: 1.169
4 Esquinas
|
HOLA!!!
Mañana posteo.
GRACIAS POR LEER!!!
|
|
|
En línea
|
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!" "La peor de las ignorancias es no saber corregirlas"
79137913 *Shadow Scouts Team*
|
|
|
TomaSs
Desconectado
Mensajes: 101
|
Bueno pues aquí va algo que he pensado, eso si, muy enrevesado... xddd Es a nivel de programación, ya que algo a nivel matemático no he sido capaz de sacar. • Tenemos el número total de filas: numFilas• Dividimos dicho número de filas entre 2 para sacar el número de nodos de la columna 0: nodosCol0 = numFilas/2• Calculamos el logaritmo en base 2 de nodosCol0 para sacar el número de columnas: numCol = log(nodosCol0)/log(2)• Creamos una matríz [numCol X nodosCol0] que albergue por cada columna, los números de nodo que le pertenecen: Recorremos el arbol de la manera que hay que recorrerlo, desde el nodo 0--> http://oi47.tinypic.com/2dwcnes.jpg Puesto que para cada nodo conocemos su columna almacenamos cada uno en su registro de la matríz correspondiente, quedando la matríz de esta manera una vez recorrido todo el arbol: Col0-->0, 4, 5, 7, 8, 11, 12, 14 Col1-->1, 6, 9, 13 Col2-->2, 10 Col3-->3• Recorremos la matríz para sacar las filas de los nodos que contiene (suponiendo que la matríz comienza en 0): Obtenemos un multiplicador (multi) que, multiplicado por la posición de los nodos en la matríz, nos devolverá la fila que ocupa dicho nodo. De esta manera iremos almacenando las filas de cada nodo en un array, el cual contendrá todos los nodos ordenados por filas y no según el orden indicado inicialmente. for(p=0; p<=numCol; p++){ multi = 2^(p+1); for(j=0; j<nodosCol0; j++){ fila = j * multi + sumatorio(p); array[fila] = matriz[p][j]; } } • El array que obtendremos para el caso del árbol grande que he puesto en la foto sería el siguiente, es decir el orden "por filas" de los nodos: [0, 1, 4, 2, 5, 6, 7, 3, 8, 9, 11, 10, 12, 13, 14]
|
|
« Última modificación: 30 Mayo 2012, 13:37 pm por TomaSs »
|
En línea
|
|
|
|
TomaSs
Desconectado
Mensajes: 101
|
¿Como lo veis? a ver si alguien podría aportar algo más matemático, en caso de que fuera posible
|
|
|
En línea
|
|
|
|
79137913
Desconectado
Mensajes: 1.169
4 Esquinas
|
HOLA!!! Hola, por metodos matematicos no pude resolver el problema (lamentable)... Pero hice un codigo para que diseñe el arbol por si a alguien le sirve. VERSION 5.00 Begin VB.Form Form1 Caption = "Form1" ClientHeight = 3195 ClientLeft = 60 ClientTop = 345 ClientWidth = 4680 LinkTopic = "Form1" ScaleHeight = 3195 ScaleWidth = 4680 StartUpPosition = 3 'Windows Default Begin VB.TextBox Text1 Height = 3090 Left = 150 MultiLine = -1 'True TabIndex = 0 Top = 75 Width = 2715 End End Attribute VB_Name = "Form1" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Private Sub Form_Load() On Error GoTo ERR Show Dim n As Long Dim m As Long Dim suma As Long Dim grado As Long Dim Matriz() As Long Dim FLAG As Boolean Dim CERO As Long n = InputBox("numero de filas//nodos (empezando de 0)") m = InputBox("que numero de nodo busca?") For X = 1 To n suma = suma + 2 ^ X If suma = n Then grado = X Next ReDim Matriz(n, grado) For Y = 0 To grado CERO = -1 For X = 0 To n FLAG = False For Z = 0 To Y - 1 If Matriz(X, Z) = 1 Then FLAG = True Next If FLAG = False Then CERO = X: Exit For Next For X = CERO To n Step 2 ^ (1 + Y) Matriz(X, Y) = 1 Next Next ERR: For X = 0 To n For Y = 0 To grado ASD = ASD & Matriz(X, Y) Next Text1.Text = Text1.Text & vbNewLine & ASD ASD = "" Next End Sub
GRACIAS POR LEER!!!
|
|
|
En línea
|
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!" "La peor de las ignorancias es no saber corregirlas"
79137913 *Shadow Scouts Team*
|
|
|
TomaSs
Desconectado
Mensajes: 101
|
pero por lo que puedo ver, ahí no usas para nada el número de nodo que busca, el m, es porque al final solo hiciste que diseñara el arbol en vez de buscar su fila, no?
de todos modos, no es mal trabajo, aunque me cuesta un poco verlo con tanto bucle anidado haha
|
|
|
En línea
|
|
|
|
79137913
Desconectado
Mensajes: 1.169
4 Esquinas
|
HOLA!!!
Mi idea era diseñar el arbol y luego recorrer la matriz de alguna manera y numerar los nodos, luego simplemente buscar el nodo nro sin requerir la columna.
Aunque con la manera que hago los nodos te puedo decir las filas de los nodos correspondientes a una columna.
GRACIAS POR LEER!!!
|
|
|
En línea
|
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!" "La peor de las ignorancias es no saber corregirlas"
79137913 *Shadow Scouts Team*
|
|
|
$Edu$
Desconectado
Mensajes: 1.842
|
Capas que hay alguna formula para hallarlos, seguramente si, pero si sos vos el que haces esa matriz, es facil recorrerla para saber cual es la fila, asi como dijo 79137913.
Es decir, si tenes una matriz [n][m], lo que haces es recorrer cada elemento hasta encontrar el nodo y ahi mostrar el valor de m y sera la fila. No vale la pena pensar una formula si lo podes hacer asi de facil.
|
|
|
En línea
|
|
|
|
AgnesBlack
Desconectado
Mensajes: 44
|
tarde respondo el mensaje y si hay un metodo es usando el metodo el Binary tree sort o el de busqueda con puntero te dejo un ejemplo de uno que hice principio de año este es con busqueda de puntero que es lo mas eficiente y rapido para buscar dicho nodo que buscas unit uabb2;
{arbol binario de busqueda con punteros}
interface
type
tipoClave=integer;
tipoElemento=record
clave:tipoClave;
end;
tipoPuntero=^tipoNodoArbol;
tipoNodoArbol=record
elemento:tipoElemento;
izquierdo:tipoPuntero;
derecho:tipoPuntero;
end;
tipoArbol=tipoPuntero;
var
raizArbol:tipoArbol;
procedure buscar(nodoArbol:tipoArbol; valorClave:tipoClave; var infoElemento:tipoElemento; var estaEnArbol:boolean);
procedure insertar(var nodoArbol:tipoArbol; infoElemento:tipoElemento);
procedure suprimir(var nodoArbol:tipoArbol; valorClave:TipoClave);
procedure inOrden(nodoArbol:tipoArbol);
procedure preOrden(nodoArbol:tipoArbol);
procedure crearArbol(var nodoArbol:tipoArbol);
function arbolVacio(nodoArbol:tipoArbol):boolean;
implementation
procedure crearArbol(var nodoArbol:tipoArbol);
begin
raizArbol:=nil;
end;
procedure imprime(nodoArbol:tipoElemento);
begin
writeln('elemento ', nodoArbol.clave);
end;
function arbolVacio(nodoArbol:tipoArbol):boolean;
begin
if nodoArbol=nil then arbolVacio:=true
else
arbolVacio:=false;
end;
procedure preOrden(nodoArbol:tipoArbol);
begin
if not ArbolVacio(nodoArbol) then begin
imprime(nodoArbol^.elemento);
preOrden(nodoArbol^.izquierdo);
preOrden(nodoArbol^.derecho);
end
end;
procedure inOrden(nodoArbol:tipoArbol);
begin
if not ArbolVacio(nodoArbol) then begin
inOrden(nodoArbol^.izquierdo);
imprime(nodoArbol^.elemento);
inOrden(nodoArbol^.derecho);
end
end;
procedure buscar(nodoArbol:tipoArbol; valorClave:tipoClave; var infoElemento:tipoElemento; var estaEnArbol:boolean);
var
temp:tipoArbol;
begin
temp:=raizArbol;
estaEnArbol:=false;
while ((not ArbolVacio(temp)) and (not estaEnArbol)) do
if temp^.elemento.clave=valorClave then
estaEnArbol:=true
else
if temp^.elemento.clave>valorClave then
temp:=temp^.izquierdo
else
temp:=temp^.derecho;
if estaEnArbol then infoElemento:=temp^.elemento
end;
procedure insertar(var nodoArbol:tipoArbol; infoElemento:tipoElemento);
var
nuevoNodo:tipoArbol;
temp,anterior:tipoArbol;
claveNueva:tipoClave;
begin
new(nuevoNodo);
nuevoNodo^.izquierdo:=nil;
nuevoNodo^.derecho:=nil;
nuevoNodo^.elemento:=infoElemento;
claveNueva:=infoElemento.clave;
temp:=nodoArbol;
anterior:=nil;
while not ArbolVacio(temp) do begin
anterior:=temp;
if temp^.elemento.clave>claveNueva then
temp:=temp^.izquierdo
else
temp:=temp^.derecho
end;
if ArbolVacio(anterior) then {vacio}
nodoArbol:=nuevoNodo
else
if anterior^.elemento.clave>claveNueva then
anterior^.izquierdo:=nuevoNodo {nuevo nodo a izq del padre}
else
anterior^.derecho:=nuevoNodo
end;
procedure suprimirNodo(var nodoArbol:tipoArbol; temp,anterior:tipoArbol);
var
auxiliar:tipoArbol;
begin
if (temp^.derecho=nil) and (temp^.izquierdo=nil) then
if anterior=nil then
nodoArbol:=nil {xq el arbol solo tenia un nodo!}
else
if anterior^.derecho=temp then {eliminando una hoja}
anterior^.derecho:=nil
else
anterior^.izquierdo:=nil
else
if (temp^.derecho<>nil) and (temp^.izquierdo<>nil) then begin
anterior:=temp;
auxiliar:=temp^.izquierdo;
while auxiliar^.derecho<>nil do begin
anterior:=auxiliar;
auxiliar:=auxiliar^.derecho;
end;
temp^.elemento:=auxiliar^.elemento;
if anterior=temp then
anterior^.izquierdo:=auxiliar^.izquierdo
else
anterior^.derecho:=auxiliar^.izquierdo;
temp:=auxiliar
end
else begin
{el nodo tiene un hijo. debe subir}
if temp^.derecho<>nil then {hijo derecho}
if anterior=nil then
anterior^.derecho:=temp^.derecho
else
if anterior^.derecho=temp then
anterior^.derecho:=temp^.derecho
else
anterior^.izquierdo:=temp^.derecho
else {hijo izquierdo}
if anterior=nil then
anterior^.izquierdo:=temp^.izquierdo
else
if anterior^.derecho=temp then
anterior^.derecho:=temp^.izquierdo
else
anterior^.izquierdo:=temp^.izquierdo;
end;
dispose(temp);
end;
procedure suprimir(var nodoArbol:tipoArbol; valorClave:TipoClave);
var
temp, anterior:tipoArbol;
begin
temp:=nodoArbol;
anterior:=nil;
while temp^.elemento.clave<>valorClave do begin
anterior:=temp;
if temp^.elemento.clave>valorClave then
temp:=temp^.izquierdo
else
temp:=temp^.derecho
end;
suprimirNodo(raizArbol,temp, anterior)
end;
end. ah traves de esto podes modificarlo para buscar el nodo que quieras y eliminarlo
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
programa de la formula general
Programación Visual Basic
|
leahcim
|
2
|
17,441
|
5 Octubre 2005, 18:02 pm
por _Sergi_
|
|
|
Formula resolvente :S:S:S:S
Programación Visual Basic
|
smspuro
|
8
|
14,588
|
14 Agosto 2007, 23:24 pm
por nhaalclkiemr
|
|
|
Formula 1 2007 PC ONLINE!!!!!!!!!
Juegos y Consolas
|
_DADE_
|
0
|
4,504
|
9 Octubre 2007, 21:10 pm
por _DADE_
|
|
|
Logitech Formula EX
Juegos y Consolas
|
tocinator
|
2
|
2,957
|
17 Febrero 2011, 13:33 pm
por tocinator
|
|
|
Fórmula 1!
Foro Libre
|
leostrks
|
0
|
1,859
|
23 Mayo 2011, 14:53 pm
por leostrks
|
|