Tengo una lista de $l$ que contiene números enteros en el rango de $[1,max]$
En la lista de $l$ I hacer una operación $isPresent(x)$ que regresar true
si x
está presente en $l$.
Me genere $x$ utilizando la función de $nextX()$ que genera la próxima $x$ sobre la marcha usando algunos de distribución aleatoria
Lista de $l$ y la función $isPresent(x)$ poner juntos es un sistema donde la lista de $l$ es un personalizados estructura de datos similar a la de un árbol de búsqueda binario y $isPresent(x)$ es un nuevo algoritmo similar a un algoritmo de búsqueda binaria, que opera de manera eficiente en la estructura de datos.
Quiero probar el rendimiento de este sistema contra los conocidos de búsqueda, los árboles y los algoritmos de búsqueda.
El método actual que estoy usando de referencia de estos sistemas es, generar una random workload
. Yo rellenar la lista $l$ con el uniforme de números aleatorios en el rango de $[1,max]$. A continuación, generar un número aleatorio uniforme $x$ $nextX()$ y se pasa a la función de $isPresent(x)$. I do $k$ este tipo de operaciones. Aquí la función $nextX()$ sólo llama a $rand()$ para obtener el siguiente número aleatorio.
Lo que yo quería probar es un skewed workload
. He intentado utilizar la distribución de Poisson en $nextX()$ generar $x$ (Utilizando la distribución de Poisson para generar enteros aleatorios) con $mu$ max/1.1
, pero la desviación estándar es pequeña y los números generados son agrupados cerca de la $max$. Quiero escoger una distribución discreta otros de la distribución uniforme, pero los valores generados deben roughly
cubrir todo el rango de $[1,max]$
Otra carga de trabajo que quiero generar debería tener la siguiente propiedad.
La función de $nextX()$ debe devolver un entero en el rango de $[1,max]$. Si llamo a $nextX$ función de $k$ a veces, algunas de las $k$ enteros debe ser al azar, pero no puede haber un período en el que algunos de ellos podrían ser una ordenada secuencia (ascendente o desending)
Por ejemplo, si $max=32$, a continuación, llamar a $nextX()$ 18
de las veces se puede volver 17,11,23,5,7,17,23,30,2,31,17,1,19,14,8,6,5,2
Aquí la primera 3
enteros son al azar, seguido por una secuencia ordenada de longitud aleatoria 5
, seguido por una secuencia aleatoria de números enteros de longitud 4
, seguido por un inversa secuencia ordenada de longitud aleatoria 6
Me puede lograr esto mediante la generación de 18
ordenados de números y ellos al azar, seleccionando el número de particiones y en cada partición puedo elegir aleatoriamente a los shuffle. Pero el problema con esto es que necesita mucho espacio de almacenamiento y el valor de $k$, lo que representa el número de veces que la función de $nextX()$ se invoca es muy grande por lo que quiero para generar esta distribución desigual sobre la marcha.
Antecedentes:
La razón por la que mirar para generar una secuencia es que un desequilibrio en el árbol de búsqueda binario funciona bien para la distribución al azar, ya que la altura del árbol es de cerca de $O(log(n))$. Para la ordenada secuencia de la altura se puede ir tan alto como $O(n)$. En la práctica ambos son nunca el caso. Las cargas de trabajo tienden a ser al azar con ocasionales ordenan las secuencias intercaladas.