Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: David_RM en 10 Noviembre 2011, 18:29 pm



Título: Busqueda binaria de un array desordenado
Publicado por: David_RM en 10 Noviembre 2011, 18:29 pm
Necesito hacer un código que haga la busqueda binaria de un array no ordenado. Entiendo el código usual pero a la hora de discriminar entre los dos sub-arrays no se muy bien que hacer.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: ghastlyX en 10 Noviembre 2011, 19:40 pm
La búsqueda binaria la puedes aplicar cuando tienes una función de entrada (en tu caso un array) que es monótona. Si el array no está ordenado, una búsqueda binaria no es correcta por motivos evidentes si entiendes como funciona con un array ordenado. Si quieres buscar un elemento en concreto necesitarás hacer una búsqueda lineal.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: David_RM en 11 Noviembre 2011, 11:06 am
El algoritmo lo que hacer es dividir recursivamente el array en dos partes iguales, hasta llegar al caso base que es que el array tenga un elemento


Título: Re: Busqueda binaria de un array desordenado
Publicado por: satu en 11 Noviembre 2011, 11:45 am
Hola

Pero si el array no está ordenado qué criterio utilizas para dividirlo??

Saludos


Título: Re: Busqueda binaria de un array desordenado
Publicado por: David_RM en 11 Noviembre 2011, 12:47 pm
Siempre en dos mitades iguales. Ejemplo:
[5,7,8,3,4,9,1,3] se divide [5,7,8,3] y [4,9,1,3]. A su vez [5,7,8,3] se divide en [5,7] y [8,3]. [5,7] se divide en [5] y [7], con arrays de un elemento que es el caso base.

El problema es como implementar todo ese algoritmo en C.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: Ruso_x en 11 Noviembre 2011, 14:12 pm
La búsqueda binaria la puedes aplicar cuando tienes una función de entrada (en tu caso un array) que es monótona.

Como bien dijo ghastlyX hay que tener un array ordenado, el procedimiento el cual me enseñaron es hacer una ordenacion tipo Bubble, i cuando terminas puedes hacer la busqueda binaria, en otro caso la unica solucion es una busqueda lineal.

Divides el array en 2 i compruebas si el elemento que busquas es > o < que el elemento que has utilizado para dividir el array EJ.

Suponemos un array ordenado:

2245566789 i buscamos el 8 entonces primero

2245 /5/ 66789 el elemento top(numero de elementos/2) (el segundo 5)
es el elemento que buscas?? => NO
es menor o mayor? = menor entonces tiene que estar en el array de la derecha

66789 => 66 /7/ 89

es el elemento que buscas?? => NO
es menor o mayor? = menor entonces tiene que estar mas a la derecha

|8| / 9
es el elemnto que buscas?? => SI



Título: Re: Busqueda binaria de un array desordenado
Publicado por: LearningSpanishProgrammer en 11 Noviembre 2011, 14:41 pm
Puedes hacer busqueda binaria en un arreglo desordenado!

Solo necesita crear un arreglo de índices y ordenalo usando el arreglo de valores.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: David_RM en 11 Noviembre 2011, 18:37 pm
Bueno, voy avanzando, ya tengo el código:

int buscaElemento(int n, const Vector v, int inf, int sup){
   double res1;
   double res2;
   double res = -1.0;

   if(sup-inf == 0){
      if(v[inf] == n){
         res = inf;
      }
   } else {
        res1 = buscaElemento(n, v, inf, sup-inf/2);
        res2 = buscaElemento(n, v, (sup-inf/2)+1, sup);
   }

   if(res1 != -1.0){
      res = res1;
   } else if(res2 != -1.0){
      res = res2;
   }

   return res;
}

El problema ahora es que no funciona, se pilla el programa, supongo que será por las conversiones entre int y double no?


Título: Re: Busqueda binaria de un array desordenado
Publicado por: ghastlyX en 11 Noviembre 2011, 20:06 pm
Como ya dije antes, si el array está desordenado, NO se puede hacer una búsqueda binaria, puesto que sería incorrecta. Si tienes que hacer una binaria por algún motivo, lo tendrás que ordenar antes.

Así que por mucho que lo intentes, el código es imposible que funcione sobre un vector desordenado.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: Don Pollo en 11 Noviembre 2011, 20:10 pm
Realizar una búsqueda binaria en un array desordenado es totalmente absurdo.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: David_RM en 11 Noviembre 2011, 22:45 pm
Ya expliqué como es el algoritmo. Se qué es absurdo, pero es lo que me han pedido en la facultad xD


Título: Re: Busqueda binaria de un array desordenado
Publicado por: LearningSpanishProgrammer en 12 Noviembre 2011, 01:28 am
David_RM, tienes que hacer lo seguiente:

Solo necesita crear un arreglo de índices y ordenalo usando el arreglo de valores.

int arreglo[] = { 9 5 2 1};
int idxs[] = { 3 2 1 0 }

Hablé esto, pero tu no había visto.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: naderST en 12 Noviembre 2011, 05:15 am
Es como dice LearningSpanishProgrammer para implementar búsqueda binaria tienes que tener el arreglo en orden de alguna u otra manera. Con indices estaría bien.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: BlackZeroX en 12 Noviembre 2011, 06:47 am
Ya expliqué como es el algoritmo. Se qué es absurdo, pero es lo que me han pedido en la facultad xD

Pues yo creo que quisieron que usaras tu materia GRIS...

Primero ordena el array... despues aplicas el proceso de ordenacion binaria!¡.

Dulces Lunas!¡.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: David_RM en 12 Noviembre 2011, 09:48 am
No se puede ordenar. De todas formas, gracias a todos


Título: Re: Busqueda binaria de un array desordenado
Publicado por: BlackZeroX en 12 Noviembre 2011, 11:11 am
InsertSort?

Dulces Lunas!¡.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: naderST en 13 Noviembre 2011, 04:47 am
No se puede ordenar. De todas formas, gracias a todos

Si te exigen hacer búsqueda binaria en un arreglo desordenado no es posible... tiene que ser en un arreglo ordenado porque existen varios métodos para hacerlo como por ejemplo la búsqueda secuencial con centinela. Un sencillo ejemplo:


Título: Re: Busqueda binaria de un array desordenado
Publicado por: David_RM en 13 Noviembre 2011, 11:55 am
Igual no es busquedad binaria, el algoritmo ya lo explique anteriormente


Título: Re: Busqueda binaria de un array desordenado
Publicado por: BlackZeroX en 13 Noviembre 2011, 12:09 pm
Necesito hacer un código que haga la busqueda binaria de un array no ordenado. Entiendo el código usual pero a la hora de discriminar entre los dos sub-arrays no se muy bien que hacer.

Igual no es busquedad binaria, el algoritmo ya lo explique anteriormente

que dilema... si te lo dejaron de tarea pregunta a tu profesor algunos puntos criticos como los ya mensionados en este hilo.

Dulces Lunas!¡.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: David_RM en 13 Noviembre 2011, 12:25 pm
Os dejo el enunciado, el algoritmo ya lo explique antes:

Código:
Consiste en buscar la posición de un elemento dado entre dos posiciones de un vector no ordenado. En caso de que exista, devolver la posición del elemento o -1 si no existe. Para resolver el problema mediante recursividad, consiste en dividir la estructura en dos partes del mismo tamaño.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: ghastlyX en 13 Noviembre 2011, 13:31 pm
Pero eso no es búsqueda binaria, puesto que necesariamente tendrás que explorar en caso peor las dos mitades y tendrá complejidad lineal.

Una posible implementación de lo que te piden de forma algo cutre sería la siguiente:
Código
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int busca(int x, vector<int>& v, int a, int b) {
  6.    if (a == b) return (v[a] == x) ? a : -1;
  7.    return max(busca(x, v, a, (a + b)/2), busca(x, v, (a + b)/2 + 1, b));
  8. }
  9.  
  10. int main() {
  11.    int n;
  12.    cin >> n;
  13.    vector<int> v(n);
  14.    for (int i = 0; i < n; ++i) cin >> v[i];
  15.    int x;
  16.    while (cin >> x) cout << busca(x, v, 0, n - 1) << endl;
  17. }

Y son dos líneas de código la función. Sin embargo, se podría optimizar la función, para que por ejemplo si la primera llamada recursiva encuentra el elemento, no haga la segunda llamada.


Título: Re: Busqueda binaria de un array desordenado
Publicado por: CobraCY en 13 Noviembre 2011, 16:55 pm
Hace algún tiempo me dejaron lo mismo como un pequeño ejercicio y esta fue la solución que propuse:

Código
  1. int busqueda_binaria(int *a, int inicio, int fin, int val)
  2. {
  3. if(inicio==fin && a[inicio] != val)
  4. return -1;
  5. int t= fin/2;
  6. if(a[t] == val)
  7. return t;
  8. if(a[t] > val)
  9. return busqueda_binaria(a,inicio,t-1,val);
  10. else
  11. return busqueda_binaria(a,t+1,fin,val);
  12. }
  13.  

Como vez esto se puede mejorar para que funcione en menos lineas, pero eso ya te lo dejo de tarea para ti :).

Saludos.