2010-06-03 12 views
6

Digamos que tengo un conjunto ordenado de enteros, xs, y quiero recuperar todos los enteros en xs que son [x, y), es decir. entre x y y.¿Cómo obtengo la secuencia de números en un conjunto ordenado que están entre dos enteros en clojure?

que puedo hacer:

(select #(and (>= % x) (< % y)) xs) 

Pero esto es ineficiente - O (n) cuando podría ser O (log n), espero que el número de elementos volvió a ser pequeña. Utilizar take-while y drop-while me permitiría salir una vez que haya llegado a y, pero todavía no puedo saltar a x eficientemente.

Estoy aprendiendo clojure así que aquí es la forma en que lo haría en C++:

set<int>::iterator first = xs.lower_bound(x); 
set<int>::iterator last = xs.lower_bound(y); 
for (; first != last; ++first) 
    // do something with *first 

¿Puedo hacer esto en clojure?

Respuesta

8

¡Vaya! Me perdí la función subseq, no hay ningún enlace desde la página de estructuras de datos de la documentación.

(subseq xs >= x < y) 
Cuestiones relacionadas