Y para redondear el día, os dejo para que echéis un vistazo el algoritmo del árbol binario de Huffman. En C y de forma dinámica. Hasta luego!!!
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
const int maxsize = 100;
const int null = 0;
struct huff_node
{
char symbol;
int freq;
huff_node *parent;
char childtype;
};
typedef huff_node *ptr;
ptr node[maxsize];
void create(int k);
void print(int k);
void twosmall(ptr &p, ptr &q, int numnode);
int main()
{
int numsymbols;
ptr p, q, r;
cout << "Introduce el numero de simbolos: ";
cin >> numsymbols;
for (int i = 0; i < numsymbols; i++)
create(i);
for (int j = numsymbols; j < 2*numsymbols - 1; j++)
{
r = new huff_node;
node[j] = r;
r->parent = null;
twosmall(p, q, j);
p->parent = r;
q->parent = r;
p->childtype = 'L';
q->childtype = 'R';
r->symbol = ' ';
r->freq = p->freq + q->freq;
}
cout << endl << endl;
cout <<"simbolo-codigo: " << endl;
for (int k = 0; k < numsymbols; k++)
print(k);
getch();
return 0;
}
void create(int k)
{
ptr t = new huff_node;
cout << "introduce el simbolo numero " << k+1 << ": ";
cin >> t->symbol;
cout << "introduce su frecuencia: ";
cin >> t->freq;
t->parent = null;
node[k] = t;
}
void print(int k)
{
ptr t = node[k];
char code[10];
int size = 0;
cout << t->symbol << " - ";
while (t->parent != null)
{
if (t->childtype == 'L')
code[size] = '0';
else
code[size] = '1';
t = t->parent;
size++;
}
for (int j = size-1; j >= 0; j--)
cout << code[j];
cout << endl;
}
void twosmall(ptr &p, ptr &q, int numnodes)
{
int min1 = 9999;
int min2 = 9999;
p = null;
q = null;
for (int i = 0; i < numnodes; i++)
{
if (node[i]->parent == null)
{
if (node[i]->freq < min1)
{
min2 = min1;
min1 = node[i]->freq;
q = p;
p = node[i];
}
else
if (node[i]->freq < min2)
{
min2 = node[i]->freq;
q = node[i];
}
}
}
}
sábado, 25 de febrero de 2012
Algoritmo de Floyd
Os dejo el algoritmo de Floyd, para el que lo necesite. Esta realizado de forma dinámica en C. Espero que os sea útil!!!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define max 50
int floyd(int matriz[max][max],int n);
int main(){
int n,i,j;
int matriz[max][max];
printf("\n PROBLEMA DE FLOYD");
printf("\n\n Introduce el valor de nodos: ");
scanf("%d",&n);
for (i=0;i<n;i++){
for (j=0;j<n;j++){
printf(" Introduce el peso entre los nodos [%d][%d]: ",i,j);
scanf("%d",&matriz[i][j]);
}
}
floyd(matriz,n);
printf("\n");
printf("\n");
system("pause");
return 1;
}
int floyd(int matriz[max][max],int n){
int i,j,k;
int mat[n][n],resul[n][n];
for (i=0;i<n;i++){
for (j=0;j<n;j++){
mat[i][j]=matriz[i][j];
}
}
for (i=0;i<=n;i++){
for (j=0;j<n;j++){
for (k=0;k<n;k++){
if (mat[i][j]<(mat[i][k]+mat[k][j]))
mat[i][j]=mat[i][j];
else
mat[i][j]=(mat[i][k]+mat[k][j]);
}
}
}
printf("La matriz resultante (minima) es:\n");
for (i=0;i<n;i++){
for (j=0;j<n;j++){
printf("%d ",mat[i][j]);
}
printf("\n");
}
}
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define max 50
int floyd(int matriz[max][max],int n);
int main(){
int n,i,j;
int matriz[max][max];
printf("\n PROBLEMA DE FLOYD");
printf("\n\n Introduce el valor de nodos: ");
scanf("%d",&n);
for (i=0;i<n;i++){
for (j=0;j<n;j++){
printf(" Introduce el peso entre los nodos [%d][%d]: ",i,j);
scanf("%d",&matriz[i][j]);
}
}
floyd(matriz,n);
printf("\n");
printf("\n");
system("pause");
return 1;
}
int floyd(int matriz[max][max],int n){
int i,j,k;
int mat[n][n],resul[n][n];
for (i=0;i<n;i++){
for (j=0;j<n;j++){
mat[i][j]=matriz[i][j];
}
}
for (i=0;i<=n;i++){
for (j=0;j<n;j++){
for (k=0;k<n;k++){
if (mat[i][j]<(mat[i][k]+mat[k][j]))
mat[i][j]=mat[i][j];
else
mat[i][j]=(mat[i][k]+mat[k][j]);
}
}
}
printf("La matriz resultante (minima) es:\n");
for (i=0;i<n;i++){
for (j=0;j<n;j++){
printf("%d ",mat[i][j]);
}
printf("\n");
}
}
martes, 14 de febrero de 2012
Algoritmo de los almacenes
Trata sobre el problema de donde situar unos almacenes para que sea óptimo para un número de ciudades situadas en ciertas coordenadas. Realizado mediante algoritmo voraces con un coste O(n^3).
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX 9999999
#define MIN -999
struct ciudad{
int x;
int y;
int poblacion;
};
float calcdistancia(int x, int y, int n, struct ciudad city[]);
void inicializar(int *xini, int *yini, int *xfin, int *yfin, float *distanciaSolucion);
int main(int argc, char *argv[]){
int n;
int xini, yini, xfin, yfin;
float distanciaSolucion, distancia=MAX,solX,solY;
printf("PROBLEMA DE LOS ALMACENES \n\n\n");
printf("Introduce el numero de ciudades del sistema: ");
scanf("%d",&n);
struct ciudad city[n];
int i;
for(i=0; i<n; i++){
printf("\nIntroduce las coordenadas para la ciudad %d \n",i+1);
printf(" Coordenada x "); scanf("%d",&city[i].x);
printf(" Coordenada y "); scanf("%d",&city[i].y);
printf(" Numero de habitantes aproximado "); scanf("%d",&city[i].poblacion);
}
inicializar(&xini, &yini, &xfin, &yfin, &distanciaSolucion);
i=0;
for(i=0; i<n; i++){
if(city[i].x <xini) xini=city[i].x;
if(city[i].y <yini) yini=city[i].y;
if(city[i].x >xfin) xfin=city[i].x;
if(city[i].y >yfin) yfin=city[i].y;
}
int h;
for (h=xini; h<=xfin; h++){
int j;
for (j=yini; j<=yfin; j++){
float distanciaActual = calcdistancia(h, j, n, city);
if (distanciaSolucion > distanciaActual){
distanciaSolucion = distanciaActual;
solX = h;
solY = j;
}
}
}
printf("\n\n");
printf("\nLas Coordenadas optimas para el almacen son, x %f y %f\n", solX, solY, distanciaSolucion);
system("PAUSE");
return 1;
}
void inicializar(int *xini, int *yini, int *xfin, int *yfin, float *distanciaSolucion){
*xini=MAX;
*yini=*xini;
*xfin=MIN;
*yfin=*xfin;
*distanciaSolucion=MAX;
}
float calcdistancia(int x, int y, int n, struct ciudad city[]){
float d=0;
int i;
for(i=0; i<n; i++)
d +=sqrt(pow((x-city[i].x),2) + pow((y -city[i].y), 2))* city[i].poblacion;
return d;
}
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX 9999999
#define MIN -999
struct ciudad{
int x;
int y;
int poblacion;
};
float calcdistancia(int x, int y, int n, struct ciudad city[]);
void inicializar(int *xini, int *yini, int *xfin, int *yfin, float *distanciaSolucion);
int main(int argc, char *argv[]){
int n;
int xini, yini, xfin, yfin;
float distanciaSolucion, distancia=MAX,solX,solY;
printf("PROBLEMA DE LOS ALMACENES \n\n\n");
printf("Introduce el numero de ciudades del sistema: ");
scanf("%d",&n);
struct ciudad city[n];
int i;
for(i=0; i<n; i++){
printf("\nIntroduce las coordenadas para la ciudad %d \n",i+1);
printf(" Coordenada x "); scanf("%d",&city[i].x);
printf(" Coordenada y "); scanf("%d",&city[i].y);
printf(" Numero de habitantes aproximado "); scanf("%d",&city[i].poblacion);
}
inicializar(&xini, &yini, &xfin, &yfin, &distanciaSolucion);
i=0;
for(i=0; i<n; i++){
if(city[i].x <xini) xini=city[i].x;
if(city[i].y <yini) yini=city[i].y;
if(city[i].x >xfin) xfin=city[i].x;
if(city[i].y >yfin) yfin=city[i].y;
}
int h;
for (h=xini; h<=xfin; h++){
int j;
for (j=yini; j<=yfin; j++){
float distanciaActual = calcdistancia(h, j, n, city);
if (distanciaSolucion > distanciaActual){
distanciaSolucion = distanciaActual;
solX = h;
solY = j;
}
}
}
printf("\n\n");
printf("\nLas Coordenadas optimas para el almacen son, x %f y %f\n", solX, solY, distanciaSolucion);
system("PAUSE");
return 1;
}
void inicializar(int *xini, int *yini, int *xfin, int *yfin, float *distanciaSolucion){
*xini=MAX;
*yini=*xini;
*xfin=MIN;
*yfin=*xfin;
*distanciaSolucion=MAX;
}
float calcdistancia(int x, int y, int n, struct ciudad city[]){
float d=0;
int i;
for(i=0; i<n; i++)
d +=sqrt(pow((x-city[i].x),2) + pow((y -city[i].y), 2))* city[i].poblacion;
return d;
}
viernes, 10 de febrero de 2012
Algoritmo de las Monedas
Hoy os dejo el algoritmo típico de los Voraces, el problema del cambio de monedas. Espero que os resulte útil!
#include <stdio.h>
#include <stdlib.h>
float datos();
void calcular(float devolver,int cambio[15], float monedas[15]);
int main(int argc, char *argv[]){
float monedas[] = {500, 200, 100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01};
int cambio[]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
float devolver;
printf("Introduce el importe que debemos devolver ");
scanf("%f",&devolver);
printf("\n %f",devolver);
calcular(devolver, cambio, monedas);
printf("\n");
for(int i=0;i<15;i++)
printf("\n Monedas de %.2f = %d ",monedas[i],cambio[i]);
printf("\n");
system("PAUSE");
return 1;
}
void calcular(float devolver, int cambio[15], float monedas[15]){
int i=0;
while(devolver>0){
if(monedas[i]<=devolver){
devolver-=monedas[i];
cambio[i]++;
}
else i++;
}
}
#include <stdio.h>
#include <stdlib.h>
float datos();
void calcular(float devolver,int cambio[15], float monedas[15]);
int main(int argc, char *argv[]){
float monedas[] = {500, 200, 100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01};
int cambio[]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
float devolver;
printf("Introduce el importe que debemos devolver ");
scanf("%f",&devolver);
printf("\n %f",devolver);
calcular(devolver, cambio, monedas);
printf("\n");
for(int i=0;i<15;i++)
printf("\n Monedas de %.2f = %d ",monedas[i],cambio[i]);
printf("\n");
system("PAUSE");
return 1;
}
void calcular(float devolver, int cambio[15], float monedas[15]){
int i=0;
while(devolver>0){
if(monedas[i]<=devolver){
devolver-=monedas[i];
cambio[i]++;
}
else i++;
}
}
lunes, 6 de febrero de 2012
Algoritmo de Dijkstra
Os dejo el algoritmo de Dijkstra en C, realizado por el método de los algoritmos Voraces. Espero que os sesa útil!!
#include <stdio.h>
#include <stdlib.h>
#define MAX 7
#define DISTMAX 998
int seleccionados(int *selec){
int i;
for(i=0;i<MAX;i++)
if(selec[i]==0)
return 0;
return 1;
}
void shortpath(int coste[][MAX],int *ant,int *distancia){
int selec[MAX]={0};
int actual=0,i,k,dc,menordist,nuevadist;
for(i=0;i<MAX;i++)
distancia[i]=DISTMAX;
selec[actual]=1;
distancia[0]=0;
actual=0;
while(!seleccionados(selec)){
menordist=DISTMAX;
dc=distancia[actual];
for(i=0;i<MAX;i++){
if(selec[i]==0){
nuevadist=dc+coste[actual][i];
if(nuevadist<distancia[i]){
distancia[i]=nuevadist;
ant[i]=actual;
}//if
if(distancia[i]<menordist){
menordist=distancia[i];
k=i;
}//if(disstance..
}//if(selec..
}//for
actual=k;
selec[actual]=1;
}
}
int main(){
//Inicializamos
int coste[MAX][MAX]={{DISTMAX,2,4,7,DISTMAX,5,DISTMAX},{2,DISTMAX,DISTMAX,6,3,DISTMAX,8},{4,DISTMAX,DISTMAX,DISTMAX,DISTMAX,6,DISTMAX},{7,6,DISTMAX,DISTMAX,DISTMAX,1,6},{DISTMAX,3,DISTMAX,DISTMAX,DISTMAX,DISTMAX,7},{5,DISTMAX,6,1,DISTMAX,DISTMAX,6},{DISTMAX,8,DISTMAX,6,7,6,DISTMAX}};
printf("\n Vamos a mostrar el arbol");
for(int j=0;j<MAX;j++){
printf("\n\n");
for (int h=0;h<MAX;h++)
printf("\norigen %d destino %d coste %d ", j,h,coste[j][h]);
// coste %d ", j,h,coste[j][h]);
}
int i,ant[MAX]={0},distancia[MAX];
shortpath(coste,ant,distancia);
printf("\n");
for(i=0;i<MAX;i++)
printf("\nEl coste al nodo %d es %d\n",i,distancia[i]);
printf("\n");
system("PAUSE");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define MAX 7
#define DISTMAX 998
int seleccionados(int *selec){
int i;
for(i=0;i<MAX;i++)
if(selec[i]==0)
return 0;
return 1;
}
void shortpath(int coste[][MAX],int *ant,int *distancia){
int selec[MAX]={0};
int actual=0,i,k,dc,menordist,nuevadist;
for(i=0;i<MAX;i++)
distancia[i]=DISTMAX;
selec[actual]=1;
distancia[0]=0;
actual=0;
while(!seleccionados(selec)){
menordist=DISTMAX;
dc=distancia[actual];
for(i=0;i<MAX;i++){
if(selec[i]==0){
nuevadist=dc+coste[actual][i];
if(nuevadist<distancia[i]){
distancia[i]=nuevadist;
ant[i]=actual;
}//if
if(distancia[i]<menordist){
menordist=distancia[i];
k=i;
}//if(disstance..
}//if(selec..
}//for
actual=k;
selec[actual]=1;
}
}
int main(){
//Inicializamos
int coste[MAX][MAX]={{DISTMAX,2,4,7,DISTMAX,5,DISTMAX},{2,DISTMAX,DISTMAX,6,3,DISTMAX,8},{4,DISTMAX,DISTMAX,DISTMAX,DISTMAX,6,DISTMAX},{7,6,DISTMAX,DISTMAX,DISTMAX,1,6},{DISTMAX,3,DISTMAX,DISTMAX,DISTMAX,DISTMAX,7},{5,DISTMAX,6,1,DISTMAX,DISTMAX,6},{DISTMAX,8,DISTMAX,6,7,6,DISTMAX}};
printf("\n Vamos a mostrar el arbol");
for(int j=0;j<MAX;j++){
printf("\n\n");
for (int h=0;h<MAX;h++)
printf("\norigen %d destino %d coste %d ", j,h,coste[j][h]);
// coste %d ", j,h,coste[j][h]);
}
int i,ant[MAX]={0},distancia[MAX];
shortpath(coste,ant,distancia);
printf("\n");
for(i=0;i<MAX;i++)
printf("\nEl coste al nodo %d es %d\n",i,distancia[i]);
printf("\n");
system("PAUSE");
return 0;
}
viernes, 3 de febrero de 2012
Elemento Mayoritario en un Vector
Os dejo el algoritmo para saber si hay algún elemento mayoritario en un vector. Es un ejemplo sencillo, se puede modificar la forma de conseguir el vector. Yo lo tengo para un problema que era "PROBLEMA DE RODAMIENTOS". Está realizado por el método de Divide y Vence en C. Espero que os sea útil.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 5
bool xmayoritario (float T [MAX] , float x );
float buscar (float T[MAX]);
int main(int argc, char *argv[])
{
float arrayM[MAX],arrayNM[MAX];
arrayM[0]=1.6;
arrayNM[0]=1.1;
arrayM[1]=1.6;
arrayNM[1]=2.2;
arrayM[2]=1.4;
arrayNM[2]=3.3;
arrayM[3]=1.6;
arrayNM[3]=4.4;
arrayM[4]=1.1;
arrayNM[4]=5.5;
int i;
printf("PROBLEMA DE LOS RODAMIENTOS \n\n");
printf("\nLos rodamientos de la caja 1 tienen el siguiente tamaño\n");
for (i=0;i<MAX;i++){
printf("\n %f",arrayM[i]);
}
printf("\n\nLos rodamientos de la caja 2 tienen el siguiente tamaño\n\n");
for (i=0;i<MAX;i++){
printf("\n %f",arrayNM[i]);
}
float solok=buscar(arrayM);
if (solok>0){
printf("\n\nSe ha encontrado el tamaño de un rodamiento mayoritario en la caja 1 y es: %f\n\n",solok);
}else{
printf("\n\nNo hay tamaño de rodamiento mayoritario en la caja 1\n\n");
}
solok=buscar(arrayNM);
if (solok>0){
printf("\n\nSe ha encontrado el tamaño de un rodamiento mayoritario en la caja 2 y es: %f\n\n",solok);
}else{
printf("\n\nNo hay tamaño de rodamiento mayoritario en la caja 2\n\n");
}
system("PAUSE");
return 0;
}
bool xmayoritario (float T [MAX] , float x ){
int k=0;
int j;
for (j=0;j<MAX;j++)
if(T[j]==x)
k++;
return(k>=MAX/2);
}
float buscar(float T[MAX]){
int i;
for (i=0;(i<MAX/2);i++)
if (xmayoritario (T ,T[i]))
return T[i];
return -1;
}
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 5
bool xmayoritario (float T [MAX] , float x );
float buscar (float T[MAX]);
int main(int argc, char *argv[])
{
float arrayM[MAX],arrayNM[MAX];
arrayM[0]=1.6;
arrayNM[0]=1.1;
arrayM[1]=1.6;
arrayNM[1]=2.2;
arrayM[2]=1.4;
arrayNM[2]=3.3;
arrayM[3]=1.6;
arrayNM[3]=4.4;
arrayM[4]=1.1;
arrayNM[4]=5.5;
int i;
printf("PROBLEMA DE LOS RODAMIENTOS \n\n");
printf("\nLos rodamientos de la caja 1 tienen el siguiente tamaño\n");
for (i=0;i<MAX;i++){
printf("\n %f",arrayM[i]);
}
printf("\n\nLos rodamientos de la caja 2 tienen el siguiente tamaño\n\n");
for (i=0;i<MAX;i++){
printf("\n %f",arrayNM[i]);
}
float solok=buscar(arrayM);
if (solok>0){
printf("\n\nSe ha encontrado el tamaño de un rodamiento mayoritario en la caja 1 y es: %f\n\n",solok);
}else{
printf("\n\nNo hay tamaño de rodamiento mayoritario en la caja 1\n\n");
}
solok=buscar(arrayNM);
if (solok>0){
printf("\n\nSe ha encontrado el tamaño de un rodamiento mayoritario en la caja 2 y es: %f\n\n",solok);
}else{
printf("\n\nNo hay tamaño de rodamiento mayoritario en la caja 2\n\n");
}
system("PAUSE");
return 0;
}
bool xmayoritario (float T [MAX] , float x ){
int k=0;
int j;
for (j=0;j<MAX;j++)
if(T[j]==x)
k++;
return(k>=MAX/2);
}
float buscar(float T[MAX]){
int i;
for (i=0;(i<MAX/2);i++)
if (xmayoritario (T ,T[i]))
return T[i];
return -1;
}
Suscribirse a:
Entradas (Atom)