Supongamos que queremos ordenar una lista de números reales. Supongamos que se nos da un cuadro negro que puede ordenar números reales al instante. ¿Cuánta ventaja podemos ganar usando esta caja negra?
Por ejemplo, ¿podemos ordenar los números con solo llamadas al cuadro negro? El mejor algoritmo que he encontrado utiliza llamadas al cuadro negro. Pero no he podido mejorarlo más. Aquí está mi algoritmo que es similar a merge-sort:
Primero divide la lista en √ listass1,s2,. . . ,s √ con aproximadamente√ tamaño Luego usa √ llama al cuadro negro para ordenar estas listas. Finalmente, combine las listas ordenadas usando el cuadro negro de la siguiente manera:
Coloque los elementos más pequeños de las listas en una nueva lista , luego llame al cuadro negro para ordenarlo. El número en L [ 1 ] (primero y el elemento más pequeño de L ) será el número más pequeño de S . Podemos ponerlo en primer lugar de la lista de salida.
Suponiendo que el elemento ha sido seleccionado de s j , reemplazamos L [ 1 ] con el segundo elemento más pequeño de lista de ordenación s j , y de nuevo corre el cuadro negro en él para calcular el segundo miembro más pequeño de S .
Continuamos hasta que todos los elementos estén ordenados. El número total de llamadas de recuadro negro para esta parte será . Por lo tanto, en general, el número total de llamadas será.
Por otro lado, parece que deberíamos poder obtener un límite inferior usando el límite inferior en las comparaciones de números necesarias para ordenar de la siguiente manera: podemos implementar el cuadro negro usando comparaciones. Si podemos resolver el problema con las llamadas al cuadro negro y fusionarlas en tiempo lineal, podemos ordenar números reales con comparaciones cual es imposible.
Supongo que podríamos probar que es un límite inferior para la cantidad de llamadas al cuadro negro, ya que muchas comparaciones que se usan en el cuadro negro se compartirían y, por lo tanto, se cuentan en nuestro argumento.
ACTUALIZACIÓN: Como sugieren las otras publicaciones, también se puede lograr un .
fuente
Respuestas:
It's possible to sort withO(n−−√logn) calls to the black box and no comparisons.
First, consider the following balanced partitioning problem: givenm elements A[1..m] (where n−−√≤m≤n ), partition them into two groups, the smallest of size at least about m/4 , so that all elements in the first group are smaller than all elements in the second group. This can be done with O(m/n−−√) calls to the black box. (I'll describe that later.) Then use quicksort with this partitioning algorithm:
Assuming each partition step takesO(m/n−−√) calls to the black box, the above algorithm, given input A[1..n] , will make O(n−−√logn) calls to the black box, because the recursion tree has depth O(logn) and each level of the tree has a total of O(n/n−−√)=O(n−−√) calls to the black box.
Do the partitioning step as follows:
fuente
I think your question was addressed in Beigel and Gill's paper "Sorting n objects using k-sorter" from 1990 and the abstract of the paper says it all:
fuente
It is possible to sort obliviously withO(n−−√logn) calls to the black box, each applied to a contiguous subarray of the original input. The algorithm never touches the input data except through black-box calls. In particular, the same sequence of black-box calls is only a function of n , not the actual input data (hence "oblivious").
Here is a sketch of a simpler algorithm, which uses a black box that sorts subarrays of sizek instead of just n−−√ . The total number of calls to the black box is roughly 2(n/k)2 . For notational simplicity, assume that k is even and 2n/k is an odd integer.
Here is a diagram of the algorithm forn=18 and k=4 . Data travels from left to right; each box is a k -sorter.
As the figure hopefully suggests, this algorithm breaks the input array into chunks of sizek/2 , and then applies bubblesort to the chunks, using the k -sorter in place of a compare-exchange operation. Correctness follows by observing that the network correctly sorts any array of 0s and 1s.
As @VinayakPathak's comment suggests, theO((n/k)2) bound can be reduced by replacing bubblesort with a different sorting network. For example, Batcher's even-odd mergesort reduces the number of black-box calls to O((n/k)log2(n/k))=O(n−−√log2n) , and the AKS sorting network reduces it to O((n/k)log(n/k))=O(n−−√logn) . This last algorithm matches Neal's non-oblivious algorithm up to (large!!) constant factors.
fuente