Una función recursiva que realiza una búsqueda binaria -- algorithm campo con c campo con recursion campo con binary-search camp codereview Relacionados El problema

A recursive function that performs a binary search


3
vote

problema

Español

He creado una función recursiva que usa la búsqueda binaria para simplemente devolver la verdadera si encuentra el valor y el falso si no lo hace.

Soy nuevo en la recursión y la búsqueda binaria, por favor, hágamelo saber a dónde puedo mejorar.

  /** * Uses binary search O(log n). Returns true if the values is in the value array false if it's not. Recursive */ bool binarySearch( int value, int values[], int left, int right ) {      //keep track of when the array will be empty and return false     if ( right < left ) {         return false;     }      //Find the middle of the array     int mid = ( left + right ) / 2;      //compare the value to the middle of the array. If it's a match return true, else move the left position and right position accordingly     if( value == values[ mid ] ) {         return true;     } else if ( value < values[ mid ] ) {         right = mid - 1;     } else {         left = mid + 1;     }      //return the function      return binarySearch( value, values, left, right ); }   
Original en ingles

I created a recursive function that uses binary search to just return true if it finds the value and false if it does not.

I'm new to recursion and binary search so please let me know where I can improve upon.

/** * Uses binary search O(log n). Returns true if the values is in the value array false if it's not. Recursive */ bool binarySearch( int value, int values[], int left, int right ) {      //keep track of when the array will be empty and return false     if ( right < left ) {         return false;     }      //Find the middle of the array     int mid = ( left + right ) / 2;      //compare the value to the middle of the array. If it's a match return true, else move the left position and right position accordingly     if( value == values[ mid ] ) {         return true;     } else if ( value < values[ mid ] ) {         right = mid - 1;     } else {         left = mid + 1;     }      //return the function      return binarySearch( value, values, left, right ); } 
           

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Usted devuelve un booleano para indicar si se encontró el valor o no. La función sería más útil si devolvió un índice a la que se encontró el valor (o -1 si no se encuentra). Es mejor información por la misma cantidad de trabajo.

Aparece que Activate4 es el índice más a la izquierda a considerar, y 99887776655443325 es el índice más a la derecha a considerar. Sería más idiomático seguir la convención de límites exclusivos inclusivos, con Activate6 es el índice más a la izquierda y 99887776655443327 estar justo más allá del último elemento. De esa manera, Activate8 Indica el número de elementos en la matriz.

Ha implementado la búsqueda utilizando la recursión, pero también podría hacerse usando solo un bucle. Evitaría la sobrecarga de las llamadas de la función y la posibilidad de un desbordamiento de pila.

Activate9 es vulnerable al desbordamiento entero si ambos índices son grandes. ActiveXXX0 no se desbordaría.

 

You return a boolean to indicate whether the value was found or not. The function would be more useful if you returned an index at which the value was found (or -1 if not found). It's better information for the same amount of work.

It appears that left is the leftmost index to consider, and right is the rightmost index to consider. It would be more idiomatic to follow the convention of inclusive-exclusive bounds, with left being the leftmost index and right being just beyond the last element. That way, right - left indicates the number of elements in the array.

You've implemented the search using recursion, but it could also be done using just a loop. You would avoid the overhead of function calls and the possibility of stack overflow.

int mid = ( left + right ) / 2 is vulnerable to integer overflow if both indices are large. int mid = left + (right - left) / 2 would not overflow.

 
 
         
         

Relacionados problema

7  Búsqueda binaria de Java (y obtenga índice si no está allí) Revisión  ( Java binary search and get index if not there review ) 
Quiero hacer una búsqueda binaria y si el objetivo no está allí, obtenga el índice de donde debería haber sido. Este es el código en el que se me ocurrió. P...

5  BinarySearch Kata en Ruby  ( Binarysearch kata in ruby ) 
Acabo de completar esta búsqueda binaria Kata, que tiene algunos requisitos extraños, y pasé un poco "limpiando" mi código y haciéndolo más compacto. Agradece...

3  ¿Es esta búsqueda binaria cerca de Idiomatic OCAML?  ( Is this binary search close to idiomatic ocaml ) 
let binsearch ~arr ~cmp x = ( let cmpx = cmp x in (* Assuming arr is ordered according to cmp, then (bs min max) is an *) (* index of a value v...

5  Búsqueda binaria eficiente  ( Efficient binary search ) 
Mi implementación: 157 Implementación normal: 158 La diferencia de ser mi implementación hace una conjetura en el índice del valor en función de l...

10  Encuentre el duplicado en una matriz ordenada en menos de O (n)  ( Find the duplicate in a sorted array in less than on ) 
suposiciones: La matriz está ordenada. solo hay un duplicado. La matriz solo se rellena con números [0, N], donde n es la longitud de la matriz. Eje...

5  Búsqueda binaria: primera / última / ocurrencia aleatoria  ( Binary search first last random occurrence ) 
He escrito un código para "búsqueda binaria" una lista, y devolver el primera ocurrencia del objetivo: def bsearch(a, left, right, target, first_or_last ...

2  Eliminación de un nodo en un árbol de búsqueda binario  ( Deletion of a node in a binary search tree ) 
Estoy buscando ver si mi implementación del método de eliminación / eliminación en un árbol de búsqueda binario es suficiente, legible y se ejecuta en un tiem...

2  Búsqueda binaria, usando  ( Binary search using remove ) 
Soy consciente de que existe una función en la biblioteca estándar. Por favor, dame comentarios sobre buenos convenciones y estándares de codificación. fun...

2  Encontrar el subconjunto máximo de intervalos no superpuestos  ( Finding the max subset of non overlapping intervals ) 
¿Cómo podría este código ser más limpio? Creo que la forma en que manejo las interfaces y la búsqueda binaria podría mejorarse. Estoy tratando de entender cóm...

1  Retroalimentación de búsqueda binaria  ( Binary search feedback ) 
He escrito un algoritmo de búsqueda binario, pero parece ser un poco diferente a otras personas que he visto. Esperaba que la comunidad pudiera darme algunos ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos