Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Gauss

#1
Muchas gracias por responder!
Claro es verdad, estaba sacando mal el punto medio, como dijo dijsktra. Para la primer división sirve pero para toda la segunda mitad de la primera división ya no. La forma correcta es la que mencionas, (inicio+fin)/2 para obtener el punto medio de cada subdivisión.
Con ese punto medio hice la forma propuesta por YreX-DwX, quedando muy similar a como estaba el programa al inicio, lo dejo abajo por las dudas:

#include <iostream>
#include <cstdlib>
using namespace std;
int sumaDyV( int *vec, int inicio, int fin );

int main() {
    int longitud;
    cout<<"Dimension del vector: ";
    cin>>longitud;
    int *vec = new int[longitud];
    for(int i = 0; i<longitud;i++) {
        cout<<"\nNumero en la posicion "<<i<<": ";
        cin>>vec[i];
    }
    cout<<"\nResultado: "<<sumaDyV( vec, 0, longitud-1 );
    delete[] vec;
    return 0;
}

int sumaDyV( int *vec, int inicio, int fin ) {
    if( inicio == fin ) {
        return vec[inicio];
    }
    if( (fin - inicio) == 1) {
        return sumaDyV(vec, inicio, inicio) + sumaDyV( vec, fin, fin);
    }
    else {
        return sumaDyV(vec, inicio, (inicio+fin)/2) + sumaDyV( vec, ((inicio+fin)/2)+1, fin);
    }
}


Voy a tener en cuenta usar el [i,...,j) con if ( i == j )  return 0; para subsegmentos.
Gracias!

#2
Hola, andaba con un problema corto y quería ver si alguien me podía ayudar.
La cuestión es que tengo que sumar todos los elementos de un vector cualquiera usando la técnica divide y vencerás.
Yo estuve haciendo este código pero tengo problemas con los índices inicio y fin

#include <iostream>
#include <cstdlib>
using namespace std;
int sumaDyV( int *vec, int inicio, int fin );

int main() {
    int longitud;
    cout<<"Dimension del vector: ";
    cin>>longitud;
    int *vec = new int[longitud];
    for(int i = 0; i<longitud;i++) {
        cout<<"\nNumero en la posicion "<<i<<": ";
        cin>>vec[i];
    }
    cout<<"\nResultado: "<<sumaDyV( vec, 0, longitud-1 );
    delete[] vec;
    return 0;
}

int sumaDyV( int *vec, int inicio, int fin ) {
    if( inicio == fin ) {
        return vec[inicio];
    }
    return sumaDyV(vec, inicio, fin/2) + sumaDyV( vec, (fin/2) +1, fin);
}

Hay veces en las que el índice de inicio es mayor al del fin, a causa de la división, cuando le pongo algún +1 para que eso no pase el problema está en otros índices.
Gracias.

#3
Muchas gracias!
#4
Hola buenas tardes, estaba leyendo sobre Tablas Hash y quería implementar una desde 0, lo primero que quise hacer son unas funciones hash, la que es para strings(si le ingresan como clave "ab" devuelve la suma de los códigos ASCII, "ab" = 97+98 = 195) y la de plegamiento(si le ingresan una clave entera devuelve la suma de unas partes, para la clave 42531 -> 42 + 53 + 1 = 96). El (suma%tamanioTabla) es para que el índice que devuelva esté en el rango de la tabla.

Mi duda es más teórica creo, porque según tengo entendido las funciones Hash son de orden O(1), osea que son rápidas al no iterar y obtener el resultado/ingreso/borrado directamente. Pero en las funciones Hash que hice hay bucles, por ejemplo en el de los strings hay tantos bucles como longitud de la palabra clave y si las claves son largas el programa va perdiendo eficiencia.
Entonces son válidas esas funciones Hash? o debería ingeniármelas de alguna forma para hacer las funciones Hash sin bucles para que no dependan de la clave?
Gracias.

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>

using namespace std;

int funcionHashStrings(string clave, int tamanioTabla);
int funcionHashPlegamiento(int llave, int tamanioTabla);


int main() {
    int tamanio;
    cout<<"Ingrese el tamaño de la tabla: ";
    cin>>tamanio;

    //PRUEBA FUNCIÓN HASH DE STRINGS
    /*string palabra;
    cout<<"\nIngrese una clave string: ";
    cin>>palabra;
    cout<<"Indice devuelvo por la funcion Hash: "<<funcionHashStrings(palabra,tamanio);*/

    //PRUEBA PLEGAMIENTO
    int llave;
    cout<<"Ingrese la clave(numero entero): ";
    cin>>llave;
    cout<<endl;
    cout<<"Devuelve como indice el numero: "<<funcionHashPlegamiento(llave,tamanio);
    return 0;
}

int funcionHashStrings(string clave, int tamanioTabla){
    int suma = 0;
    for(unsigned i=0 ; i< clave.length(); i++) {
        cout<<clave[i]<<": "<<(int)clave[i]<<endl;
        suma += (int)clave[i];
    }
    cout<<"Suma: "<<suma<<endl;
    return (suma%tamanioTabla); //Método del resto
}

int funcionHashPlegamiento(int llave, int tamanioTabla) {
    string cadena,aux1="--", aux2= "-";
    int suma=0;
    cadena = static_cast<ostringstream*>(&(ostringstream() << llave))->str();
    cout<<cadena<<" = ";
    for(unsigned i=0; i<cadena.length(); i+=2) {
        if((i+1) == cadena.length()) {
            aux2[0] = cadena[i];
            cout<<atoi(&aux2[0])<<" ";
            suma+= (atoi(&aux2[0]));
        }
        else {
            aux1[0] = cadena[i];
            aux1[1]=cadena[i+1];
            cout<<aux1<<" ";
            suma+= (atoi(aux1.c_str()));
        }
    }
    cout<<"= "<<suma<<endl;
    return (suma%tamanioTabla);
}
#5
Muchas gracias por sus respuestas.
Lo de ingresar primero los datos desde la terminal y después pasar al modo gráfico(en mi caso particular) no me estaría sirviendo, ya que la idea es que se ilustre como se van acomodando los nodos al ser ingresados uno a uno. Pero basándome en lo que dijiste podría tener una ventana de terminal abierta que junte los datos y la otra que va graficando al mismo tiempo(no se me había ocurrido), está buena la idea que mencionas porque en ese caso podría usar cualquier librería gráfica, tenga o no permitido el ingreso de strings, ya que los tomo desde la terminal.
Lo de SDL, lo había visto muy por arriba y pasé a buscar otra convencido de que no permitía entrada de texto. Ahora que investigo mejor veo que sí se puede.
Voy a probar las 2 a ver con cuál me quedo, muchas gracias!
#6
 Hola buenas, quería saber si me podían recomendar alguna librería gráfica en la que se permita pedirle por pantalla algún texto al usuario. Me conformaría con algo sencillo como MiniWin pero en lo que viene siendo entrada de texto se complica, igual probé con otras similares como SFML. Son de gráficos pero no le permiten al usuario ingresar texto.
Por el otro extremo, también vi algo de QT pero como el trabajo que tengo que hacer es sobre árboles(binarios y balanceados) no sé si sea conveniente usarlo(cambia mucho de C++ a qt)
En resumen, andaba buscando algo en lo que pueda hacer gráficos simples pero también cosas como pedirle datos al usuario(para los nodos del árbol). Gracias de antemano.

PD: Disculpas si no lo mandé en el lugar adecuado, primera pregunta que hago.