jueves, 5 de julio de 2012

Árboles de Búsquedas Binarias


1. INTRODUCCIÓN.

La búsqueda en árboles binarios es un método de búsqueda simple, dinámico y eficiente considerado como uno de los fundamentales en Ciencia de la Computación. De toda la terminología sobre árboles,tan sólo recordar que la propiedad que define un árbol binario es que cada nodo tiene a lo más un hijo a la izquierda y uno a la derecha.Para construir los algoritmos consideraremos que cada nodo contiene un registro con un valor clave a través del cual efectuaremos las búsquedas.En las implementaciones que presentaremos sólo se considerará en cada nodo del árbol un valor del tipo tElemento aunque en un caso general ese tipo estará compuesto por dos:una clave indicando el campo por el cual se realiza la ordenación y una información asociada a dicha clave o visto de otra forma,una información que puede ser compuesta en la cual existe definido un orden.
Un árbol binario de búsqueda(ABB) es un árbol binario con la propiedad de que todos los elementos almacenados en el subárbol izquierdo de cualquier nodo x son menores que el elemento almacenado en x,y todos los elementos almacenados en el subárbol derecho de x son mayores que el elemento almacenado en x.
La figura 1 muestra dos ABB construidos en base al mismo conjunto de enteros:



Obsérvese la interesante propiedad de que si se listan los nodos del ABB en inorden nos da la lista de nodos ordenada.Esta propiedad define un método de ordenación similar al Quicksort,con el nodo raíz jugando un papel similar al del elemento de partición del Quicksort aunque con los ABB hay un gasto extra de memoria mayor debido a los punteros.La propiedad de ABB hace que sea muy simple diseñar un procedimiento para realizar la búsqueda. Para determinar si k está presente en el árbol la comparamos con la clave situada en la raíz, r.Si coinciden la búsqueda finaliza con éxito, si k<r es evidente quek,de estar presente,ha de ser un descendiente del hijo izquierdo de la raíz,y si es mayor será un descendiente del hijo derecho.La función puede ser codificada fácilmente de la siguiente forma:


#define ABB_VACIO NULL
#define TRUE 1
#define FALSE 0

typedef int tEtiqueta                   /*Algun tipo adecuado*/
typedef struct tipoceldaABB{
           struct tipoceldaABB *hizqda,*hdrcha;
           tEtiqueta etiqueta;
         }*nodoABB;
typedef nodoABB ABB;




ABB Crear(tEtiqueta et)
{
  ABB raiz;

  raiz = (ABB)malloc(sizeof(struct tceldaABB));
  if (raiz == NULL)
    error("Memoria Insuficiente.");
  raiz->hizda = NODO_NULO;
  raiz->hdcha = NODO_NULO;
  raiz->etiqueta = et;
  return(raiz);
}


int Pertenece(tElemento x,ABB t)
{
   
  if(!t)
    return FALSE
  else if(t->etiqueta==x)
         return TRUE;
       else if(t->etiqueta>x)
              return pertenece(x,t->hizqda);
            else return pertenece(x,t->hdrcha);
}


Es conveniente hacer notar la diferencia entre este procedimiento y el de búsqueda binaria.En éste podría pensarse en que se usa un árbol binario para describir la secuencia de comparaciones hecha por una función de búsqueda sobre el vector.En cambio en los ABB se construye una estructura de datos con registros conectados por punteros y se usa esta estructura para la búsqueda.El procedimiento de construcción de un ABB puede basarse en un procedimiento de inserción que vaya añadiendo elementos al árbol. Tal procedimiento comenzaría mirando si el árbol es vacío y de ser así se crearía un nuevo nodo para el elemento insertado devolviendo como árbol resultado un puntero a ese nodo.Si el árbol no está vacio se busca el elemento a insertar como lo hace el procedimiento pertenece sólo que al encontrar un puntero NULL durante la búsqueda,se reemplaza por un puntero a un nodo nuevo que contenga el elemento a insertar.El código podría ser el siguiente:


void Inserta(tElemento x,ABB *t)
{
   
  if(!(*t)){
    *t=(nodoABB)malloc(sizeof(struct tipoceldaABB));
    if(!(*t)){
      error("Memoria Insuficiente.");
    }
    (*t)->etiqueta=x;
    (*t)->hizqda=NULL;
    (*t)->hdrcha=NULL;
  } else if(x<(*t)->etiqueta)
         inserta(x,&((*t)->hizqda));
       else
         inserta(x,&((*t)->hdrcha));
}


Por ejemplo supongamos que queremos construir un ABB a partir del conjunto de enteros {10,5,14,7,12} aplicando reiteradamente el proceso de inserción.El resultado es el que muestra la figura 2.





2. ANÁLISIS DE LA EFICIENCIA DE LAS OPERACIONES.

Puede probarse que una búsqueda o una inserción en un ABB requiere O(log2n) operaciones en el caso medio,en un árbol construido a partir de n claves aleatorias, y en el peor caso una búsqueda en un ABB con n claves puede implicar revisar las n claves,o sea,es O(n).
Es fácil ver que si un árbol binario con n nodos está completo (todos los nodos no hojas tienen dos hijos) y así ningún camino tendrá más de 1+log2n nodos.Por otro lado,las operaciones pertenece e insertatoman una cantidad de tiempo constante en un nodo.Por tanto,en estos árboles, el camino que forman desde la raíz,la secuencia de nodos que determinan la búsqueda o la inserción, es de longitud O(log2n),y el tiempo total consumido para seguir el camino es también O(log2n).
Sin embargo,al insertar n elementos en un orden aleatorio no es seguro que se sitúen en forma de árbol binario completo.Por ejemplo,si sucede que el primer elemento(de n situados en orden) insertado es el más pequeño el árbol resultante será una cadena de n nodos donde cada nodo,excepto el más bajo en el árbol,tendrá un hijo derecho pero no un hijo izquierdo.En este caso,es fácil demostrar que como llevai pasos insertar el i-ésimo elemento dicho proceso de n inserciones necesita  pasos o equivalentemente O(n) pasos por operación.
Es necesario pues determinar si el ABB promedio con n nodos se acerca en estructura al árbol completo o a la cadena,es decir,si el tiempo medio por operación es O(log2n),O(n) o una cantidad intermedia.Como es difícil saber la verdadera frecuencia de inserciones sólo se puede analizar la longitud del camino promedio de árboles "aleatorios" adoptando algunas suposiciones como que los árboles se forman sólo a partir de inserciones y que todas las magnitudes de los n elementos insertados tienen igual probabilidad.Con esas suposiciones se puede calcular P(n),el número promedio de nodos del camino que va de la raíz hacia algún nodo(no necesariamente una hoja).Se supone que el árbol se formó con la inserción aleatoria de n nodos en un árbol que se encontraba inicialmente vacío,es evidente que P(0)=0 y P(1)=1.Supongamos que tenemos una lista de n>=2 elementos para insertar en un árbol vacío,el primer elemento de la lista,x,es igual de probable que sea el primero,el segundo o el n-ésimo en la lista ordenada.Consideremos que i elementos de la lista son menores que x de modo que n-i-1 son mayores. Al construir el árbol,x aparecerá en la raíz,los i elementos más pequeños serán descendientes izquierdos de la raíz y los restantes n-i-1 serán descendientes derechos.Esquemáticamente quedaría como muestra la figura 3.



Al tener tanto en un lado como en otro todos los elementos igual probabilidad se espera que los subárboles izqdo y drcho de la raíz tengan longitudes de camino medias P(i) y P(n-i-1) respectivamente.Como es posible acceder a esos elementos desde la raíz del árbol completo es necesario agregar 1 al número de nodos de cada camino de forma que para todo i entre 0 y n-1,P(n) puede calcularse obteniendo el promedio de la suma:



El primer término es la longitud del camino promedio en el subárbol izquierdo ponderando su tamaño.El segundo término es la cantidad análoga del subárbol derecho y el término 1/n representa la contribución de la raíz.Al promediar la suma anterior para todo i entre 1 y n se obtiene la recurrencia:



y con unas transformaciones simples podemos ponerla en la forma:



y el resto es demostrar por inducción sobre n que P(n)<=1+4log2n.
En consecuencia el tiempo promedio para seguir un camino de la raíz a un nodo aleatorio de un ABB construido mediante inserciones aleatorias es O(log2n).Un análisis más detallado demuestra que la constante 4 es en realidad una constante cercana a 1.4.
De lo anterior podemos concluir que la prueba de pertenencia de una clave aleatoria lleva un tiempo O(log2n).Un análisis similar muestra que si se incluyen en la longitud del camino promedio sólo aquellos nodos que carecen de ambos hijos o solo aquellos que no tienen hijo izqdo o drcho también la longitud es O(log2n).
Terminaremos este apartado con algunos comentarios sobre los borrados en los ABB.Es evidente que si el elemento a borrar está en una hoja bastaría eliminarla,pero si el elemento está en un nodo interior,eliminándolo,podríamos desconectar el árbol.Para evitar que esto suceda se sigue el siguiente procedimiento:si el nodo a borrar u tiene sólo un hijo se sustituye u por ese hijo y el ABB quedar&aacue; construido.Si u tiene dos hijos,se encuentra el menor elemento de los descendientes del hijo derecho(o el mayor de los descendientes del hijo izquierdo) y se coloca en lugar de u,de forma que se continúe manteniendo la propiedad de ABB.

Árboles


Un árbol es una estructura no lineal en la que cada nodo puede apuntar a uno o varios nodos.
También se suele dar una definición recursiva: un árbol es una estructura en compuesta por un dato y varios árboles.
Esto son definiciones simples. Pero las características que implican no lo son tanto.
Árbol
Árbol
Definiremos varios conceptos. En relación con otros nodos:
  • Nodo hijo: cualquiera de los nodos apuntados por uno de los nodos del árbol. En el ejemplo, 'L' y 'M' son hijos de 'G'.
  • Nodo padre: nodo que contiene un puntero al nodo actual. En el ejemplo, el nodo 'A' es padre de 'B', 'C' y 'D'.
Los árboles con los que trabajaremos tienen otra característica importante: cada nodo sólo puede ser apuntado por otro nodo, es decir, cada nodo sólo tendrá un padre. Esto hace que estos árboles estén fuertemente jerarquizados, y es lo que en realidad les da la apariencia de árboles.
En cuanto a la posición dentro del árbol:
  • Nodo raíz: nodo que no tiene padre. Este es el nodo que usaremos para referirnos al árbol. En el ejemplo, ese nodo es el 'A'.
  • Nodo hoja: nodo que no tiene hijos. En el ejemplo hay varios: 'F', 'H', 'I', 'K', 'L', 'M', 'N' y 'O'.
  • Nodo rama: aunque esta definición apenas la usaremos, estos son los nodos que no pertenecen a ninguna de las dos categorías anteriores. En el ejemplo: 'B', 'C', 'D', 'E', 'G' y 'J'.
Otra característica que normalmente tendrán nuestros árboles es que todos los nodos contengan el mismo número de punteros, es decir, usaremos la misma estructura para todos los nodos del árbol. Esto hace que la estructura sea más sencilla, y por lo tanto también los programas para trabajar con ellos.
Tampoco es necesario que todos los nodos hijos de un nodo concreto existan. Es decir, que pueden usarse todos, algunos o ninguno de los punteros de cada nodo.
Un árbol en el que en cada nodo o bien todos o ninguno de los hijos existe, se llama árbol completo.
En una cosa, los árboles se parecen al resto de las estructuras que hemos visto: dado un nodo cualquiera de la estructura, podemos considerarlo como una estructura independiente. Es decir, un nodo cualquiera puede ser considerado como la raíz de un árbol completo.
Existen otros conceptos que definen las características del árbol, en relación a su tamaño:
  • Orden: es el número potencial de hijos que puede tener cada elemento de árbol. De este modo, diremos que un árbol en el que cada nodo puede apuntar a otros dos es de orden dos, si puede apuntar a tres será de orden tres, etc.
  • Grado: el número de hijos que tiene el elemento con más hijos dentro del árbol. En el árbol del ejemplo, el grado es tres, ya que tanto 'A' como 'D' tienen tres hijos, y no existen elementos con más de tres hijos.
  • Nivel: se define para cada elemento del árbol como la distancia a la raíz, medida en nodos. El nivel de la raíz es cero y el de sus hijos uno. Así sucesivamente. En el ejemplo, el nodo 'D' tiene nivel 1, el nodo 'G' tiene nivel 2, y el nodo 'N', nivel 3.
  • Altura: la altura de un árbol se define como el nivel del nodo de mayor nivel. Como cada nodo de un árbol puede considerarse a su vez como la raíz de un árbol, también podemos hablar de altura de ramas. El árbol del ejemplo tiene altura 3, la rama 'B' tiene altura 2, la rama 'G' tiene altura 1, la 'H' cero, etc.
Los árboles de orden dos son bastante especiales, de hecho les dedicaremos varios capítulos. Estos árboles se conocen también como árboles binarios.
Frecuentemente, aunque tampoco es estrictamente necesario, para hacer más fácil moverse a través del árbol, añadiremos un puntero a cada nodo que apunte al nodo padre. De este modo podremos avanzar en dirección a la raíz, y no sólo hacia las hojas.
Es importante conservar siempre el nodo raíz ya que es el nodo a partir del cual se desarrolla el árbol, si perdemos este nodo, perderemos el acceso a todo el árbol.
El nodo típico de un árbol difiere de los nodos que hemos visto hasta ahora para listas, aunque sólo en el número de nodos. Veamos un ejemplo de nodo para crear árboles de orden tres:
struct nodo \{
   int dato;
   struct nodo *rama1;
   struct nodo *rama2;
   struct nodo *rama3;
};
O generalizando más:
#define ORDEN 5

struct nodo \{
   int dato;
   struct nodo *rama[ORDEN];
};

6.2 Declaraciones de tipos para manejar árboles en C

^
Para C, y basándonos en la declaración de nodo que hemos visto más arriba, trabajaremos con los siguientes tipos:
typedef struct _nodo \{
   int dato;
   struct _nodo *rama[ORDEN];
} tipoNodo;
 
typedef tipoNodo *pNodo;
typedef tipoNodo *Arbol;
Al igual que hicimos con las listas que hemos visto hasta ahora, declaramos un tipo tipoNodo para declarar nodos, y un tipo pNodo para es el tipo para declarar punteros a un nodo.
Arbol es el tipo para declarar árboles de orden ORDEN.
Árbol
Árbol
El movimiento a través de árboles, salvo que implementemos punteros al nodo padre, será siempre partiendo del nodo raíz hacia un nodo hoja. Cada vez que lleguemos a un nuevo nodo podremos optar por cualquiera de los nodos a los que apunta para avanzar al siguiente nodo.
En general, intentaremos que exista algún significado asociado a cada uno de los punteros dentro de cada nodo, los árboles que estamos viendo son abstractos, pero las aplicaciones no tienen por qué serlo. Un ejemplo de estructura en árbol es el sistema de directorios y ficheros de un sistema operativo. Aunque en este caso se trata de árboles con nodos de dos tipos, nodos directotio y nodos fichero, podríamos considerar que los nodos hoja son ficheros y los nodos rama son directorios.
Otro ejemplo podría ser la tabla de contenido de un libro, por ejemplo de este mismo curso, dividido en capítulos, y cada uno de ellos en subcapítulos. Aunque el libro sea algo lineal, como una lista, en el que cada capítulo sigue al anterior, también es posible acceder a cualquier punto de él a través de la tabla de contenido.
También se suelen organizar en forma de árbol los organigramas de mando en empresas o en el ejército, y los árboles genealógicos.

Multígrafos


Sea G = (V, E) un grafo dirigido, donde V es un conjunto y E es un multiconjunto de pares ordenados de V  V. G es llamado un multigrafo dirigido y geométricamente puede representarse como un conjunto de vértices V y un conjunto de flechas E entre los vértices, donde no existe restricción en el numero de flechas de un vértice a otro.

Multigrafo Dirigido
Ahora consideremos una representación gráfica de un mapa de carreteras en el cual una arista entre dos ciudades corresponde a un carril en una autopista entre las dos ciudades. Como a menudo hay autopistas de varios carriles entre pares de ciudades, esta representación origina un multigrafo.

La noción de multigrafo no dirigido puede definirse de manera similar a la de un multigrafo dirigido.

Multigrafo No Dirigido
Definición:
Un grafo ponderado (o grafo con peso) es un grafo en el cual hay datos asociados a sus lados, el valor w(ij) esta asociado con el lado (ij) y se llama ponderación o peso del lado (ij).
Definición:
Eel peso o ponderación de un grafo es la suma de los pesos de sus lados. Frecuentemente el peso de un camino se le conoce como longitud del camino.
Ejemplo: 
Si se interpretan las ciudades como vértices y los caminos entre ellas como sus lados, al asignarles un valor a sus caminos resulta un grafo ponderado o con peso.


Grafo Ponderado

Digrafos



Definición de digrafo: Un grafo orientado o grafo dirigido G (abreviadamente digrafo) consiste en un conjunto no vacío de elementos V, llamados vértices o nodos y un multiconjunto E de pares ordenados de V, llamados arcos o aristas.
  • Denotemos al digrafo por D = <V,E>
  • Si son vértices de D, entonces un arco rw   se dice que esta orientado o dirigido de o que une a .
  •  Denotemos por V(D) y E(D) a los conjuntos de vértices y aristas del grafo D respectivamente si estos no se mencionan explícitamente .
Definición de digrafo simple: Si un digrafo no tiene lazos ni arcos múltiples diremos que es un digrafo simple.
Definición de grafo subyacente: Sea D un digrafo. El grafo subyacente de D es el grafo que se obtiene reemplazando cada arco (orientado) de D por una arista no orientada.
Definición de arcos múltiples: Los arcos que unen el mismo par de vértices que tienen la misma dirección se llaman múltiples.
  • El arco que une a un vértice con el mismo se denomina lazo.
  • Un digrafo sin lazos ni arcos múltiples se dice que es simple.
Definición de subgrafo: Considere el digrafo D = <V, E>. Un subgrafo de D es un digrafo cuyos vértices son todos elementos de V y cuyos arcos son todos elementos de E.
Definición  de vértices adyacentes: Sean vértices de un digrafo. Diremos que es adyacente a si existe un arco edesde hasta que los une. Además si está dirigido de diremos que es incidente desde e incidente desde w .
Definición de grado exterior e interior: Sea D un digrafo sin lazos y sea un vértice de D. El grado exterior de es el número de arcos incidentes desde y lo denotaremos por extdeg ). El grado interior de es el número de arcos incidentes a y lo denotaremos por indeg ) .
  • En caso de que el digrafo tenga lazos, cada lazo aporta uno al grado interior y uno al grado exterior del vértice correspondiente.
  • Un vértice es aislado si extdeg( ) = indeg( ) = 0.
Lema (Handshaking lema): Sea D un digrafo, entonces
Definición de digrafos isomorfos : Dos digrafos  D1 y D2 son isomorfos y denotaremos , si existen bisecciones 
 ,
tales que para toda arista 
Definición de camino: Un camino C en un digrafo D es una secuencia de vértices de D tal que cumple al menos una de las condiciones siguientes:
      1. hay un solo vértice en la secuencia
      2. si k > 1 entonces 
      • Diremos que C conecta  y 
      • Llamaremos longitud del camino C a la cantidad de aristas que hay en él (en este caso k – 1)
      • Diremos que el camino es simple si, excepto el primero y el último, todos los vértices y aristas son diferentes.
      • Diremos que el camino C es un ciclo (circuito) si su longitud es al menos uno y coinciden el primero y el último vértice.
Proposición :   Sean vértices de un digrafo D. Si hay un camino que conecta a entonces también hay un camino simple que los conecta.
Se plantea el siguiente problema: Dado un digrafo D=<V,E> (E conjunto de arcos) con una función de pesos sobre E(D) y se desea hallar el costo del menor camino desde uno de esos vértices hasta otro cualquiera de V(D).[Ver algoritmos de Dijkstra y Floyd ]
Definición de digrafo conexo: Un digrafo D es conexo si su grafo subyacente es conexo.
Definición de digrafo fuertemente conexoUn digrafo es fuertemente conexo si para todo par ordenado de vértices hay un camino que los conecta.
  • Una componente fuertemente conexa del digrafo D es un subgrafo de D que es fuertemente conexo maximal, es decir, un subgrafo fuertemente conexo que no es subgrafo de ningún otro subgrafo fuertemente conexo.
Definición de torneo: Un torneo es un digrafo cuyo grafo subyacente es un grafo completo.
Definición de grafo orientable: Un grafo G se dice que es orientable si es grafo subyacente de algún digrafo fuertemente conexo, es decir, es posible orientar las aristas de modo tal que el digrafo obtenido es fuertemente conexo.
Definición de puente: Una arista en un grafo conexo G se llama puente si al removerla el grafo deja de ser conexo.
Teorema (Orientabilidad ): Un grafo conexo G es orientable si y sólo si no tiene puentes.
Para demostrar este teorema probemos primero el siguiente lema :
Lema: En un grafo sin puentes toda arista está contenida en algún ciclo.
Demostración del lema:
Sea la arista vw en un grafo G conexo sin puentes. Puesto que G no tiene puentes, si suprimimos a vw G seguirá siendo conexo y por lo tanto existirá un camino simple vu…w que no contiene a vw . Luego en G existe al menos el ciclo vu…wv .
Procedamos ahora a demostrar el teorema sobre la orientabilidad de un grafo:
Demostración :
Supongamos primero que G es orientable. Demostremos que G no tiene puentes. Supongamos por el contrario que G tiene una arista que es un puente. Como al suprimir G deja de ser conexo tenemos que une a dos componentes conexas disjuntas S1 y S2. Después de orientar a G, la arista e tendrá uno y solo uno de los dos sentidos posibles:
Pero esto contradice el echo de que, siendo G orientable debe ser también fuertemente conexo. Luego lo supuesto es falso y en consecuencia G no tiene puentes.
Supongamos ahora que G no tiene puentes,  probemos que es orientable. Puesto que G es conexo, según el lema demostrado arriba G tiene al menos un ciclo C. Orientemos las aristas de C a dextrorso (no tiene relevancia el sentido, solo se necesita el ciclo orientado) después de esto el digrafo G* formado por las aristas orientadas de C será fuertemente conexo.
Prosigamos de manera constructiva, en todo momento G* será el digrafo formado por todas las aristas de G.
Si G* contiene todos los vértices de G entonces ya tenemos a G. En caso contrario, puesto que G es conexo, existirá una arista, no orientada aún, que parte de un vértice de G*  a uno que no está en G* . Según el lema demostrado, la arista estará contenida en un ciclo del grafo G. Orientemos a las aristas de dicho ciclo comenzando por orientar la arista desde y parando en el primer vértice que pertenece a G* ; esto es totalmente realizable pues a lo sumo nos encontraremos con . Puesto que G*  es fuertemente conexo, se hace evidente que después de esta operación lo seguirá siendo.
Si aun quedan vértices en G que no están en G*  volvemos a realizar la operación descrita. Puesto que V (G) es finito, después de un número finito de aplicar este procedimiento habremos orientado el grafo G.
Definición de cadena: Un camino  en un digrafo D se dice que es una cadena si k = 1 o k > 1y las aristas  son distintas dos a dos.
  • Una cadena que contiene todas las aristas de D se llama cadena de Euler.
  • Una cadena cerrada es una cadena en la que el primer y último vértice coinciden.
  • Una cadena cerrada de Euler es una cadena de Euler que es cerrada.
  • El digrafo D se dice que es Euleriano si contiene una cadena de Euler.
Teorema (Conexidad y cadenas de Euler ): Sea D un digrafo conexo, luego:
  • D tiene una cadena cerrada de Euler si y sólo si el grado exterior y el grado interior de cada vértice son iguales.
  • D tiene una cadena de Euler que no es cerrada si y sólo si hay dos vértices de D tales que:
Definición de ciclo Hamiltoniano: Un ciclo de un digrafo D se dice que ciclo de Hamilton o ciclo Hamiltoniano si contiene todos los vértices de D.
  • Si el digrafo D es conexo se dice que es Hamiltoniano si contiene un ciclo de Hamilton.
  • Diremos que un camino es Hamiltoniano si contiene todos los vértices del digrafo.
Proposición: Todo torneo tiene un camino Hamiltoniano.
Teorema( Caminos de Hamilton ): Sea D un digrafo simple con |V(D)| = n :
  • Si se cumple que  D es Hamiltoniano.
  • Si para cualquier par de vértices no adyacentes se tiene que  entonces D es Hamiltoniano.

Grafos, definición


Muy importante es determinar, antes del análisis del término grafos, el origen etimológico del mismo pues nos permitirá conocer de primera mano el porqué de su significado actual. De esta manera podemos dejar patente que aquel emana de la palabra griegagrafo, graphein, que puede traducirse como “grabar o escribir”.
Este hecho es el que determina, por ejemplo, que hoy día utilicemos dicho concepto como parte indisoluble de otros términos a los que les da ese citado significado que está relacionado con la escritura. Este sería el ejemplo de bolígrafo que es un instrumento que utilizamos para escribir, grafólogo que es aquella persona que se dedica a determinar las cualidades psicológicas de alguien a través de la escritura que realiza, o el polígrafo que es quien se encarga de estudiar diversas formas de escribir que se llevan a cabo de forma secreta.
En la lingüística, un grafo  es un objeto unitario de naturaleza abstracta que abarca a lasgrafias que componen una letra. La palabra tiene origen griego y significa “imagen” o“dibujo”.
GrafosPara lasciencias de la computación y lamatemática, un grafo es unarepresentación gráfica de diversos puntos que se conocen como nodos o vértices, los cuales se encuentran unidos a través de líneas que reciben el nombre de aristas. Al analizar los grafos, los expertos logran conocer cómo se desarrollan las relaciones recíprocas entre aquellas unidades que mantienen algún tipo de interacción.
En este sentido no podemos pasar por alto el hecho de que el primer documento escrito que tenemos acerca de lo que son los grafos fue realizado en el siglo XVIII, y más concretamente en el año 1736, por Leonhard Euler. Este fue un matemático y físico, de origen suizo, que destacó por ser una de las figuras más importantes de su tiempo en la citada materia.
En concreto dicho autor realizó un artículo basándose en los puentes que existen en la ciudad de Kaliningrado. A partir de ellos, y mediante lo que es la teoría de los grafos, desarrolló una exposición acerca de los grafos y los vértices que se sustenta en el hecho de que es imposible regresar al vértice que ejerce como punto de partida sin antes no pasar por alguna de las aristas en dos ocasiones.
Los grafos pueden ser clasificarse de diversas maneras según sus características. Los grafossimples, en este sentido, son aquellos que surgen cuando una única arista logra unir dos vértices. Los grafos complejos, en cambio, presentan más de una arista en unión con los vértices.
Por otra parte, un grafo es conexo si dispone de dos vértices conectados a través de un camino. ¿Qué quiere decir esto? Que, para el par de vértices (p, r), tiene que existir algún camino que permita llegar desde p hasta r.
En cambio, un grafo es fuertemente conexo si el par de vértices tiene conexión a través de, como mínimo, dos caminos diferentes.
Un grafo simple, además, puede ser completo si las aristas están en condiciones de unir todos los pares de vértices, mientras que un grafo es bipartito si sus vértices surgen por la unión de un par de conjuntos de vértices y si se cumple una serie de condiciones

Probabilidad


Las probabilidades constituyen una rama de las matemáticas que se ocupa de medir o determinar cuantitativamente la posibilidad de que un suceso o experimento produzca un determinado resultado. La probabilidad está basada en el estudio de la combinatoria y es fundamento necesario de la estadística.
La creación de la probabilidad se atribuye a los matemáticos franceses del siglo XVII Blaise Pascal y Pierre de Fermat, aunque algunos matemáticos anteriores, como Gerolamo Cardano en el siglo XVI, habían aportado importantes contribuciones a su desarrollo.
La probabilidad matemática comenzó como un intento de responder a varias preguntas que surgían en los juegos de azar, por ejemplo saber cuántas veces se han de lanzar un par de dados para que la probabilidad de que salga seis sea el 50 por ciento.
La probabilidad de un resultado se representa con un número entre 0 y 1, ambos inclusive. La probabilidad 0 indica que el resultado no ocurrirá nunca, y la probabilidad 1 que el resultado ocurrirá siempre. Los problemas más sencillos estudian la probabilidad de un suceso favorable en un experimento o acontecimiento con un número finito de resultados, todos ellos con igual probabilidad de ocurrir.
Si un experimento tiene n posibles resultados, y f de ellos se consideran favorables, la probabilidad de un suceso favorable es f/n. Por ejemplo, un dado no trucado se puede lanzar de seis formas posibles, por tanto, la probabilidad de que salga un 5 ó un 6 es 2/6.
Problemas más complicados estudian acontecimientos en que los distintos resultados tienen distintas probabilidades de ocurrir. Por ejemplo, encontrar la probabilidad de que salga 5 ó 6 al lanzar un par de dados: los distintos resultados (2, 3,…12) tienen distintas probabilidades. Algunos experimentos pueden incluso tener un número infinito de posibles resultados, como la probabilidad de que una cuerda de circunferencia dibujada aleatoriamente sea de longitud mayor que el radio.
Los problemas que estudian experimentos repetitivos relacionan la probabilidad y la estadística. Algunos ejemplos: encontrar la probabilidad de obtener 5 veces un 3 y al menos 4 veces un 6 al lanzar un dado, sin hacer trampas, 50 veces; si una persona lanza una moneda al aire y da un paso hacia delante si sale cara y un paso hacia atrás si sale cruz, calcular la probabilidad de que, después de 50 pasos, la persona esté a menos de 10 pasos del origen.
El uso más generalizado de la probabilidad es su utilización en el análisis estadístico. Por ejemplo, la probabilidad de sacar 7 al lanzar dos dados es 1/6, lo que significa (se interpreta como) que al lanzar dos dados aleatoriamente y sin hacer trampas, un gran número de veces, alrededor de un sexto de los lanzamientos darán 7.
La probabilidad matemática se utiliza mucho en las ciencias físicas, biológicas y sociales, así como en el comercio y la industria. Se aplica a muchas áreas tan dispares como la genética, la mecánica cuántica y los seguros. También estudia problemas matemáticos teóricos de gran importancia y dificultad y está bastante relacionada con la teoría del análisis matemático, que se desarrolló a partir del cálculo.

Probabilidad Condicional


Vamos a examinaremos como la probabilidad de ciertos eventos depende o se ve influida por la ocurrencia de otros. Para ello veremos algunos ejemplos.

Ejemplo 27: Se seleccionan dos semillas aleatoriamente, una por una, de una bolsa que contiene 10 semillas de flores rojas y 5 de flores blancas. ¿Cuál es la probabilidad de que:
  1. La primera semilla sea roja?
  2. La segunda semilla sea blanca dado que la primera fue roja?
Solución:
  1. La probabilidad de que la primera semilla sea roja es , puesto que hay 10 semillas de flores rojas de un total de 15. Escrito con notación de probabilidad tenemos: 
  2. La probabilidad de que la segunda semilla sea blanca se ve influida por lo que salió primero, es decir esta probabilidad está sujeta a una condición, la de que la primera semilla sea roja. Este tipo de probabilidad se le llama probabilidad condicional y se denota por 
, y se lee: la probabilidad de B2 dado R1.
Esta probabilidad , puesto que todavía hay 5 semillas blancas en un total de 14 restantes.
Veamos la situación en un diagrama de árbol:
Definición de Probabilidad Condicional: Para dos eventos cualesquiera A y B en un espacio muestra S, tales que P(A) > 0 con P(A) ¹ 0, la probabilidad del evento B dado el evento A, se define por .


Ejemplo 28: Una persona lanza una moneda 3 veces, ¿Cuál es la probabilidad de obtener 3 águilas dado que salió por lo menos un águila?

Solución: El espacio muestra del experimento de lanzar una moneda 3 veces es


S = {aaa, aas, asa, ass, saa, sas, ssa, sss}

El evento A de que por lo menos hay un águila en los tres lanzamientos es:


A = {aaa, aas, asa, ass, saa, sas, ssa}

El evento B de que obtenga 3 águilas es B = {aaa}

Por lo tanto, AÇ B ={aaa} y 

De donde 

Nótese que es la probabilidad de una ocurrencia en las siete que son posibles en A; es decir, calcular la probabilidad condicional de B dado A es como calcular la probabilidad de B con relación al conjunto A, como si éste fuera un nuevo espacio muestra S* = A.

Proposición 3.5: Para dos eventos A y B cualesquiera del espacio muestra S,

Demostración: Para cualquier evento B,

Como los eventos (BÇ A) y (BÇ AC) son mutuamente exclusivos y su unión es B, entonces por el axioma 3, tenemos:  [3.3]

Despejando P(AÇ B) de la definición de probabilidad condicional, tenemos
P(AÇ B) = P(A) P(B/A) y P(ACÇ B) = P(AC) P (B/AC)
Sustituyendo en [3.3] se tiene P(B) = P(A) P(B/A) + P(AC) P (B/AC).
Obsérvese que en un diagrama de árbol si se multiplica
P(A) P(B/A) = P(AÇ B) y P(AC) P(B/AC) = P(ACÇ B)

Ejemplo 29: Consideremos dos cajas, la caja 1 contiene 3 esferitas blancas y 4 rojas y la caja 2 contiene 8 blancas y 4 rojas. Se selecciona una caja al azar y luego se extrae una esfera al azar. Hallar la probabilidad de que la esfera sea blanca.


Solución: Sea A el evento de seleccionar la caja 1 y AC el evento de seleccionar la caja 2, entonces P(A) = P(AC) = 1/2 ya que cualquiera de las dos cajas tiene la misma probabilidad de ser extraída. Sea B el evento de seleccionar una esfera blanca, entonces P(B/A) = 3/7 ya que en la caja 1 hay 3 esferas blancas en un total de 7 y P(B/AC) = 8/12 porque en la caja 2 hay 8 esferas blancas en un total de 12.
Ahora bien, por la proposición 3.5 tenemos:

Combinaciones


Se llama combinaciones de m elementos tomados de n en n (m ≥ n) a todas las agrupaciones posibles que pueden hacerse con los m elementos de forma que:
No entran todos los elementos.
No importa el orden.
No se repiten los elementos.
Combinaciones
También podemos calcular las combinaciones mediante factoriales:
Combinaciones

Combinaciones con repetición

Las combinaciones con repetición de m elementos tomados de n en n (m ≥ n), son los distintos grupos formados por n elementos de manera que:
No entran todos los elementos.
No importa el orden.
 se repiten los elementos.
Combinaciones con repetición

Números combinatorios

El número  combinaciones  se llama también número combinatorio. Se representa por número combinatorio y se lee "m sobre n".
número condenatorio

Propiedades de los números combinatorios

1. propiedades
2.números combinatorios complementarios
3.propiedad

Binomio de Newton

La fórmula que nos permite hallar las potencias de un binomio se conoce como binomio de Newton.
binomio