Flash de aplicación del navegador de ActionScript: cómo extraer un subconjunto de objetos a partir de una matriz ordenada de manera eficiente * *?

StackOverflow https://stackoverflow.com/questions/2133252

Pregunta

Tengo una aplicación Flash navegador desplegado (no una aplicación AIR con acceso a SQLConnection) y se va a buscar resultados JSON desde un servidor remoto a través de HTTPService.

I necesita extraer subconjuntos del conjunto de resultados devueltos, una matriz de objetos, eficientemente . Mutltiple llamadas a través de la nube para el back-end no lo hará. Todo tiene que ocurrir en el cliente.

¿Hay alguna clase de colección en Flex ActionScript que puede ordenar un arreglo de objetos por una de las propiedades de los objetos tienen en común, al igual que la matriz de método sortOn, y luego también proporciona un búsqueda binaria método puede extraer un subconjunto de objetos de la versión clasificada de la matriz sin tener que visitar cada elemento de la matriz y comparando

por ejemplo. si tengo una matriz de objetos y cada objeto tenía una zip propiedad y un nombre propiedad, me gustaría ser capaz de extraer todos los objetos con zip = 10 015 de la copia de la matriz original, donde la copia ha sido clasificado en zip .

Gracias

¿Fue útil?

Solución

No estoy al tanto de cualquier colección incorporada que hace una búsqueda binaria. Pero se puede ordenar la matriz utilizando el método Array::sortOn y escribir su propio código para la búsqueda binaria. Puede comenzar con algo como:

private static search(array:Array, prop:String, value:Object, 
        frm:Number, to:Number):Number
{
  if(to - frm <= 1)
  {
    if(array[frm][prop] == value)
      return frm;
    if(array[to][prop] == value)
      return to;
    return -1;
  }
  var mid:int = (to + frm) / 2;
  //use a compare function that returns -1, 0, +1 based on their relative values
  if(array[mid][prop] == value)
    return mid;
  if(array[mid][prop] > value)
    return search(array, prop, value, frm, mid - 1);
  return search(array, prop, value, mid + 1, to);
}
array.sortOn("zip", Array.NUMERIC);
var index:Number = ClassName.search(array, "zip", "10015", 0, array.length - 1);

Ahora puede buscar arriba y hacia abajo con respecto al valor de índice devuelta (si es que lo es! = -1) y recuperar todo el subconjunto con cremallera valor = 10015.


Por cierto, si los datos son demasiado grandes para ser buscado en el lado del cliente utilizando métodos normales, ¿no sería lo suficientemente grande como para ser un cuello de botella del ancho de banda también?

Otros consejos

Se puede usar array.sortOn() y luego iterar una vez más de la matriz ordenada (empezando desde 0): cuando llegue el primer partido, comenzar elementos como iterar a regresar hacia delante, hasta que deje de juego. Esto devuelve todo el subconjunto de elementos coincidentes, y en promedio que va a visitar sólo la mitad de la matriz original (después de la clasificación).

(Si esto es demasiado lento, puede ser que sea más rápido, dependiendo de sus datos, para utilizar una búsqueda binaria para conseguir un partido, a continuación, iterar hacia abajo hasta que deje de juego es decir, encontrar el primer partido en el conjunto ordenado, entonces empiezan a regresar elementos como iterar hacia arriba hasta que se quede sin partidos ... pero el ahorro de tiempo puede ser marginal en comparación con el tiempo necesario para hacer el sortOn originales ())

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top