Как работать с очень длинными строками в Python?

голоса
5

Я решение проектной эйлерова проблемы 220 (посмотрело легко, по сравнению с некоторыми из других - подумал я попробовать более пронумерованные один для изменения!)

До сих пор у меня есть:

D = Fa

def iterate(D,num):
    for i in range (0,num):
        D = D.replace(a,A)
        D = D.replace(b,B)
        D = D.replace(A,aRbFR)
        D = D.replace(B,LFaLb)
    return D

instructions = iterate(Fa,50)

print instructions

Теперь, это работает отлично для низких значений, но когда вы положили его повторить выше, то вы просто получите «Ошибка памяти». Может кто-нибудь предложить способ преодолеть это? Я действительно хочу строку / файл, который содержит инструкции для следующего шага.

Задан 09/12/2008 в 16:35
источник пользователем
На других языках...                            


6 ответов

голоса
3

Хитрость заключается в том, в котором замечая модель возникает как запустить строку с помощью каждой итерации. Попробуйте оценить iterate(D,n)для п от 1 до 10 и посмотреть , если вы можете обнаружить их. Также кормить строку с помощью функции , которая вычисляет конечное положение и количество шагов, и искать закономерности там.

Затем вы можете использовать эти знания, чтобы упростить алгоритм к чему-то, что не использует эти строки на всех.

Ответил 09/12/2008 в 16:57
источник пользователем

голоса
2

строки Python не будет ответом на этот. Строки хранятся в виде неизменных массивов, поэтому каждый из этих замен создает совершенно новую строку в памяти. Не говоря уже, набор инструкций после 10 ^ 12 шагов будет по крайней мере 1 ТБ в размере, если вы храните их как символы (и это с некоторыми незначительными сжатий).

В идеале, должен быть способ математически (подсказка, есть) генерировать ответ на лету, так что вам не нужно, чтобы сохранить последовательность.

Просто используйте строку в качестве ориентира для определения метода, который создает свой путь.

Ответил 09/12/2008 в 18:42
источник пользователем

голоса
2

Если вы думаете о том, как много «а» и «б» символов находятся в D (0), D (1), и т.д., вы увидите, что строка получает очень долго очень быстро. Подсчитайте, сколько символов есть в D (50), а затем, возможно, подумайте еще раз о том, где вы бы сохранить большой объем данных. Я делаю это 4,5 * 10 ^ 15 символов, что 4500 ТБ на один байт на символ.

Давай думать об этом, вы не должны рассчитывать - проблема говорит вам есть 10 ^ 12 шагов, по крайней мере, что терабайт данных в один байт на символ, или четверть, что если вы используете уловки, чтобы получить вниз 2 бит на символ. Я думаю, что это может вызвать проблемы с одноминутным срока на любом носителе данных у меня есть доступ к :-)

Ответил 09/12/2008 в 16:51
источник пользователем

голоса
1

Так же, как слово предупреждения быть осторожным при использовании функции замены (). Если ваши строки очень большие (в моем случае ~ 5e6 символьных) функция замены будет возвращать подстроку (около ~ 4e6 символов), не бросать какую-либо ошибку.

Ответил 08/11/2011 в 21:02
источник пользователем

голоса
1

Поскольку вы не можете материализовать строку, вы должны создать его. Если вы уступите отдельные символы вместо возвращения всей строки, вы можете заставить его работать.

def repl220( string ):
    for c in string:
        if c == 'a': yield "aRbFR"
        elif c == 'b': yield "LFaLb"
        else yield c

Нечто подобное будет делать замену без создания новой строки.

Теперь, конечно, вам нужно вызвать его рекурсивно, и на соответствующую глубину. Таким образом, каждый выход не просто выход, это что-то немного более сложным.

Попытка не решить эту проблему для вас, так что я оставлю его в этом.

Ответил 09/12/2008 в 16:56
источник пользователем

голоса
0

Вы могли бы рассматривать D как файл потока байтов.

Что-то вроде:-

seedfile = открыт ( 'D1.txt', 'W'); seedfile.write ( "Закон"); seedfile.close (); п = 0, а (п

предупреждая полностью непроверенный

Ответил 09/12/2008 в 17:40
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more