Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Arnau Sanchez

On 04/03/10 16:43, Kiko wrote:


indices = []
ultimo = -1
for i in subconjunto:
 ultimo = conjunto.index(i, ultimo+1)
 indices.append(ultimo)
 #yield ultimo



El yield me da error tal como lo he puesto ¿?.


Claro, un "yield" sólo funciona dentro de un generador. Supongo que nunca has 
trabajado con ellos, busca información por google, por ejemplo:


http://docs.python.org.ar/tutorial/classes.html#generadores

De verdad que vale la pena, los generadores son una de las herramientas más 
potentes de Python. Para crear un generator tendrás que definirlo (también con 
"def", aunque no es una función). En nuestro ejemplo:


def gen():
  ultimo = -1
  for v in subgroup:
  ultimo = group.index(v, ultimo+1)
  yield ultimo

Si haces gen() verás que devuelve (inmediatamente, ya que no lo ha ejecutado 
todavía) un objeto generador, no una lista; siempre puedes obtener el resultado 
completo en forma de lista, así: list(gen()). Pero muchas veces uno no quiere 
tener toda la lista, sólo iterar (una vez) sobre el resultado. En ese caso:


for item in gen():
  # hacer algo con item

Por último: Daniel proponía usar bisect; con la misma idea, y refactorizando un 
pelín, quedaría así:


def get_positions(group, subgroup):
  index = 0
  for element in subgroup:
  index = bisect.bisect(group, element, index)
  yield index-1

arnau
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Olemis Lang (Simelix)
2010/3/4 Pablo Angulo :
> Olemis Lang (Simelix) escribió:
>> No me parece que `index` recuerde el último índice de la lista (no
>> estamos hablando de iteradores ;o) entre dos llamadas diferentes para
>> recomenzar la búsqueda de un nuevo elemento (¿ o es que funciona así
>> internamente ?) ...
> Normalmente, index comienza desde el principio, pero justo por eso le
> pasamos otro argumento más a index:
>
> ultimo = conjunto.index(v, ultimo+1)

¡ Caramba, ya sabía yo ! Tengo que cambiar mis espejuelos urgentemente ... :P

-- 
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Olemis Lang (Simelix)
2010/3/4 Pablo Angulo :
> Olemis Lang (Simelix) escribió:
>> Si no es O(1) entonces sospecho que en
>>
>> {{{
>> #!python
>>
>> ultimo = -1
>>  for v in subconjunto:
>>      ultimo = conjunto.index(v, ultimo+1)
>>      yield ultimo
>> }}}
>>
>> hay un ciclo `for` explícito más un ciclo implícito `index`
>
>
> No lo sospeches: tiene que haber un bucle para encontrar el índice, pero
> en cuanto encuentras el primer índice con ese valor, te sales del bucle.
> ¿Cuántas iteraciones haces del bucle en total? Bueno, puede que para
> algún caso particular hagan falta muchas iteraciones, pero la suma de
> todas las iteraciones no puede superar N: La primera iteración del bucle
> "for v in subconjunto", recorres desde 0 hasta indice[0], luego desde
> indice[1] hasta indice[2],... si sumas todas esas cantidades tienes:
>
> (indice[0] - 0) + (indice[1]-indice[0]) + ... + (indice[M-1] -
> indice[M-2]) = indice[M-1] < N

Tenía entendido que era así

indice[0] + indice[1] + ... + indice[M-1] = sum(indice[i] for i in
xrange(M)) <= N * (N + 1) / 2 - M * (M+ 1) / 2

peor caso cuando son los M últimos elementos del arreglo ;o)

No me parece que `index` recuerde el último índice de la lista (no
estamos hablando de iteradores ;o) entre dos llamadas diferentes para
recomenzar la búsqueda de un nuevo elemento (¿ o es que funciona así
internamente ?) ... Quizás es que no comprendí la parte del `-
indice[0]` ... `- indice[M - 1]`

La solución que presenté antes basada en itertools.count si funciona
apróximadamente como se describe acá y por tanto resulta O(N) en el
peor caso

;o)

-- 
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Olemis Lang (Simelix)
2010/3/4 Pablo Angulo :
> Kiko escribió:
>> tiempo de la primera opción: 0.0149998664856
>> for i in subconjunto:
>>     ultimo = conjunto.index(i, ultimo+1)
>>     indices.append(ultimo)
>> Los primero 25 valores de indices = [0, 3, 6, 9, 12, 15, 18, 21, 24,
>> 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72]
>>
>> tiempo de mi opción, la original: 41.2180001736
>> indices1 = [conjunto.index(i) for i in subconjunto]
>> Los primero 25 valores de indices1 = [0, 3, 6, 9, 12, 15, 18, 21, 24,
>> 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72]
>>
>> tiempo de la tercera opción: 0.046313354
>> indices2 = [bisect.bisect(conjunto, i) for i in subconjunto]
>> Los primero 25 valores de indices2 = [1, 4, 7, 10, 13, 16, 19, 22, 25,
>> 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73]
>>
>> Menos mal que he preguntado a los expertos.
>>
>> Muchas gracias por las mejoras. Tanto la primera opción como la
>> tercera son infinitamente mejores que la mía y aceptables en tiempo usado.
>
> Las mediciones de tiempo hay que tomarlas con cautela: si subconjunto es
> mucho más pequeño que conjunto, entonces Mlog(N) es menor que N, y te
> interesa usar el tercer método.

Esto también es real. Por ejemplo, normalmente los algoritmos híbridos
son los que se utilizan más frecuentemente. Por ejemplo, consideren lo
siguiente [1]_ :

{{{
In Java, the Arrays.sort() methods use merge sort or a tuned quicksort
depending on the datatypes and for implementation efficiency switch to
insertion sort when fewer than seven array elements are being
sorted.[6] Python uses timsort, another tuned hybrid of merge sort and
insertion sort.
}}}

FWIW
;o)

.. [1] Comparison with other sort algorithms
 
(http://en.wikipedia.org/wiki/Mergesort#Comparison_with_other_sort_algorithms)

-- 
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
Robots activos para Google Wave: introducción a la versión 2 de la API
- 
http://feedproxy.google.com/~r/simelo-es/~3/ltPGNuqYzOM/google-wave-developer-blog-introducing.html
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Olemis Lang (Simelix)
2010/3/4 Olemis Lang (Simelix) :
> 2010/3/4 Pablo Angulo :
>> Olemis Lang (Simelix) escribió:
>>> Aquí por ejemplo hay un caso que ilustra el hecho de no confiar
>>> demasiado en las estimaciones teóricas . Las estimaciones de Pablo et
>>> al se pueden ver afectadas por la eficiencia de la implementación del
>>> método index (el cual no me parece que sea muy O(1) que digamos, pero
>>> no tengo los detalles en la mano ...) . E.g. si fuera O(n), O(log(n))
>>> ... en el peor caso entonces todos los análisis anteriores no serían
>>> del todo precisos (CMIIW)
>>>
>>
>> index no es O(1), sino que tarda tanto como tenga que buscar. Si tiene
>> que recorrer toda la lista, será O(n). En este caso, el tiempo total es
>> O(n) porque no se pasa dos veces por el mismo elemento de conjunto,

AFAICS sí se hace esto dentro de `index` , ¿ o no ? Lo que el ciclo
«no se ve» y por tanto está implícito (y es posible pasar por alto ese
detalle ;o)

CMIIW

-- 
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
Support micro-seconds as added by Trac in revision 9210 for upcoming
0.12... - http://bitbucket.org/osimons/trac-rpc-mq/changeset/62ffe719a84a/
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Kiko
El 4 de marzo de 2010 17:33, Pablo Angulo  escribió:

> Kiko escribió:
> > tiempo de la primera opción: 0.0149998664856
> > for i in subconjunto:
> > ultimo = conjunto.index(i, ultimo+1)
> > indices.append(ultimo)
> > Los primero 25 valores de indices = [0, 3, 6, 9, 12, 15, 18, 21, 24,
> > 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72]
> >
> > tiempo de mi opción, la original: 41.2180001736
> > indices1 = [conjunto.index(i) for i in subconjunto]
> > Los primero 25 valores de indices1 = [0, 3, 6, 9, 12, 15, 18, 21, 24,
> > 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72]
> >
> > tiempo de la tercera opción: 0.046313354
> > indices2 = [bisect.bisect(conjunto, i) for i in subconjunto]
> > Los primero 25 valores de indices2 = [1, 4, 7, 10, 13, 16, 19, 22, 25,
> > 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73]
> >
> > Menos mal que he preguntado a los expertos.
> >
> > Muchas gracias por las mejoras. Tanto la primera opción como la
> > tercera son infinitamente mejores que la mía y aceptables en tiempo
> usado.
> Las mediciones de tiempo hay que tomarlas con cautela: si subconjunto es
> mucho más pequeño que conjunto, entonces Mlog(N) es menor que N, y te
> interesa usar el tercer método.
> ___
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>

De acuerdo contigo.

Pero con este ejercicio, lo que queda claro es que cualquiera de las dos
propuestas es infinitamente mejor que la inicial (la mía) en tiempo de
cálculo y ambas aceptables para lo que necesito ahora mismo.
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Olemis Lang (Simelix)
2010/3/4 Pablo Angulo :
> Olemis Lang (Simelix) escribió:
>> Aquí por ejemplo hay un caso que ilustra el hecho de no confiar
>> demasiado en las estimaciones teóricas . Las estimaciones de Pablo et
>> al se pueden ver afectadas por la eficiencia de la implementación del
>> método index (el cual no me parece que sea muy O(1) que digamos, pero
>> no tengo los detalles en la mano ...) . E.g. si fuera O(n), O(log(n))
>> ... en el peor caso entonces todos los análisis anteriores no serían
>> del todo precisos (CMIIW)
>>
>
> index no es O(1), sino que tarda tanto como tenga que buscar. Si tiene
> que recorrer toda la lista, será O(n). En este caso, el tiempo total es
> O(n) porque no se pasa dos veces por el mismo elemento de conjunto, pero
> eso no significa que index sea O(1).

Si no es O(1) entonces sospecho que en

{{{
#!python

ultimo = -1
 for v in subconjunto:
 ultimo = conjunto.index(v, ultimo+1)
 yield ultimo
}}}

hay un ciclo `for` explícito más un ciclo implícito `index`, lo que me
hace pensar que el desempeño en el peor caso puede ser O(M * N) y en
el mejor sospecho que sea O(M^2), solo que hay una realidad, el ciclo
implícito es mucho más eficiente pues está implementado directamente
en (C)Python

CMIIW

;o)

-- 
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
Support micro-seconds as added by Trac in revision 9210 for upcoming
0.12... - http://bitbucket.org/osimons/trac-rpc-mq/changeset/62ffe719a84a/
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Olemis Lang (Simelix)
2010/3/4 Kiko :
> El 4 de marzo de 2010 16:27, Olemis Lang (Simelix) 
> escribió:
>> 2010/3/4 Arnau Sanchez :
>> > On 04/03/10 14:02, Pablo Angulo wrote:
>> >
>
[...]
>
> tiempo de la tercera opción: 0.046313354
> indices2 = [bisect.bisect(conjunto, i) for i in subconjunto]
> Los primero 25 valores de indices2 = [1, 4, 7, 10, 13, 16, 19, 22, 25, 28,
> 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73]
>

Evidentemente hay que ajustar este ;o)

-- 
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Kiko
El 4 de marzo de 2010 16:27, Olemis Lang (Simelix)

> escribió:

> 2010/3/4 Arnau Sanchez :
> > On 04/03/10 14:02, Pablo Angulo wrote:
> >
> >> indices = []
> >> ultimo = 0
> >> for v in subconjunto:
> >> ultimo += conjunto.index(v,ultimo)
> >> indices.append(ultimo)
> >
> > Creo que el += sobra, list.index() devuelve el índice absoluto:
> >
> >  ultimo = conjunto.index(v, ultimo)
> >
> > Y si no me equivoco el índice podría ser ultimo+1. Con tu propuesta, y
> > usando generadores queda realmente simple:
> >
> >  ultimo = -1
> >  for v in subconjunto:
> >  ultimo = conjunto.index(v, ultimo+1)
> >  yield ultimo
>
> Aquí por ejemplo hay un caso que ilustra el hecho de no confiar
> demasiado en las estimaciones teóricas . Las estimaciones de Pablo et
> al se pueden ver afectadas por la eficiencia de la implementación del
> método index (el cual no me parece que sea muy O(1) que digamos, pero
> no tengo los detalles en la mano ...) . E.g. si fuera O(n), O(log(n))
> ... en el peor caso entonces todos los análisis anteriores no serían
> del todo precisos (CMIIW)
>
> PD: JFYI, la implementación que envié anteriormente no sufre de este
> potencial problema (de todas formas sería bueno saber si `index` es
> O(1) o no ;o)
>
> --
> Regards,
>
> Olemis
>

Después de leeros a todos (muchas gracias, Juan Ignacio, Daniel, Pablo,
Olemis y Arnau)  he hecho unas pruebas para un caso que se acerca a lo que
necesito:

from datetime import datetime, timedelta
import bisect
import time

def generador(start, end, intervalo):
fechas = []
while start <= end:
fechas.append(start)
start += timedelta(minutes=intervalo)
return [valores for valores in fechas]

start = datetime(1900,1,1,0,0)
end = datetime(1901,1,1,0,0)

conjunto = generador(start, end, 10)
subconjunto = generador (start, end, 30)


t0 = time.time()
indices = []
ultimo = -1
for i in subconjunto:
ultimo = conjunto.index(i, ultimo+1)
indices.append(ultimo)
#yield ultimo
print time.time() - t0
print indices[0:25]

t0 = time.time()
indices1 = [conjunto.index(i) for i in subconjunto]
print time.time() - t0
print indices1[0:25]

t0 = time.time()
indices2 = [bisect.bisect(conjunto, i) for i in subconjunto]
print time.time() - t0
print indices2[0:25]

El yield me da error tal como lo he puesto ¿?.

Las salidas que obtengo son:

tiempo de la primera opción: 0.0149998664856
for i in subconjunto:
ultimo = conjunto.index(i, ultimo+1)
indices.append(ultimo)
Los primero 25 valores de indices = [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30,
33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72]

tiempo de mi opción, la original: 41.2180001736
indices1 = [conjunto.index(i) for i in subconjunto]
Los primero 25 valores de indices1 = [0, 3, 6, 9, 12, 15, 18, 21, 24, 27,
30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72]

tiempo de la tercera opción: 0.046313354
indices2 = [bisect.bisect(conjunto, i) for i in subconjunto]
Los primero 25 valores de indices2 = [1, 4, 7, 10, 13, 16, 19, 22, 25, 28,
31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73]

Menos mal que he preguntado a los expertos.

Muchas gracias por las mejoras. Tanto la primera opción como la tercera son
infinitamente mejores que la mía y aceptables en tiempo usado.
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Olemis Lang (Simelix)
2010/3/4 Arnau Sanchez :
> On 04/03/10 14:02, Pablo Angulo wrote:
>
>> indices = []
>> ultimo = 0
>> for v in subconjunto:
>>     ultimo += conjunto.index(v,ultimo)
>>     indices.append(ultimo)
>
> Creo que el += sobra, list.index() devuelve el índice absoluto:
>
>  ultimo = conjunto.index(v, ultimo)
>
> Y si no me equivoco el índice podría ser ultimo+1. Con tu propuesta, y
> usando generadores queda realmente simple:
>
>  ultimo = -1
>  for v in subconjunto:
>      ultimo = conjunto.index(v, ultimo+1)
>      yield ultimo

Aquí por ejemplo hay un caso que ilustra el hecho de no confiar
demasiado en las estimaciones teóricas . Las estimaciones de Pablo et
al se pueden ver afectadas por la eficiencia de la implementación del
método index (el cual no me parece que sea muy O(1) que digamos, pero
no tengo los detalles en la mano ...) . E.g. si fuera O(n), O(log(n))
... en el peor caso entonces todos los análisis anteriores no serían
del todo precisos (CMIIW)

PD: JFYI, la implementación que envié anteriormente no sufre de este
potencial problema (de todas formas sería bueno saber si `index` es
O(1) o no ;o)

-- 
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
Robots activos para Google Wave: introducción a la versión 2 de la API
- 
http://feedproxy.google.com/~r/simelo-es/~3/ltPGNuqYzOM/google-wave-developer-blog-introducing.html
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Arnau Sanchez

On 04/03/10 14:02, Pablo Angulo wrote:


indices = []
ultimo = 0
for v in subconjunto:
 ultimo += conjunto.index(v,ultimo)
 indices.append(ultimo)


Creo que el += sobra, list.index() devuelve el índice absoluto:

  ultimo = conjunto.index(v, ultimo)

Y si no me equivoco el índice podría ser ultimo+1. Con tu propuesta, y usando 
generadores queda realmente simple:


  ultimo = -1
  for v in subconjunto:
  ultimo = conjunto.index(v, ultimo+1)
  yield ultimo
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Olemis Lang (Simelix)
2010/3/4 Olemis Lang (Simelix) :
> 2010/3/4 Pablo Angulo :
>> Daniel Garcia Moreno escribió:
>
[...]
> se puede lograr más aún si se sabe que una lista es un
> subelemento de la otra

Precisión: subconjunto

-- 
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
Comienza la era de la televisión 3D (el 10 de marzo ;o) -
http://feedproxy.google.com/~r/simelo-es/~3/mPcmLbduWJU/despues-del-gran-exito-del-largometraje.html
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Olemis Lang (Simelix)
2010/3/4 Pablo Angulo :
> Daniel Garcia Moreno escribió:
>>
>>> Si la lista grande tiene N elementos y la pequeña M, puedes elegir entre
>>> O(Mlog(N)), usando bisect. o O(N), con la técnica que te decía antes.
>>>
>> O puedes combinar las dos, buscar desde el último indice en adelante
>> pero hacerlo con busqueda binaria.
> Yo diría que ésto es también es O(M log(N)) en el peor caso (cuando el
> subconjunto son los M primeros valores de conjunto)
>
> log(N)+log(N-1)+...+log(N-M)=O(M log(N))

Por las características del problema y del contexto (dos listas
ordenadas ;o) me parece que lo más adecuado en este caso es un
algoritmo de mezcla como MergeSort [1]_ [2]_ que AFAICR debe ser O(n
log(n)) siendo n = min(N, M) en el peor caso, pero O(n) si están
ordenados (para más detalles consulten los enlaces ;o). Realmente en
este caso ni siquiera hace falta el mergesort completo, solo la
función de mezcla y simplificada , lo cual resultaría más eficiente
todavía, se puede lograr más aún si se sabe que una lista es un
subelemento de la otra -pero todas esas quedan de tarea para el OP-
;o)

{{{
#!python

>>> conjunto = range(1000, 1100, 1)
>>> subconjunto = range(1000, 1100, 3)
>>> from itertools import count
>>> def setidx(sub, full):   # a.k.a merge()
... idxs = count()
... while sub and full :
... if sub[0] == full[0] :
... yield idxs.next()
... full.pop(0); sub.pop(0)
... elif sub[0] < full[0] :
... sub.pop(0)
... else :
... full.pop(0)
... idxs.next()
...
>>> list(setidx(subconjunto, conjunto))
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51,
54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
}}}

Uso de memoria adicional ~= 0

.. [1] MergeSort
 (http://en.wikipedia.org/wiki/Mergesort)

.. [2] Ordenamiento por mezcla
 (http://es.wikipedia.org/wiki/Ordenamiento_por_mezcla)

PD: De todas formas mi sugerencia muy particular es que no confíen
demasiado en los análisis teóricos del tipo mencionado por Pablo (o
mejor dicho, que desconfíen hasta que no tengan la seguridad
irrefutable que les da un profiler ;o) . Este hilo me ha recordado un
artículo que tengo pendiente para mi blog que ilustra esto muy bien (y
que resulta realmente sorprendente, créanme ;o). Trataré de publicarlo
mañana (o pasado, o ...), y así tendrán más argumentos para juzgar
ustedes por su cuenta

Y para terminar, los algs de mezcla tienden a ser más fácilmente
paralelizables y trabajan mejor con medios secuenciales, por lo que si
la cantidad de datos es *REALMENTE* grande entonces pueden resultar
bastante atractivos , pues tienden además a tener la virtud de ser
estables ... bueno y si de algo sirve, pues, no contaminan el medio
ambiente, ¿ vale ? :P )

;o)

-- 
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:
Comienza la era de la televisión 3D (el 10 de marzo ;o) -
http://feedproxy.google.com/~r/simelo-es/~3/mPcmLbduWJU/despues-del-gran-exito-del-largometraje.html
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Kiko
El 4 de marzo de 2010 13:18, Juan Ignacio  escribió:

> Oppps, me falto la interrogante, era una pregunta :-) ¿Conjunto y
> subconjunto están (o pueden estar) ordenados?
> ___
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>

Están ordenados para lo que quiero hacer.
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Juan Ignacio
Oppps, me falto la interrogante, era una pregunta :-) ¿Conjunto y
subconjunto están (o pueden estar) ordenados?
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar índices de un array (que cu mple condición) de forma eficiente

2010-03-04 Por tema Juan Ignacio
Conjunto y subconjunto están (o pueden estar) ordenados

2010/3/4 Kiko :
> Hola a todos.
>
> Estoy intentando buscar los indices de un subconjunto dentro de un conjunto
> y quiero saber si existe algo más eficiente que lo que he pensado.
>
> Me explico, por ejemplo, yo tengo:
>
> conjunto = range(1000, 1100, 1)
> subconjunto = range(1000, 1100, 3)
>
> Quiero saber la posición que tendría cada valor del subconjunto en el
> conjunto, es decir, subconjunto[0] tendría el índice 0 en conjunto
> (conjunto[0])), subconjunto[1] tendría el índice 3 en conjunto
> (conjunto[3])) y así.
>
> Estoy obteniendo los índices así
> indices = [conjunto.index(valor) for valor in subconjunto]
>
> Pero si conjunto y subconjunto son muy grandes se toma su tiempo.
>
> ¿Existe una forma más eficiente de obtener los índices?
>
> Muchas gracias a todos.
>
>
>
> ___
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>



-- 
Juan Ignacio Rodríguez de León
Movil: 605 890514
E-Mail: euriba...@gmail.com
http://elornitorrincoenmascarado.blogspot.com/
http://descon2.com/
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/