python: gerando partições inteiras
Eu preciso gerar todo opartições de um dado inteiro.
Eu encontrei este algoritmo de Jerome Kelleher para o qual se afirma ser o mais eficiente:
<code>def accelAsc(n): a = [0 for i in range(n + 1)] k = 1 a[0] = 0 y = n - 1 while k != 0: x = a[k - 1] + 1 k -= 1 while 2*x <= y: a[k] = x y -= x k += 1 l = k + 1 while x <= y: a[k] = x a[l] = y yield a[:k + 2] x += 1 y -= 1 a[k] = x + y y = x + y - 1 yield a[:k + 1] </code>
referência:http://homepages.ed.ac.uk/jkellehe/partitions.php
By the way, não é muito eficiente. Para uma entrada como40
Congela quase todo o meu sistema por alguns segundos antes de dar sua saída.
Se fosse um algoritmo recursivo eu tentaria decorá-lo com uma função de cache ou algo para melhorar sua eficiência, mas sendo assim eu não consigo descobrir o que fazer.
Você tem algumas sugestões sobre como acelerar esse algoritmo? Ou você pode me sugerir outra, ou uma abordagem diferente para fazer outra do zero?