def factorize(n):
factors = (
[(2, exp)]
if (exp := (n & -n).bit_length() - 1)
else []
)
i = 3
while i**2
Но на самом деле это намного медленнее для большинства случаев, это медленно факторизировать числа, которые не близки к идеальным квадратам, а факторизация основных чисел занимает слишком много времени. Я, конечно, могу использовать список простых чисел для определения раннего возврата самой глубокой рекурсии, но, как упоминалось выше, моя оперативная память конечна ... < /p>
Этот вопрос не о двух вышеупомянутых алгоритмах , Я включил их, чтобы показать свое исследование. Поэтому я придумал свой собственный алгоритм, я не знаю, думал ли кто -нибудь об этом раньше, но я написал это менее чем за 15 минут. Это очень быстро, но требует гораздо больше оперативной памяти, чем два выше, и работает только для конечного количества входов. Каждое число отмечено как Prime, отметьте все его кратные как кратные Prime, поэтому мы получим отображение всех композитов в диапазоне с одним из их факторов, тогда мы можем просто многократно разделить число (в пределах диапазона) на его Связанный фактор, пока число не будет найдено в картировании (следовательно, оно было уменьшено до первого). < /p>
время выполнения почти постоянно, но вычисление таблицы занимает много Времени и содержания памяти. < /p>
import numpy as np
from itertools import cycle
TRIPLE1 = ((4, 2, 2), (9, 6, 3), (25, 10, 5))
WHEEL = (4, 2, 4, 2, 4, 6, 2, 6)
def min_prime_factors(n):
primes = np.ones(n + 1, dtype=bool)
primes[:2] = False
composites = {}
for square, double, prime in TRIPLE1:
primes[square::double] = False
for i in range(square, n + 1, double):
composites[i] = prime
wheel = cycle(WHEEL)
k = 7
while (square := k**2) 2**25:
raise ValueError("Number too large")
factors = []
while n > 1 and (index := MIN_FACTORS.get(n)):
prime = PRIME_LIST[index]
factors.append(prime)
n //= prime
if n > 1:
factors.append(n)
return factors
< /code>
Это требуется намного меньше, чем микросекунда для факторизации большинства чисел, но таблица занимает около 2,5 ГБ ОЗУ, а предел алгоритма довольно мал, я попытался использовать это для генерации Таблица для чисел до 2^30, но для запуска потребовалось вечно, и она использовала более 10 Гиб ОЗУ, мне пришлось прервать ее. < /p>
Как я могу заставить ее потреблять меньше памяти? Я предполагаю, что это невозможно. Теперь, это тривиально, чтобы определить силы двух, поэтому мне нужно сохранить только нечетные числа и номера карт для индексов по этому: (n - 3) // 2
, это сокращает использование памяти таблицы половина, но это не уменьшает потребление памяти во время просеивания, и этого недостаточно. п>
Я пытаюсь написать эффективную программу основной факторизации в качестве задачи по программированию, потому что факторизация действительно сложна. />[code]def factorize(n): factors = ( [(2, exp)] if (exp := (n & -n).bit_length() - 1) else [] )
i = 3 while i**2 Но на самом деле это намного медленнее для большинства случаев, это медленно факторизировать числа, которые не близки к идеальным квадратам, а факторизация основных чисел занимает слишком много времени. Я, конечно, могу использовать список простых чисел для определения раннего возврата самой глубокой рекурсии, но, как упоминалось выше, моя оперативная память конечна ... < /p> Этот вопрос не о двух вышеупомянутых алгоритмах , Я включил их, чтобы показать свое исследование. Поэтому я придумал свой собственный алгоритм, я не знаю, думал ли кто -нибудь об этом раньше, но я написал это менее чем за 15 минут. Это очень быстро, но требует гораздо больше оперативной памяти, чем два выше, и работает только для конечного количества входов. Каждое число отмечено как Prime, отметьте все его кратные как кратные Prime, поэтому мы получим отображение всех композитов в диапазоне с одним из их факторов, тогда мы можем просто многократно разделить число (в пределах диапазона) на его Связанный фактор, пока число не будет найдено в картировании (следовательно, оно было уменьшено до первого). < /p> время выполнения почти постоянно, но вычисление таблицы занимает много Времени и содержания памяти. < /p> import numpy as np from itertools import cycle TRIPLE1 = ((4, 2, 2), (9, 6, 3), (25, 10, 5)) WHEEL = (4, 2, 4, 2, 4, 6, 2, 6)
def min_prime_factors(n): primes = np.ones(n + 1, dtype=bool) primes[:2] = False composites = {} for square, double, prime in TRIPLE1: primes[square::double] = False for i in range(square, n + 1, double): composites[i] = prime
wheel = cycle(WHEEL) k = 7 while (square := k**2) 2**25: raise ValueError("Number too large")
factors = [] while n > 1 and (index := MIN_FACTORS.get(n)): prime = PRIME_LIST[index] factors.append(prime) n //= prime
if n > 1: factors.append(n)
return factors < /code> Это требуется намного меньше, чем микросекунда для факторизации большинства чисел, но таблица занимает около 2,5 ГБ ОЗУ, а предел алгоритма довольно мал, я попытался использовать это для генерации Таблица для чисел до 2^30, но для запуска потребовалось вечно, и она использовала более 10 Гиб ОЗУ, мне пришлось прервать ее. < /p> Как я могу заставить ее потреблять меньше памяти? Я предполагаю, что это невозможно. Теперь, это тривиально, чтобы определить силы двух, поэтому мне нужно сохранить только нечетные числа и номера карт для индексов по этому: (n - 3) // 2 [/code], это сокращает использование памяти таблицы половина, но это не уменьшает потребление памяти во время просеивания, и этого недостаточно. п>
Я пытаюсь понять, как анализировать временную сложность алгоритма сортировки вставками, реализованного на Java. У меня есть следующий код, и я был бы признателен за рекомендации по определению его обозначения Big-O.
Вот код Java сортировки...
for row in range(0, height, 2):
for col in range(0, width, 2):
# Each pixel in the result image use the the average
# colour of the 2x2 pixels from the original image
# (i.e. the pixel itself in row,col and pixels in
# row,col+1 -- row+1,col --...
for row in range(0, height, 2):
for col in range(0, width, 2):
# Each pixel in the result image use the the average
# colour of the 2x2 pixels from the original image
# (i.e. the pixel itself in row,col and pixels in
# row,col+1 -- row+1,col --...
В тестовом примере с длиной строки около 10^4 превышено ограничение по времени. Я думаю, это связано с тем, что функция string.erase() имеет временную сложность o(N), где N — длина строки. Пожалуйста, помогите...