Segunda Parte PHP
Segunda Parte PHP
1 introduccion a php
Está basado en herramientas de software libre (Apache, MySQL, etc.), es decir, no hay
que pagarlas; además proporciona los mecanismos para poder trabajar con casi
cualquier base de datos (sea software libre o no) y servidor web.
Cuando pedimos a nuestro servidor web una página PHP, que no es sino un programa
PHP que genera una página HTML, el servidor le pasa la página al interprete PHP y es
el resultado lo que se le envía al cliente.
El interprete de PHP permite ser compilado y utilizado como un CGI. De esta forma
cualquier servidor web que soporte CGI podría ejecutar páginas PHP. Nosotros en este
tutorial lo vamos a usar como un módulo de Apache, la ventaja es que obtenemos una
velocidad de ejecución bastante superior, asi como un consumo menor de recursos. En
el caso de tener PHP instalado como un módulo del servidor Apache, este hereda todas
las características del servidor.
PHP se contruyó para ser utilizado conjuntamente con la base de datos MySQL, pero
actualmente soporta la mayoría de bases de datos (Oracle, Informix, ODBC, SQl Server,
etc.). Nosotros utilizaremos MySQL, porque la interacción entre PHP y MySQL
funciona a la perfección y además es software libre.
Debido a que PHP has sido diseñado de forma modular y sencilla, hay multitud de
bibliotecas entre ellas destacamos el soporte para:
Los scripts PHP los puedes colocar en cualquier parte de tu código HTML siempre entre
los marcadores <?php ?> . Para incluir un archivo php en un fichero aparte del html
puedes usar:
include("nombreFichero.php");
require("nombreFichero.php");
include_once("nombreFichero.php");
require_once("nombreFichero.php");
Un ejemplo seria.
Está escrito tanto para usuarios que trabajen con PHP para programadores que
habitualmente lo hacen. Es apropiado para todos aquellos que confíen en el lenguaje
PHP a la hora de construir un sitio Web con contenido dinámico, algo que está más allá
de las capacidades del HTML puro ya que las aplicaciones son mas factibles.
PHP conocido como una tecnología de código abierto que resulta muy útil para diseñar
de forma rápida y eficaz aplicaciones Web dirigidas a bases de datos. PHP es un potente
lenguaje de secuencia de comandos diseñado específicamente para permitir a los
programadores crear aplicaciones en Web con distintas prestaciones de forma rápida.
MySQL es una base de datos rápida y fiable que se integra a la perfección con PHP y
que resulta muy adecuada para aplicaciones dinámicas basadas en Internet.
Como todo lenguaje de programación, PHP puede trabajar con una serie de tipos de
datos básicos. En concreto los tipos de datos admitidos son:
- Números enteros: los enteros pueden ser dados tanto en base decimal como en
base octal o hexadecimal ( un 0 inicial indica que el valor esta representado en octal, un
0x indica que es hexadecimal.
- Ejemplos de números en base 10 : 45 -142 783
- Ejemplos de numero en octal: 0123 (equivale a 83)
- Ejemplos de números en hexadecimal: 0×12 (equivale a 18)
- Números reales: Los números reales se pueden dar en dos formatos; como parte
entera y parte decimal, usando el punto como separador, o en notación científica.
Ejemplos: 14.67 -76.0023 1.4e3 -78.5e-4
- Cadenas de Caracteres: Las cadenas de caracteres pueden ser dadas en dos
formatos usando comillas dobles o usando comillas simples. El uso de una u otra forma
de delimitación afecta a la forma en la que se tratan las posibles variables que puedan
haber dentro de la propia cadena.
Ejemplo: “Casablanca”, ‘cantando bajo la lluvia’
- Objetos: finalmente PHP admite también la posibilidad de crear objetos y realizar
acción con ellos. Mediante el uso de objetos se puede entender como una misma entidad
los datos y las acciones que se realizan con ellos. Esta es la base de la programación
orientada a objetos.
PHP es un lenguaje de programación de uso general de código del lado del servidor
originalmente diseñado para el desarrollo web de contenido dinámico. Fue uno de los
primeros lenguajes de programación del lado del servidor que se podían incorporar
directamente en el documento HTML en lugar de llamar a un archivo externo que
procese los datos. El código es interpretado por un servidor web con un módulo de
procesador de PHP que genera la página Web resultante. PHP ha evolucionado por lo
que ahora incluye también una interfaz de línea de comandos que puede ser usada en
aplicaciones gráficas independientes. Puede ser usado en la mayoría de los servidores
web al igual que en casi todos los sistemas operativos y plataformas sin ningún costo.
Fue creado originalmente por Rasmus Lerdorf en 1995. Actualmente el lenguaje sigue
siendo desarrollado con nuevas funciones por el grupo PHP.2 Este lenguaje forma parte
del software libre publicado bajo la licencia PHP, que es incompatible con la Licencia
Pública General de GNU debido a las restricciones del uso del término PHP.
a. Etiqueta form.
id: indica un nombre del formulario para que pueda ser personalizado mediante
CSS.
action: define el destino a donde irán los datos del formulario en HTML. En
nuestro ejemplo el destino será un archivo llamado “enviado.php”.
method: indica la forma en la que será enviado el formulario en HTML.
b. Etiqueta fieldset.
Esta etiqueta es de uso opcional y se utiliza para agrupar elementos en común dentro de
un mismo formulario en HTML. Se suele utilizar junto a la etiqueta legend que le da
un título al conjuntos de elementos definidos en el fieldset.
c. Etiqueta label.
Esta etiqueta se utiliza para definir el nombre visible de cada uno de los campos del
formulario en HTML.
d. Etiqueta input.
Esta etiqueta corresponde a los campos del formulario que necesitamos para su
funcionamiento. Esta está definida por:
id: indica un nombre único del campo para que pueda ser personalizado
mediante CSS.
name: indica el nombre único del campo en el formulario en HTML y este
nombre es el que nos permitirá realizar el envío de los datos de cada campo.
type: indica el tipo de campo y la acción que tendrá dentro del formulario en
HTML. Existen varios tipos de campos input en un formulario:
o text: para agregar una cadena de caracteres ya sean letras o números.
o hidden: indica que será un campo oculto para el envío de datos que no
será visible para el usuario.
o password: se utiliza para los formularios de registro y los caracteres
escritos serán mostrados en forma de asteriscos o puntos.
o checkbox: casillas de verificación.
o submit: este type se le asigna a un campo input para realizar el envío del
formulario en HTML. También existe el type reset que es para borrar
todos los campos del formulario si no se desea realizar el envío.
e. Otras etiquetas.
Además de las etiquetas anteriormente mencionadas para nuestro ejemplo existen otras
etiquetas que se usan frecuentemente en los formularios. Los más comunes son:
select: este campo se configura con varias opciones para ser seleccionadas de
una lista.
textarea: este campo es utilizado para escribir comentarios largos como el que
utiliza WordPress en sus artículos.
1 <html>
2 <head>
3 <title>Formulario de Ejemplo</title>
4 </head>
5
6 <body>
7 <form id="formulario" action="enviado.php" method="post">
8 <fieldset>
9 <legend>Formulario de Ejemplo</legend>
10 <label>Nombre</label>
11 <input id="campo1" name="nombre" type="text" />
12 <label>Email</label>
quedándonos así:
1 <html>
2 <head>
3 <title>Formulario de Ejemplo</title>
<link rel="stylesheet" type="text/css" href="formulario.css"
4
media="all" />
5 </head>
6
7 <body>
8 <form id="formulario" action="enviado.php" method="post">
9 <fieldset>
10 <legend>Formulario de Ejemplo</legend>
11 <label>Nombre</label>
12 <input id="campo1" name="nombre" type="text" />
13 <label>Email</label>
14 <input id="campo2" name="email" type="text" />
<input id="campo3" name="enviar" type="submit"
15
value="Enviar" />
16 </fieldset>
17 </form>
18 </body>
19 </html>
1 <?php
2 if($_POST["nombre"] && $_POST["email"] != ""){
3 $de = $_POST["nombre"];
4 $destino = "tuemail";
5 $asunto = "FORMULARIO DE EJEMPLO";
6 $mensaje .= "FORMULARIO."."\n";
7 $mensaje .= "\n";
8 $mensaje .= "NOMBRE: " . utf8_decode($_POST["nombre"]) ."\n";
9 $mensaje .= "\n";
$mensaje .= "EMAIL: " .
10
utf8_decode($_POST["email"]) ."\n";
11 $emailheader = "From: LO QUE TU QUIERAS <tuemail>\r\n";
mail($destino, $asunto, $mensaje, $emailheader) or die ("Lo
12 sentimos, tu solicitud no ha sido enviada.<br/>Intentelo de
nuevo.");
echo utf8_decode(utf8_encode('Tu consulta ha sido enviada
13
correctamente.'));
14 } else {
15 if($_POST["nombre"] == ""){
16 echo utf8_encode ('Por favor, indica tu nombre.');
17 exit; }
18 if($_POST["email"] == ""){
19 echo utf8_encode ('Por favor, indica un email de contacto.');
20 exit; }
21 }
22 ?>
y este será el archivo encargado de recibir los datos y enviarlos a un correo electrónico.
La programación en PHP para este formulario ha sido diseñada para que tanto el campo
“Nombre” como el campo “Email” sean obligatorios por lo que al intentar enviar el
formulario en HTML sino se rellenan estos campos aparecerá un mensaje donde
indica que deben rellenarlos y no se enviará.
En el código PHP hay una línea, $destino = “tuemail”; donde debes sustituir tuemail por
el email al que quieres que te llegue el formulario. Hay otra línea, $emailheader =
“From: LO QUE TU QUIERAS \r\n”;, donde debes cambiar LO QUE TU QUIERAS
por un nombre cualquiera que se relacione con tu formulario y tuemail por el mismo
email al que quieres que te llegue el formulario.
En este artículo hemos visto mediante 3 sencillos archivos como crear un formulario
en HTML, como personalizarlo y una parte de programación para su envío. También se
pueden utilizar otras tecnologías de programación como ASP para el envío de datos
mediante un formulario. Queda de parte del lector investigar un poco más si desea
profundizar más en la creación de formularios en HTML.
los datos que el usuario introduzca en un formulario de una pagina web puede ser
transferidos al servidor para su procesamiento con dos metodos diferentes :
-metodo get: los datos son rmviados dentro de l url de localización del destino .
-metodos post: los datos son enviados de manera “invisible” para el usuario,
haciendo uso del protocolo http y en un encabezado in dependien te.
En el caso de que los datos deban ser transferidos por correo eléctrico , es
obligatorio el uso del método POST.
2.2.4. Transferencia de datos al script desde el url
Hay dos métodos para pasar variables de una página a otra: utilizando un formulario o
mediante la URL. Cada uno tiene una manera de recuperar los datos en la página de
destino, el primero mediante el uso de la variable global $_POST, el segundo mediente
$_GET.
Utilizaremos el primer método cuando tengamos que usar un formulario para que el
usuario introduzca algún valor, como por ejemplo en un formulario de búsqueda o en
uno de contacto que permita enviar un mensaje. Utilizaremos el segundo cuando sean
variables que no dependan en absoluto de la interacción del usuario, sino que
sencillamente queramos transferir de una página a otra.
Para recuperar las variables en la página dedestino bastará utilizar la variable global $_POST:
1 <?php
2 $v1 = $_POST['variable1'];
3 $v2 = $_POST['variable2'];
4 ?>
En la página de origen construiremos un enlace a la página de destino que incluya las variables
a transferir, de la siguiente manera:
<a href="http://url.pagina.destino/?
1
variable1=valor1&variable2=valor2">Enlace a página de destino</a>
Para recuperar las variables en la página dedestino bastará utilizar la variable global $_GET:
1 <?php
2 $v1 = $_GET['variable1'];
3 $v2 = $_GET['variable2'];
4 ?>
2.2.5 cookies
Una cookie (o galleta informática) es una pequeña información enviada por un sitio
web y almacenada en el navegador del usuario, de manera que el sitio web puede
consultar la actividad previa del usuario.
Originalmente, sólo podían ser almacenadas por petición de un CGI desde el servidor,
pero Netscape dio a su lenguaje Javascript la capacidad de introducirlas directamente
desde el cliente, sin necesidad de CGIs. En un principio, debido a errores del navegador,
esto dio algunos problemas de seguridad. Las cookies pueden ser borradas, aceptadas o
bloqueadas según desee, para esto sólo debe configurar convenientemente el navegador
web.
Las cookies son utilizadas habitualmente por los servidores web para diferenciar
usuarios y para actuar de diferente forma dependiendo de éstos. Las cookies se
inventaron para ser utilizadas en una cesta de la compra virtual, que actúa como
dispositivo virtual en el que el usuario va "colocando" los elementos que desea adquirir,
de forma que los usuarios pueden navegar por el sitio donde se muestran los objetos a la
venta y añadirlos y eliminarlos de la cesta de la compra en cualquier momento. Las
cookies permiten que el contenido de la cesta de la compra dependa de las acciones del
usuario.
Otros sitios web utilizan las cookies para personalizar su aspecto según las preferencias
del usuario. Los sitios que requieren identificación a menudo ofrecen esta característica,
aunque también está presente en otros que no la requieren. La personalización incluye
tanto presentación como funcionalidad. Por ejemplo, las páginas de Wikipedia permiten
a los usuarios identificados elegir un estilo de presentación a su gusto; el motor de
búsqueda de Google permite a los usuarios (incluso a los no registrados) decidir cuántos
resultados de búsqueda quieren ver en cada página.
ARCHIVOS Y DIRECTORIOS
/dev Contienen todos los archivos de acceso a dispositivos. Linux trata cada
dispositivo (terminales, discos, impresoras, etc.) como si fuera un archivo
especial.
/tmp Directorio temporal que puede usar cualquier usuario como directorio
transitorio.
Puede utilizar un comando de datos para ejecutar un procedimiento de base de datos que
devuelva un conjunto de resultados de sólo lectura; es decir, puede ejecutar una
instrucción SQL Select o un procedimiento almacenado que contenga una instrucción
Select. Es similar a lo que sucede cuando rellena un conjunto de datos con un adaptador
de datos, excepto que el conjunto de resultados se le devuelve directamente.
Si no tiene otras razones para utilizar un conjunto de datos (por ejemplo, desea
compartir los datos con otro componente o aplicación), puede ser más rápido utilizar un
comando de datos para obtener un conjunto de resultados directamente en vez de
cargarlos en el conjunto de datos. Para obtener más información acerca de las ventajas
relativas de los conjuntos de datos con respecto a los comandos de datos, vea
Recomendaciones sobre la estrategia de acceso a datos.
Con un comando de datos puede devolver cero o más registros. Por tanto, podría utilizar
un comando de datos para realizar las siguientes acciones:
Los conjuntos de resultados se devuelven mediante un lector de datos (un objeto del tipo
OleDbDataReader, SqlDataReader, OdbcDataReader o OracleDataReader). A
continuación, puede recorrer este objeto, para extraer registros individuales del conjunto
de resultados. Ya que el lector de datos proporciona acceso a los datos sólo hacia
delante y de sólo lectura, es muy rápido.
Los que acostumbramos a utilizar MySQL no estamos familiarizados con esta sintaxis
de preparar y ejecutar consultas que tiene el driver de Microsoft para PHP.
Al preparar una instrucción que usa variables como parámetros, las variables se enlazan
a la instrucción. Eso significa que si se actualizan los valores de las variables, la
próxima vez que se ejecute la instrucción se ejecutará con los valores de parámetros
actualizados.
4. ASP.NET AJAX
Mediante componentes del lado del cliente y del servidor, ASP.NET AJAX permite al
desarrollador crear aplicaciones web en ASP.NET 2.0 que pueden actualizar datos en la
página web sin un recarga completa de la misma. La tecnología clave que permite esta
funcionalidad es el objeto XMLHttpRequest, junto con Javascript y DHTML.
ASP.NET AJAX fue liberado en enero de 2007 después de un largo periodo de pruebas.
Fue subsecuentemente incluido con la versión 3.5 del .NET Framework, que fue
liberada junto con Visual Studio 2008 en noviembre de 2007.
Aparte de saber HTML y JavaScript, el primer objeto que debemos conocer para hacer
aplicaciones AJAX es XMLHttpRequest.
Si has utilizado alguna vez las bibliotecas MSXML con Visual Basic 6.0 o ASP 3.0 es
probable que ya lo conozcas. Aunque en el caso de Internet Explorer se sigue usando
este objeto ActiveX en el resto de los navegadores (Firefox, Opera, Safari...) este objeto
forma parte ya de las clases nativas del navegador.
Su utilidad básica es la de enviar peticiones (tanto GET como POST) a Urls mediante el
protocolo HTTP.
Los métodos y propiedades básicos que debemos conocer son los siguientes(los
corchetes indican parámetros opcionales):
Hay algunas cosas más pero con estas es más que suficiente para el 99% de los casos.
Vale por el momento. Quédate con esta idea. En la próxima entrega vamos a ver el uso
en la práctica de este objeto. Haremos una función genérica que nos sirva para obtener
cualquier URL remota y que funcione tanto en Internet Explorer como en los demás
navegadores del mercado.
Las aplicaciones web ASP.NET no se limitan a los lenguajes y las herramientas basados
en servidor. Puede incluir ECMAScript (JavaScript o JScript) en sus páginas web
ASP.NET para crear funcionalidad enriquecida basada en explorador. ASP.NET
dispone de una amplia gama de características para la compatibilidad con los scripts de
cliente.
En este tema se proporciona información general sobre las opciones para agregar script
de cliente a las páginas web ASP.NET. Contiene las siguientes secciones:
Escenarios
Incluir script de cliente personalizado en páginas ASP.NET
# responseText: Con esta propiedad se reciben los datos de la siguiente manera. Cuando el estado del
proceso esté en el nivel 4
<?php vari=objetus.responseText
<?php window.alert(vari)
Esto es lo que usamos en nuestro primer ejemplo, aqui cuando el proceso llega a nivel 4 creamos un alert
con los datos que nos a enviado el procesador.
# responseXML:
Con esta propiedad el procesador nos devuelve los datos como XML y debemos recorrerlo mediante las
funciones del DOM (getEementsByTagName, etc).
<?php vari=objetus.responseXML
Guardamos el documento devuelto en la variable vari para luego recorrerla,en el caso para nuestro
ejemplo el documento XML del procesador tendrá la siguente estructura:
<serv>
<ip>ip</ip>
<uri>uri </uri>
<date>date</date>
</serv>
Entonces mostraremos:
<?php window.alert(_ip+"\n"+_uri+"\n"+_date)
Ejemplo 1-b
cliente
}
_objetus.send(null);
return
}
</script>
<input type="button" value="con rexponseText"
onclick="primer_tope();"><br>
<input type="button" value="con rexponseXML"
onclick="primer_topeXML();">
procesador
<?php <?php
if(isset($_GET['funcion']))
{
$_valor=$_GET['funcion'];
if($_valor=="pt")
{
$_pt="Tu ip: ".$_SERVER['REMOTE_ADDR']."\n";
$_pt.="request_uri:";
$_pt.=htmlspecialchars($_SERVER['REQUEST_URI'])."\n";
$_pt.="date(): ".date("d-m-Y : H-i-s")."\n";
echo $_pt;
}
elseif ($_valor=="ptxml")
{
$_xml="<?xml version=\"1.0\" standalone=\"yes\"?>\n";
$_xml.="<serv>\n";
$_xml.="<ip>Tu ip: ".$_SERVER['REMOTE_ADDR']."</ip>\n";
$_xml.="<uri>request_uri:";
$_xml.=htmlspecialchars($_SERVER['REQUEST_URI']);
$_xml.="</uri>\n";
$_xml.="<date>".date("d-m-Y : H-i-s")."</date>\n";
$_xml.="</serv>\n";
//mandamemos cabeceras identificando al documento
//como un documento XML
header('Content-Type: text/xml');
echo $_xml;
}
else
{
echo "No enviaste ningun valor ACEPTABLE";
}
}
else
{
echo "No se a enviado valor alguno de peticion";
}
?>
Entonces mostraremos:
<?php window.alert(_ip+"\n"+_uri+"\n"+_date)
Ejemplo 1-b
cliente
<?php target="nombreid";
document.getElementById(target).innerHTML = _objetus.responseText;
No tengo una idea clara a como llamar por su tag name, porfavor pido la ayuda de alguien que sepa esto
Ejemplo 2
Solo cambiará nuestro cliente.
El alojamiento web (en inglés web hosting) es el servicio que provee a los usuarios de
Internet un sistema para poder almacenar información, imágenes, vídeo, o cualquier
contenido accesible vía web. Es una analogía de "hospedaje o alojamiento en hoteles o
habitaciones" donde uno ocupa un lugar específico, en este caso la analogía alojamiento
web o alojamiento de páginas web, se refiere al lugar que ocupa una página web, sitio
web, sistema, correo electrónico, archivos etc. en internet o más específicamente en un
servidor que por lo general hospeda varias aplicaciones o páginas web.
Se puede definir como "un lugar para tu página web o correos electrónicos", aunque
esta definición simplifica de manera conceptual el hecho de que el alojamiento web es
en realidad espacio en Internet para prácticamente cualquier tipo de información, sea
archivos, sistemas, correos electrónicos, videos etc.
5.2 dominio
o también como
Hay varios sitios de Internet a los que recurrir para publicar sus páginas gratis.
Estos no le cobran, pero se benefician del tráfico virtual que atraigan sus páginas.
Generalmente su beneficio provendrá de la publicidad que insertan en sus páginas
Web. Hay mas razones para desechar las publicaciones sin registro propio en
Internet. Veamos.
Si el sitio del tercero desaparece, o este impide el acceso a sus archivos, nadie
puede visitar sus paginas Web con la dirección anteriormente asignada. Aunque se
cambie al sitio de otro tercero o decida registrar tardíamente un dominio e incluir
allí su sitio, perderá todos los accesos en los buscadores y los visitantes virtuales
que llamen a sus direcciones Web anteriores no las accederán. Esto porque su
dirección http// será distinta al no incluir el dominio del sitio anterior.
Por supuesto hay situaciones de excepción por los cuales se pueda tener un sitio en
Internet sin su propio registro de propiedad. Eso puede hacerse y puede ser
absolutamente gratuito. Pero si su propósito es comercial, muy probablemente no
le será conveniente funcionar sin un acceso propio a Internet. Si puede realizar un
contrato para proteger sus derechos, tal vez el no operar con un dominio propio le
sería conveniente comercialmente. Pero eso le traerá un costo por lo general y sus
riesgos de pérdida al acceso a su sitio, aunque estén protegidos legalmente,
también pueden materializarse con un daño serio a su negocio.
http://www.icann.org/en/registrars/accredited-list.html
Los registradores autorizados para los códigos de máximo nivel reservados a países
(con los códigos con dos letras tales como .cl .ar .br. .mx .co .es, etc.,) están en
Internet Assigned Numbers Authority (IANA) cuya página Web indicada aquí al final
de este párrafo permite verlos presionando el código de país respectivo y luego
ubicando al final de la siguiente página donde dice "Subdomain Information": vea
esto en IANA-Internet Assigned Numbers Authority:
http://www.iana.org/domains/root/db/
Si desea registrarse y/o saber si el nombre planeado está ya registrado o no, puede
buscar en Google por " registro de dominios" o "domain registry". Note que puede
hacer este registro desde los sitios de alojamiento Web que proporcionan el registro
previo para alojar su sitio bajo el nombre de dominio que compre. Eso así esta
incluído en el precio. Las ofertas "gratis" por inscribir el nombre de su sitio allí no
significan que realmente no se pague por ese derecho.
Al finalizar, tendremos en el servidor remoto una copia exacta del contenido de nuestro
ordenador.
En este proceso sólo necesitaremos tener una precaución: la estructura de los archivos
debe mantenerse exactamente igual que la local, es decir, si habíamos distribuido los
archivos por carpetas, debemos mantener el mismo sistema.
Nota
No debemos olvidar que nuestra página principal debe llamarse index.htm o
index.html, ya que ésa será la que se cargue automáticamente por parte del servidor,
cuando alguien acceda a nuestro espacio.
Cuando terminemos de trabajar con la aplicación, podemos cerrar el programa y dar por
terminado el proceso. Nuestra página web ya ha sido creada.
Caracteres especiales
Por cuestiones relacionadas con el tipo de codificación de los documentos y las
diferencias que puedan existir con el servidor, se nos puede dar el caso de que, al
transferir un sitio web, observemos que las tildes no se muestran correctamente, las eñes
y otros caracteres especiales.
Los motivos por los que esto sucede son complejos, pero no así la solución, que pasa
por indicar en BlueGriffon que reemplace los caracteres especiales por códigos
estandarizados en HTML. Esto se consigue seleccionando la opción
Herramientas>Preferencias y posteriormente la pestaña Documentos.
6. SEVICIOS WEB
Un servicio web (en inglés, Web Service o Web services) es una tecnología que utiliza
un conjunto de protocolos y estándares que sirven para intercambiar datos entre
aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de
programación diferentes, y ejecutadas sobre cualquier plataforma, pueden utilizar los
servicios web para intercambiar datos en redes de ordenadores como Internet. La
interoperabilidad se consigue mediante la adopción de estándares abiertos. Las
organizaciones OASIS y W3C son los comités responsables de la arquitectura y
reglamentación de los servicios Web. Para mejorar la interoperabilidad entre distintas
implementaciones de servicios Web se ha creado el organismo WS-I, encargado de
desarrollar diversos perfiles para definir de manera más exhaustiva estos estándares. Es
una máquina que atiende las peticiones de los clientes web y les envía los recursos
solicitados.
6.1.2. xml
Un servicio web XML puede usarse internamente por una sola aplicación o exponerse
externamente a través de Internet para su uso por diversas aplicaciones. Puesto que es
accesible a través de una interfaz estándar, un servicio web XML permite a sistemas
heterogéneos funcionar juntos como una sencilla web de cálculo.
En lugar de seguir las funciones genéricas de portabilidad de código, los servicios web
XML proporcionan una solución viable para habilitar los datos y la interoperabilidad del
sistema. Los servicios web XML usan la mensajería basada en XML como un medio
fundamental para la comunicación de datos y ayudar a salvar las diferencias que existen
entre los sistemas que usan modelos de componentes, sistemas operativos y lenguajes
de programación incongruentes. Los programadores pueden crear aplicaciones que
desarrollen juntas servicios web XML de varios orígenes de la misma manera que usan
tradicionalmente los componentes para crear una aplicación distribuida.
Los servicios web XML habilitan una nueva era de desarrollo de aplicaciones
distribuidas. Ya no se trata de una guerra de modelos de objetos o concursos de belleza
de lenguajes de programación. Cuando los sistemas cooperan estrechamente usando
infraestructuras de propietario, esto se hace con cargo a la interoperabilidad de la
aplicación. Los servicios web XML proporcionan la interoperabilidad en un nivel
completamente nuevo que niega tales rivalidades contraproducentes. El próximo avance
revolucionario de Internet será que los servicios web XML se convertirán en la
estructura fundamental que vincule juntos los dispositivos informáticos.
6.1.3. soap
OAP (siglas de Simple Object Access Protocol) es un protocolo estándar que define
cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio
de datos XML. Este protocolo deriva de un protocolo creado por Dave Winer en 1998,
llamado XML-RPC. SOAP fue creado por Microsoft, IBM y otros. Está actualmente
bajo el auspicio de la W3C. Es uno de los protocolos utilizados en los servicios Web.
Características
SOAP puede formar la capa base de una "pila de protocolos de web service", ofreciendo
un framework de mensajería básica en la cual los web services se puedan construir. Este
protocolo basado en XML consiste de tres partes: un sobre (envelope), el cual define
qué hay en el mensaje y cómo procesarlo; un conjunto de reglas de codificación para
expresar instancias de tipos de datos; y una convención para representar llamadas a
procedimientos y respuestas. El protocolo SOAP tiene tres características principales:
Como ejemplo de cómo los procedimientos SOAP pueden ser utilizados, un mensaje
SOAP podría ser enviado a un sitio Web que tiene habilitado Web service, para realizar
la búsqueda de algún precio en una base de datos, indicando los parámetros necesitados
en la consulta. El sitio podría retornar un documento formateado en XML con el
resultado, ejemplo, precios, localización, características. Teniendo los datos de
respuesta en un formato estandarizado "parseable", este puede ser integrado
directamente en un sitio Web o aplicación externa.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetails xmlns="http://warehouse.example.com/ws">
<productId>827635</productId>
</getProductDetails>
</soap:Body>
</soap:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetailsResponse
xmlns="http://warehouse.example.com/ws">
<getProductDetailsResult>
<productName>Toptimate 3-Piece Set</productName>
<productId>827635</productId>
<description>3-Piece luggage set. Black
Polyester.</description>
<price>96.50</price>
<inStock>true</inStock>
</getProductDetailsResult>
</getProductDetailsResponse>
</soap:Body>
</soap:Envelope>
A pesar de no ser la única opción posible, HTTP fue elegido como protocolo de
transporte por sus ventajas, para lidiar con cortafuegos, por ejemplo. Otros protocolos
como GIOP/IIOP o DCOM (utilizados en CORBA, RMI y DCOM) suelen ser repelidos
por estos cortafuegos.
6.1.4. wsdl
WSDL son las siglas de Web Services Description Language, un formato XML que se
utiliza para describir servicios Web . La versión 1.0 fue la primera recomendación por
parte del W3C y la versión 1.1 no alcanzó nunca tal estatus. La versión 2.0 se convirtió
en la recomendación actual por parte de dicha entidad.
WSDL describe la interfaz pública a los servicios Web. Está basado en XML y describe
la forma de comunicación, es decir, los requisitos del protocolo y los formatos de los
mensajes necesarios para interactuar con los servicios listados en su catálogo. Las
operaciones y mensajes que soporta se describen en abstracto y se ligan después al
protocolo concreto de red y al formato del mensaje.
Así, WSDL se usa a menudo en combinación con SOAP y XML Schema. Un programa
cliente que se conecta a un servicio web puede leer el WSDL para determinar qué
funciones están disponibles en el servidor. Los tipos de datos especiales se incluyen en
el archivo WSDL en forma de XML Schema. El cliente puede usar SOAP para hacer la
llamada a una de las funciones listadas en el WSDL.
El WSDL nos permite tener una descripción de un servicio web. Especifica la interfaz
abstracta a través de la cual un cliente puede acceder al servicio y los detalles de cómo
se debe utilizar.
Tipos de Datos
<types>: Esta sección define los tipos de datos usados en los mensajes. Se utilizan los
tipos definidos en la especificación de esquemas XML.
Mensajes
<message>: Aquí definimos los elementos de mensaje. Cada mensaje puede consistir en
una serie de partes lógicas. Las partes pueden ser de cualquiera de los tipos definidos en
la sección anterior.
Tipos de Puerto
<portType>: Con este apartado definimos las operaciones permitidas y los mensajes
intercambiados en el Servicio.
Bindings
Servicios
<service>: Conjunto de puertos y dirección de los mismos. Esta parte final hace
referencia a lo aportado por las secciones anteriores.
Ejemplo
A continuación se muestra un ejemplo de un documento WSDL y sus diferentes
secciones. En este ejemplo concreto se implementa un servicio que muestra a partir del
nombre de un valor bursátil su valor actual en el mercado.
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema targetNamespace="http://example.com/stockquote.xsd"
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>
</types>
<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>
<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
<binding name="StockQuoteSoapBinding"
type="tns:StockQuotePortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation
soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort"
binding="tns:StockQuoteSoapBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>
6.1.5. uddi
UDDI son las siglas del catálogo de negocios de Internet denominado Universal
Description, Discovery and Integration. El registro en el catálogo se hace en XML.
UDDI es una iniciativa industrial abierta (sufragada por la OASIS) entroncada en el
contexto de los servicios Web. El registro de un negocio en UDDI tiene tres partes:
UDDI es uno de los estándares básicos de los servicios Web cuyo objetivo es ser
accedido por los mensajes SOAP y dar paso a documentos WSDL, en los que se
describen los requisitos del protocolo y los formatos del mensaje solicitado para
interactuar con los servicios Web del catálogo de registros.
6.1.6 ws – security
Estructura de datos
1.INTRODUCCIÓN A LAS ESTRUCTURAS DE DATOS
1.1. Introducción
Como ya sabemos, las computadoras fueron diseñadas o ideadas como una herramienta
mediante la cual podemos realizar operaciones de cálculo complicadas en un lapso de
mínimo tiempo. Pero la mayoría de las aplicaciones de este fantástico invento del
hombre, son las de almacenamiento y acceso de grandes cantidades de información.
Debido a que por lo general tenemos que tratar con conjuntos de datos y no con datos
simples (enteros, reales, booleanos, etc.) que por sí solos no nos dicen nada, ni nos
sirven de mucho, es necesario tratar con estructuras de datos adecuadas a cada
necesidad.
Las estructuras de datos son una colección de datos cuya organización se caracteriza por
las funciones de acceso que se usan para almacenar y acceder a elementos individuales
de datos.
Ejemplo: Supongamos que nos enfrentamos a un problema como este: Una empresa
que cuenta con 150 empleados, desea establecer una estadística sobre los salarios de sus
empleados, y quiere saber cual es el salario promedio, y también cuantos de sus
empleados gana entre $1250.00 y $2500.00.
Si tomamos la decisión de tratar este tipo de problemas con datos simples, pronto nos
percataríamos del enorme desperdicio de tiempo, almacenamiento y velocidad. Es por
eso que para situaciones de este tipo la mejor solución son los datos estructurados.
Terminología básica
Dato: hechos conocidos que pueden registrarse y que tienen un significado implícito. Por
ejemplo: un 500.
Información: datos cuya forma o formato es útil para ser usado en el proceso de toma de
decisiones. Por ejemplo: 500 milímetros de lluvia caída.
Estructura de datos: es un enfoque para la organización de los datos en un sistema de
información.
Sistema de archivos: es un conjunto de TDAs que son implementados para el
almacenamiento, la organización jerárquica, la manipulación, el acceso, el direccionamiento y
la recuperación de datos.
Base de datos: conjunto de datos interrelacionados, almacenados de forma tal que
representan alguna parte de universo del discurso. Constituye un conjunto de datos
lógicamente coherente, que guarda en sí mismo un cierto significado.
DBMS (Sistema gestor de bases de datos): es un conjunto de programas que permite a los
usuarios crear y mantener una base de datos.
Sistemas de bases de datos: conjunto formado por la base de datos y el software necesario
para manipularla (DBMS).
Las operaciones que se suelen realizar habitualmente sobre una estructura lineal, sea
esta un array o una lista enlazada, sin las siguientes:
ORDENACIÓN Y MEZCLA
A) ORDENACIÓN.- Organizar los elementos de la lista de acuerdo con algún tipo de orden.
B) MEZCLA.- Combinar dos listas en una sola.
Este análisis se basa en las Complejidades Temporales, con este fin, para cada problema
determinaremos una medida N, que llamaremos tamaño de la entrada o número de datos
a procesar por el programa, intentaremos hallar respuestas en función de dicha N.
Aritmética De La Notación O.
El tiempo de ejecución es proporcional, esto es, multiplica por una constante a alguno
de los tiempos de ejecución anteriormente propuestos, además de la suma de algunos
términos más pequeños. Así, un algoritmo cuyo tiempo de ejecución sea T = 3N2 + 6N
se puede considerar proporcional a N2. En este caso se diría que el algoritmo es del
orden de N2, y se escribe O(N2).
Los grafos definidos por matriz de adyacencia ocupan un espacio O(N2), siendo N el
número de vértices de éste.
La notación O-grande ignora los factores constantes, es decir, ignora si se hace una
mejor o peor implementación del algoritmo, además de ser independiente de los datos
de entrada del algoritmo. Es decir, la utilidad de aplicar esta notación a un algoritmo es
encontrar un límite superior del tiempo de ejecución.
A veces ocurre que no hay que prestar demasiada atención a esto. Por ejemplo, el
tiempo de ejecución del algoritmo Quick Sort es de O(N2). Sin embargo, en la práctica
este caso no se da casi nunca y la mayoría de los casos son proporcionales a N•logN. Es
por ello que se tiliza esta última expresión para este método de ordenación.
Una definición rigurosa de esta notación es la siguiente:
Una función g(N) pertenece a O(f(N)) si y sólo si existen las constantes c0 y N0 tales
que:
g(N) <= c0•f(N) , para todo N >= N0.
Complejidad.
Un algoritmo es un conjunto finito de reglas que dan una secuencia de operaciones para
resolver todos los problemas de un tipo de dato, debe cumplir con condiciones de
finitud, definibilidad, entrada, salida y efectividad.
- logN. Tiempo de ejecución logarítmico. Se puede considerar como una gran constante.
La base del logaritmo (en informática la más común es la base 2) cambia la constante,
pero no demasiado. El programa es más lento cuanto más crezca N, pero es
inapreciable, pues logN no se duplica hasta que N llegue a N2.
- N. Tiempo de ejecución lineal. Un caso en el que N valga 40, tardará el doble que otro
en que N valga 20. Un ejemplo sería un algoritmo que lee N números enteros y
devuelve la media aritmética.
- N3. Tiempo de ejecución cúbico. Como ejemplo se puede dar el de un bucle anidado
triple. Si N se duplica, el tiempo de ejecución se multiplica por ocho.
- 2N. Tiempo de ejecución exponencial. No suelen ser muy útiles en la práctica por el
elevadísimo tiempo de ejecución. El problema de la mochila resuelto por un algoritmo
de fuerza bruta -simple vuelta atrás- es un ejemplo. Si N se duplica, el tiempo de
ejecución se eleva al cuadrado.
Complejidad En Espacio.
La cantidad (la medida varía según la máquina) que necesita el algoritmo para su
ejecución; es decir, el espacio en memoria que ocupan todas las variables propias al
algoritmo. Para calcular la memoria estática de un algoritmo se suma la memoria que
ocupan las variables declaradas en el algoritmo. Para el caso de la memoria dinámica, el
cálculo no es tan simple ya que, este depende de cada ejecución del algoritmo.
2. RECURSIBILIDAD
2.1. INTRODUCCION
Ventajas:
No es necesario definir la secuencia de pasos exacta para resolver el problema.
Soluciones simples, claras.
Soluciones elegantes.
Soluciones a problemas complejos.
Desventajas:
Podría ser menos eficiente.
Sobrecarga asociada con las llamadas a subalgoritmos
Una simple llamada puede generar un gran número de llamadas Recursivas. (Fact(n)
genera n llamadas recursivas)
El valor de la recursividad reside en el hecho de que se puede usar para resolver
problemas sin fácil solución iterativa.
La ineficiencia inherente de algunos algoritmos recursivos.
5.1.1. INTRODUCCION
Introducción
La lista enlazada es un TDA que nos permite almacenar datos de una forma organizada,
al igual que los vectores pero, a diferencia de estos, esta estructura es dinámica, por lo
que no tenemos que saber "a priori" los elementos que puede contener.
En una lista enlazada, cada elemento apunta al siguiente excepto el último que no tiene
sucesor y el valor del enlace es null. Por ello los elementos son registros que contienen
el dato a almacenar y un enlace al siguiente elemento. Los elementos de una lista,
suelen recibir también el nombre de nodos de la lista.
struct lista {
gint dato;
lista *siguiente;
};
Representa el dato a almacenar. Puede ser de cualquier tipo; en este ejemplo se trata
de una lista de enteros.
Para que esta estructura sea un TDA lista enlazada, debe tener unos operadores
asociados que permitan la manipulación de los datos que contiene. Los operadores
básicos de una lista enlazada son:
Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta inserción
al principio o final de la lista o bien en orden.
Eliminar: elimina un nodo de la lista, puede ser según la posición o por el dato.
Después de esta breve introducción, que sólo pretende servir como recordatorio,
pasaremos a ver cómo es la estructura GSList que, junto con el conjunto de funciones
que la acompañan, forman el TDA lista enlazada en GLib™.
5.1.2 LISTAS
una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada
para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los
que se guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros
al nodo anterior o posterior. El principal beneficio de las listas enlazadas respecto a los
vectores convencionales es que el orden de los elementos enlazados puede ser diferente
al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de
recorrido de la lista sea diferente al de almacenamiento.
Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales
como Lisp y Scheme tiene estructuras de datos ya construidas, junto con operaciones
para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales
como C o C++ y Java, respectivamente, disponen de referencias para crear listas
enlazadas.
Una lista enlazada es un conjunto de elementos llamados nodos en los que cada uno de
ellos contiene un dato y también la dirección del siguiente nodo.
El primer elemento de la lista es la cabecera, que sólo contiene un puntero que señala el
primer elemento de la lista.
El último nodo de la lista apunta a NULL (nulo) porque no hay más nodos en la lista. Se
usará el término NULL para designar el final de la lista.
Cabecera
Las operaciones que normalmente se ejecutan con listas incluyen:
A este tipo de estructuras se les denomina Lista Enlazada y a cada uno de los registros
que forman la misma se le denomina nodo. En general, un nodo de una lista enlazada
puede contener toda la información que se desee (todos los campos que se quieran), más
un campo de tipo Puntero, que apuntará al siguiente registro.
Representa el dato a almacenar. Puede ser de cualquier tipo; en este ejemplo se trata de
una lista de enteros.
Para que esta estructura sea un TDA lista enlazada, debe tener unos operadores
asociados que permitan la manipulación de los datos que contiene. Los operadores
básicos de una lista enlazada son:
Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta inserción al
principio o final de la lista o bien en orden.
Eliminar: elimina un nodo de la lista, puede ser según la posición o por el dato.
5.1.5 RECORRIDO
reconocer un vector fue fácil con una estructura repetitiva , al poder utilizar su índice para
poder ir del principio al final de la estructura . sin embargo en el cargo de las listas , al carecer
de índice , puede pensarse que no es tan fácil acceder directa o aleatoriamente a sus nodos ,
ya para ello es necesario acceder al primer nodo mediante el pun tero externo , al segundo ,
después de ascender al primero , etc .afortunadamente , esto se resuelve , usando una
variable puntero , auxiliar x , que aun te en cada momento al no so procesado , de forma
que . con solo hacer asignación :X – sig.(x), esto es guardar en x el campo puntero del nodo
se tiene el efecto de avanzar hacia el siguiente nodo de la lista.
El puntero P contiene el valor del primer elemento de la lista . el bucle recorre toda la lista
hasta que escuentra un nodo cuyo siguiente sea nulo, en cuyo caso se efectuaría
(P←NULO), que corresponde al ultimo de la lista.La línea 4 escribe el valor de cvada
elemento y la línea 5 avanza el puntero P, dándole el valor dell campo IG del nodo actual.
5.1.6. Busqueda
Otro enfoque común es indizar una lista enlazada usando una estructura de datos
externa más eficiente. Por ejemplo, podemos construir un árbol rojo-negro o una tabla
hash cuyos elementos están referenciados por los nodos de las listas enlazadas. Pueden
ser construidos múltiples índices en una lista simple. La desventaja es que estos índices
puede necesitar ser actualizados cada vez que uno nodo es añadido o eliminado (o al
menos, antes que el índice sea utilizado otra vez).
También se necesita hacer este mismo recorrido con la operación put. Si la llave existe
se modifica el valor en el mismo eslabón. Si la llave no existía previamente en la lista
enlazada, se crea un nuevo eslabón para esa llave y se agrega por conveniencia justo
después del eslabón falso:
5.1.8. inserción
// SLLInsDemo.java
class SLLInsDemo {
static class Node {
String name;
Node next;
}
Node temp;
Node temp2;
temp2 = top;
temp2.next = temp;
temp2 = top;
temp.next = temp2.next;
temp2.next = temp;
El método static void dump(String msg, Node topNode) itera sobre la lista e
imprime su contenido. Cuando se ejecuta SLLInsDemo, las repetidas llamadas a este
método dan como resultado la siguiente salida, lo que coincide con las imagénes
anteriores:
Case 1 A
Case 2 B A
Case 3 B A C
Case 4 B A D C
5.1.9 eliminacion
Esta operación consiste en hacer que el nodo anterior , al nodo que quiere eliminaRSE , se
enlace con el posterior a este , con lo cual el nodo que nos in teresa quedara fuera de la
lista . consideremos la lista enlazada . el Algoritmo que sigue eliminada de la lñiosta
enlazada el elemento siguien te al apuntado por p , utilizando un pun tero axiliar q:
no tenemos que a su vez , el proceso de borrado dara lugar a la existencia de nodos libres o
disponibles , al liberar el nodo que se elimina ; este espacio de memoria podra ser utilizado.
Estas pueden ser simples o doblemente enlazadas. En una lista circular todos los nodos están
enlazados como un círculo, sin usar nulo. Para listas con frente y final (como una cola), se
guarda una referencia al último nodo de la lista. El siguiente nodo después del último sería el
primero de la lista. Los elementos se pueden añadir por el final y borrarse por el principio en
todo momento. Ambos tipos de listas circulares tienen la ventaja de poderse recorrer
completamente empezando desde cualquier nodo. Esto nos permite normalmente evitar el
uso de PrimerNodo y UltimoNodo, aunque si la lista estuviera vacía necesitaríamos un caso
especial, como una variables UltimoNodo que apunte a algún nodo en la lista o nulo si está
vacía. Las operaciones para estas listas simplifican el insertar y borrar nodos en una lista vacía
pero introducen casos especiales en la lista vacía.
Asumiendo que someNodo es algún nodo en una lista no vacía, esta lista presenta el
comienzo de una lista con someNode.
Hacia Delante
node := someNode
do
do something with node.value
node := node.next
while node != someNode
Hacia Atrás
node := someNode
do
do something with node.value
node := node.prev
while node := someNode
Esta función inserta un nodo en una lista enlazada doblemente circular después de un
elemento dado:
Una lista doblemente enlazada es una lista enlazada de nodos, donde cada nodo tiene un par
de campos de enlace. Un campo de enlace permite atravesar la lista hacia adelante, mientras
que el otro permite atravesar la lista haca atrás. Para la dirección hacia adelante, una variable
de referencia contiene una referencia al primer nodo. Cada nodo se enlaza con el siguiente
mediante el campo de enlace next, excepto el último nodo, cuyo campo de
enlace nextcontiene null para indicar el final de la lista (en direccion hacia adelante). De
forma similar, para la dirección contraria, una variable de referencia contiene una referencia al
último nodo de la dirección normal (hacia adelante), lo que se interpreta como el primer nodo.
Cada nodo se enlaza con el anterior mediante el campo de enlace previous, y el primer nodo
de la direccion hacia adelante, contiene null en su campo previous para indicar el fin de la
lista. La siguiente figura representa una lista doblemente enlazada de tres nodos,
donde topForward referencia el primer nodo en la direccion hacia adelante, y topBackward
referencia el primero nodo la dirección inversa.
5.2 arboles
5.2.1. introduccion
A los arboles ordenados de grado dos se les conoce como arboles binarios ya que cada
nodo del árbol no tendrá más de dos descendientes directos. Las aplicaciones de los
arboles binarios son muy variadas ya que se les puede utilizar para representar una
estructura en la cual es posible tomar decisiones con dos opciones en distintos puntos.
Los árboles de grado 2 tienen una especial importancia. Se les conoce con el nombre de
árboles binarios. Se define un árbol binario como un conjunto finito de elementos
(nodos) que bien está vació o está formado por una raíz con dos árboles binarios
disjuntos, llamados subárbol izquierdo y derecho de la raíz.
En los apartados que siguen se considerarán únicamente árboles binarios y, por lo tanto,
se utilizará la palabra árbol para referirse a árbol binario. Los árboles de grado superior
a 2 reciben el nombre de árboles multicamino.
Árbol binario de búsqueda.- Los árboles binarios se utilizan frecuentemente para
representar conjuntos de datos cuyos elementos se identifican por una clave única. Si el
árbol está organizado de tal manera que la clave de cada nodo es mayor que todas las
claves su subárbol izquierdo, y menor que todas las claves del subárbol derecho se dice
que este árbol es un árbol binario de búsqueda.
Ejemplo:
Operaciones básicas.- Una tarea muy común a realizar con un árbol es ejecutar una
determinada operación con cada uno de los elementos del árbol.Esta operación se
considera entonces como un parámetro de una taré más general que es la visita de todos
los nodos o, como se denomina usualmente, del recorrido del árbol.
Si se considera la tarea como un proceso secuencial, entonces los nodos individuales se
visitan en un orden específico, y pueden considerarse como organizados según una
estructura lineal. De hecho, se simplifica considerablemente la descripción de muchos
algoritmos si puede hablarse del proceso del siguiente elemento en el árbol, según un
cierto orden subyacente.
Hay dos formas básicas de recorrer un árbol: El recorrido en amplitud y el recorrido en
profundidad.
Recorrido en amplitud.- Es aquel recorrido que recorre el árbol por niveles, en el último
ejemplo sería:
12 - 8,17 - 5,9,15
Recorrido en profundidad.- Recorre el árbol por subárboles. Hay tres formas: Preorden,
orden central y postorden.
Preorden: Raiz, subárbol izquierdo y subárbol derecho.
Orden central: Subarbol izquierdo, raiz, subarbol derecho.
Postorden: Subarbol izquierdo, subarbol derecho, raiz.
Ejemplo:
Preorden: 20 - 12 - 5 - 2 - 7 - 13 - 15 - 40 - 30 - 35 - 47
Orden central: 2 - 5 - 7 - 12 - 13 - 15 - 20 - 30 - 35 - 40 - 47
Postorden: 2 - 7 - 5 - 15 - 13 - 12 - 35 - 30 - 47 - 40 - 20
Ejemplo:
Preorden: / + a b * c d Notación polaca
Orden central: a + b / c * d Notación infija
Postorden: a b + c d * / Notación polaca inversa
Por medio de datos tipo punteros también conocidos como variables dinámicas o
listas.
Por medio de arreglos.
Sin embargo la más utilizada es la primera, puesto que es la más natural para tratar este
tipo de estructuras.
Los nodos del árbol binario serán representados como registros que contendrán como
mínimo tres campos. En un campo se almacenará la información del nodo. Los dos
restantes se utilizarán para apuntar al subarbol izquierdo y derecho del subarbol en
cuestión.
inicio
mensaje("Rama izquierda?")
lee(respuesta)
new(p)
crear(p)
en caso contrario
mensaje("Rama derecha?")
lee(respuesta)
si respuesta="si" entonces
new(p)
q(ld)<--p
crear(p)
en caso contrario
q(ld) <--nil
fin
INICIO
new(p)
raiz<--p
crear(p)
FIN
5.2.4 recorrido
Hay tres manera de recorrer un árbol : en inorden, preorden y postorden. Cada una de
ellas tiene una secuencia distinta para analizar el árbol como se puede ver a
continuación:
INORDEN
PREORDEN
Examinar la raíz.
Recorrer el subarbol izquierdo en preorden.
recorrer el subarbol derecho en preorden.
POSTORDEN
Inorden: GDBHEIACJKF
Preorden: ABDGEHICFJK
Postorden: GDHIEBKJFCA
Pre-Orden
In-Orden
Post-Orden
Tipo Arbol=^Nodo;
Tipo Nodo=registro
info:Tinfo;
izq,der:Arbol;
freg
Variables globales:
a:Arbol;
p:Pila(Arbol);
PreOrden_I(a:Arbol);
Creap(p);
Si a<>nil entonces Apilar (p,a);
Mientras no esvacia(p) hacer
aux:=Tope(p);
desapilar(p);
Tratar(aux^.info);
Si aux^.der<>Nil entonces apilar(p,aux^.der);
Si aux^.izq<>Nil entonces apilar(p,aux^.izq);
fMientras
Todos los valores de los nodos del subárbol izquierdo de A deben ser menores al valor
del nodo A.
Todos los valores de los nodos del subárbol derecho de A deben ser mayores o iguales
al valor del nodo A. Un recorrido en inorden del árbol proporciona una lista en orden
ascendente de los valores almacenados en los nodos. Para describir las operaciones, se
considera que estas se enmarcan dentro de la clase NodoBinario. El lenguaje utilizado
es JAVA.
Operación “buscar”
public boolean buscar(Object o)
{
if (o.equals(valor))
return true;
else if (o.compareTo(valor)<0)
return buscar(getIzq(),o);
else return buscar(getDer(),o);
}
Operación “insertar”
public NodoBinario insertar(Comparable o){
if (o.compareTo(valor)<0)
setIzq(insertar(getIzq(),o));
else setDer(insertar(getDer(),o));
return this;
}
Operación “recorrer”
Los recorridos pueden ser en preorden, postorden o inorden (orden simétrico). Todos
son O(N).
Operación “borrado”
El nodo a borrar debe ser reemplazado por el nodo más a la derecha en el subárbol
izquierdo o el nodo más a la izquierda en el subárbol derecho (el nodo más a la derecha
del subárbol izquierdo será mayor o igual que cualquier otro nodo de ese subárbol y
menor que todos los del subárbol derecho, y el nodo más a la izquierda del subárbol
derecho será menor que todos los demás nodos de ese subárbol y mayor que todos los
del subárbol izquierdo). Para el caso en el que el nodo elegido tengo un subárbol, hay
por lo menos tres soluciones posibles:
Un hueco dejado por un nodo promovido también puede pensarse como una
eliminación. un arbol es un arbol jajaja
Buscar un elemento
Partiendo siempre del nodo raíz, el modo de buscar un elemento se define de forma
recursiva.
Insertar un elemento
Necesitamos un puntero auxiliar para conservar una referencia al padre del nodo raíz
actual. El valor inicial para ese puntero es NULL.
Padre = NULL
nodo = Raiz
Bucle: mientras actual no sea un árbol vacío o hasta que se encuentre el
elemento.
Si el valor del nodo raíz es mayor que el elemento que buscamos, continuaremos
la búsqueda en el árbol izquierdo: Padre=nodo, nodo=nodo->izquierdo.
Si el valor del nodo raíz es menor que el elemento que buscamos, continuaremos
la búsqueda en el árbol derecho: Padre=nodo, nodo=nodo->derecho.
5.2.9. eliminación
Se pueden dar dos problemas al eliminar elementos: primero, el elemento puede ser un
separador de un nodo interno. Segundo, puede suceder que al borrar el elemento número
de elementos del nodo quede debajo de la cota mínima. Estos problemas se tratan a
continuación en orden.
En el segundo caso, uno de los dos nodos hijos tienen un número de elementos mayor
que el mínimo. Entonces izquierdo o el menor elemento de el nuevo separador.
Necesitamos un puntero auxiliar para conservar una referencia al padre del nodo raíz
actual. El valor inicial para ese puntero es NULL.
Padre = NULL
Si el árbol está vacío: el elemento no está en el árbol, por lo tanto salimos sin
eliminar ningún elemento.
(1) Si el valor del nodo raíz es igual que el del elemento que buscamos, estamos
ante uno de los siguientes casos:
Si 'Padre' es NULL, el nodo raíz es el único del árbol, por lo tanto el puntero al
árbol debe ser NULL.
Si raíz es la rama derecha de 'Padre', hacemos que esa rama apunte a NULL.
Si raíz es la rama izquierda de 'Padre', hacemos que esa rama apunte a NULL.
Eliminamos el nodo, y salimos.
Si el valor del nodo raíz es mayor que el elemento que buscamos, continuaremos
la búsqueda en el árbol izquierdo.
Si el valor del nodo raíz es menor que el elemento que buscamos, continuaremos
la búsqueda en el árbol derecho.
Ejemplo 3:
Estos tres posibles combinaciones pueden observarse en la figura 3.39. Para la figura hemos asumido que
los árboles originales son nodos simples, pero podrían ser a su vez árboles.
Entonces, cada una de las sublistas en (3.25) genera 3 árboles. En general vamos a tener
Nabc(n) = (número de posibles pares a escoger de n árboles) _ Nabc(n 1) (3.27)
donde Nabc(n) es el número de árboles binarios completos de n hojas. El número de posibles pares a
escoger de n árboles es n(n1)=2. La división por 2 proviene de que no importa el orden entre los
elementos
del par. De manera que
Notar que esta estimación es menor que la obtenida en la sección anterior (3.24) ya que en aquella
estimación
se cuentan dos veces árboles que se obtienen intercambiando los hijos.
5.3. grafos
5.3.1 introduccion
Hoy en día podemos ver muchas cosas que nos pueden parecer de lo mas
cotidianas, carreteras, líneas telefónicas, líneas de televisión por cable, el
transporte colectivo metro, circuitos eléctricos de nuestras casas, automóviles, y
tantas cosas mas; lo que no pensamos frecuentemente es que estos forman parte de
algo que en matemáticas se denomina como grafos.
En este trabajo se tratará de explicar lo que son los grafos, sus tipos, y algunas
derivaciones de ellos, así como su representación gráfica y en algunos casos, su
representación en algún programa informático, así como en la memoria.
Esta definición da lugar a una representación gráfica, en donde cada vértice es un punto
del plano, y cada arista es una línea que une a sus dos vértices.
Lista de incidencia
El grafo está representado por un arreglo de aristas, identificadas por un par de vértices,
que son los que conecta esa arista.
Matriz de incidencia
El grafo está representado por una matriz de A (aristas) por V (vértices), donde [arista,
vértice] contiene la información de la arista (conectado o no conectado).
Matriz de adyacencia
Variante 1:
Una lista de vértices y cada uno tiene una lista de los vértices adyacentes a él
• El grafo está vacío si no existen vértices. Las listas pueden ser indistintamente
• Apuntador a su información,
ADY
Cada posición de este vector representa a un nodo. Luego, en cada uno de los vectores
que están contenidos en las posiciones del vector principal, colocamos los nodos con los
que este tiene un arco.
Por ejemplo, si el nodo 1 tiene un arco que lo conecta con el nodo 2 y otro con el nodo
5, al vector que se encuentra en la posición uno del vector principal, se le agregan los
valores 2 y 5, como vemos en nuestro ejemplo.
5.3.5 operaciones de un grafo
Operaciones unitarias
Operaciones elementales
También llamados operaciones de edición de grafos. Crean un nuevo grafo del original
por un simple cambio local:
Operaciones avanzadas
Grafo de línea
Grafo dual
Grafo complemento
Grafo minor
Operaciones binarias
Las operaciones binarias crean un nuevo grafo de dos grafos iniciales y
:
Unión de grafos
Intersección de grafos
Suma de grafos
Producto de grafos basados en el producto cartesiano del conjunto de vértices
Construcción de Hajós
En los grafos, como en todas las estructuras de datos, las dos operaciones básicas son
insertar y borrar. En este caso, cada una de ellas se desdobla en dos, para
insertar/eliminar vértices e insertar/eliminar aristas.
Insertar vértice
Insertar arista
Esta operación es también muy sencilla. Cuando se inserte una nueva arista en el grafo,
habrá que añadir un nuevo nodo a la lista de adyacencia (lista que almacena los nodos a
los que un vértice puede acceder mediante una arista) del nodo origen, así si se añade la
arista (A,C), se deberá incluir en la lista de adyacencia de A el vértice C como nuevo
destino.
Eliminar vértice
Eliminar arista
Mediante esta operación se borra un arco del grafo. Para llevar a cabo esta acción es
necesario eliminar de la lista de adyacencia del nodo origen el nodo correspondiente al
nodo destino.
Otras operaciones
Las operaciones adicionales que puede incluir un grafo son muy variadas. Además de
las clásicas de búsqueda de un elemento o recorrido del grafo, también podemos
encontrarnos con ejecución de algoritmos que busquen caminos más cortos entre dos
vértices, o recorridos del grafo que ejecuten alguna operación sobre todos los vértices
visitados, por citar algunas operaciones de las más usuales.
Recorrer un grafo significa tratar de alcanzar todos los nodos que estén
relacionados con uno que llamaremos nodo de salida. Existen básicamente dos
técnicas para recorrer un grafo: el recorrido en anchura; y el recorrido en
profundidad.