2010-04-22 9 views
6

Aquí hay una pregunta extraña para ustedes,¿Cómo aleatorizar una lista ordenada?

Tengo una buena lista ordenada que deseo aleatorizar. ¿Cómo voy a hacer eso?

En mi aplicación, tengo una función que devuelve una lista de puntos que describen el contorno de un objeto discretizado. Debido a la forma en que se resuelve el problema, la función devuelve una lista ordenada. tengo un segundo límite descrito en matemáticas y quiero determinar si los dos objetos se cruzan entre sí. Simplemente analizo los puntos y determino si algún punto está dentro del límite matemático.

El método funciona bien, pero quiero aumentar la velocidad aleatorizando los datos del punto. Dado que es probable que mi límite matemático se solape con una serie de puntos que están uno junto al otro, creo que tendría sentido verificar una lista aleatorizada en lugar de iterar sobre una buena ordenada (ya que solo se necesita una sola golpear para declarar una intersección).

¿Alguna idea sobre cómo haré para aleatorizar una lista ordenada?

+0

¿Está seguro de que vale la pena el tiempo dedicado a la aleatorización? Si no, mida :) –

Respuesta

12

Utilice std::random_shuffle. Si desea implementar el método usted mismo, debe mirar el Fisher-Yates shuffle.

+1

¡Ahh gracias! Me alegro de que decidí ser flojo y hacer la pregunta antes de intentar reinventar la rueda ... otra vez ... – Faken

+0

El estándar random_shuffle no funciona en iteradores bidireccionales. – SChepurin

+0

@SChepurin sí, es por eso que menciono explícitamente la mezcla aleatoria de Fisher Yates. Desafortunadamente, la mayoría de los algoritmos de aleatorización serán imposiblemente lentos en los contenedores de acceso no aleatorio y no son factibles. – pmr

4

Puede probar el random_shuffle algorithm, pero tenga en cuenta que no funcionará en list ya que requiere iteradores de acceso aleatorio. Sin embargo, puede usarlo en vector o deque.

-2
std::random_shuffle(thelist.begin(), thelist.end()); 
1

Asumiendo que su "lista" no significa una lista enlazada, pero en vez significa algo que admite el acceso aleatorio (por ejemplo, una matriz, std :: vector, o std :: deque), std :: random_shuffle podría ser útil.

1

Pero una pregunta clave sería si el tiempo de ejecución requerido para aleatorizar la lista podría no ser más que el tiempo de ejecución para recorrerlo secuencialmente.

Quizás lo que realmente necesita hacer no es aleatorizarlo, sino leerlo en un orden que no sea de adelante hacia atrás. Por ejemplo, si la lista tiene n miembros, quizás deba procesar 1, n, 2, n-1, 3, n-2, etc. o 1, n/2, 2, n/2 + 1, 3, n/2 +2, etc.

Si siempre tiene el mismo número de puntos o si el número de puntos cae en un pequeño conjunto finito, puede producir una orden de evaluación de puntos para cada posible número de puntos una vez por adelantado , ya sea verdaderamente al azar o tal vez cuidadosamente calculado de alguna manera.

+0

Creo que es una buena idea crear una nueva lista aleatoria. En el peor de los casos, tendré que repetir la lista 1 millón de veces. – Faken

1
 
int array[N]; 

for(int i = N - 1; i > 0; i--) { 
    int j = rand() % i; 
    int tmp = array[i]; array[i] = array[j]; array[j] = i; 
} 
Cuestiones relacionadas