2010/3/4 Pablo Angulo <pablo.ang...@uam.es>: > 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/