encontrar el número máximo en la matriz

hay una matriz de números y esta matriz es irregular y deberíamos encontrar un número máximo (n) que al menos n número sea mayor que él (este número puede estar en la matriz y puede no estar en la matriz)

por ejemplo, si damos 2 5 7 6 9 el número 4 es el número máximo que al menos 4 números (o más) es más grande que 4 (5 6 7 9 son más grandes)

Resuelvo este problema, pero creo que da un límite de tiempo en una gran variedad de números, así que quiero resolver este problema de otra manera, así que uso la ordenación por combinación para ordenar eso porque toma nlog (n) y luego uso un contador y cuenta de 1 a k si tenemos k número más que k contamos de nuevo por ejemplo contamos de 1 a 4 entonces en 5 no tenemos 5 números más de 5 entonces damos k- 1 = 4 y este es nuestro n .

es bueno o tal vez da límite de tiempo? ¿alguien tiene otra idea?

gracias

preguntado el 15 de noviembre de 13 a las 08:11

(this number can be in array and can not be in array ) Bueno, supongo que quieres decir (this number may be in array and may not be in array ) -

qsort y luego cuente hacia atrás tanto como desee, por ejemplo. 4 en este caso -

todavía no se resolvió. Quiero saber de esta manera (usando merge sort and counter) si es bueno o no.

2 Respuestas

In c++ hay una función llamada std::nth_element y puede encontrar el n-ésimo elemento de una matriz en tiempo lineal. Con esta función debe encontrar el N - n- th elemento (donde N es el número total de elementos en la matriz) y restarle 1.

Mientras busca una solución en C no puede hacer uso de esta función, pero puede implementar su solución de manera similar. nth_element realiza algo bastante similar a qsort, pero solo realiza la partición en la parte de la matriz donde se encuentra el n-ésimo elemento.

Ahora supongamos que tiene nth_element implementado. Realizaremos algo así como una combinación de búsqueda binaria y nth_element. Primero asumimos que la respuesta de la pregunta es el elemento medio de la matriz (es decir, el N/2-ésimo elemento). Usamos nth_element y encontramos el N/2elemento. si es mas que N/2 sabemos que la respuesta a su problema es al menos N/2, de lo contrario será menos. De cualquier manera para encontrar la respuesta solo continuaremos con una de las dos particiones creadas por el N/2elemento. Si esta partición es la correcta (elementos mayores que N/2) seguimos resolviendo el mismo problema, de lo contrario comenzamos a buscar el elemento max M a la izquierda del N/2el elemento que tiene al menos x elementos más grandes tales que x + N/2 > M. Los dos subproblemas tendrán la misma complejidad. Continúa realizando esta operación hasta que el intervalo que le interesa es de longitud 1.

Ahora demostremos que la complejidad del algoritmo anterior es lineal. Primero nth_element es lineal realizando operaciones en el orden de N, segundo nth_element que solo considera la mitad de la matriz realizará operaciones en el orden de N/2 el tercero - en el orden de N/4 y así. En total, realizará operaciones en el orden de N + N/2 + N/4 + ... + 1. Esta suma es menor que 2 * N por lo tanto, su complejidad sigue siendo lineal.

Su solución es asintóticamente más lenta que la que propongo anteriormente ya que tiene una complejidad O(n*log(n)), mientras que mi solución tiene una complejidad de O(n).

respondido 15 nov., 13:09

+1 este es un algoritmo bastante trivial para implementar. El experimento mental de la partición de clasificación rápida solo en la partición que contiene el índice del elemento deseado para cada subsecuencia es literalmente acertado. - QuiénesCraig

Quiero usar C. ¿Puedes decir un poco cómo resolver este problema? - usuario2768684

@storm-saeed Lo entiendo y eso es lo que abordo en el segundo párrafo de mi respuesta. - Ivailo Strandjev

@tormenta-saeed esta pregunta se ocupa de los detalles sobre cómo implementar el algoritmo, pero en esencia, la lógica es como explico: Ivailo Strandjev

Lo siento, pero dudo de tu conclusión sobre la complejidad del tiempo. Es cierto que el tiempo medio de std::nth_element is O(n), entonces, ¿qué pasa con el próximo movimiento? No entiendo tu idea de cómo puedes usar una llamada única (o un número constante de veces) de std::nth_element para resolver este problema. Por favor explique. Gracias. - estrellar

Usaría una variante modificada de un algoritmo de clasificación que usa valores de pivote.

La razón es que desea ordenar la menor cantidad de elementos posible.

Entonces yo usaría qsort como mi algoritmo base y dejo que el elemento pivote controle qué partición ordenar (solo necesitará ordenar una).

respondido 15 nov., 13:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.