Предупреждение об окончательной оптимизации: не оптимизируйте преждевременно. Каждый раз, когда вы пытаетесь оптимизировать код, профилируйте его, чтобы убедиться, что он нуждается в оптимизации, и профилируйте оптимизацию на том же типе данных, для которого вы собираетесь его оптимизировать, чтобы убедиться, что это ускорение. Почти весь код не нуждается в оптимизации. оптимизация, просто чтобы дать правильный ответ.
Если вы оптимизируете для малых xy и больших ab:
Создайте массив с наименьшим общим кратным из всех x, x+1, x+2... y. Например, для 2, 3, 4, 5 будет 60, а не 120.
Теперь заполните этот массив логическими значениями - сначала false для каждой ячейки, затем для каждого числа в x-y заполните все записи в массиве, кратные этому числу, значением true.
Теперь для каждого числа в a-b индексируйте массив по модулю длины массива, и если это правда, пропустите, если оно ложно, вернитесь.
Вы можете сделать это немного быстрее, удалив из ваших чисел с множителями от x до y, разложения простых множителей которых являются строгими надмножествами разложений простых множителей других чисел. Я имею в виду, что если у вас есть 2, 3, 4, 5, 4, это 2 * 2 строгое надмножество 2, поэтому вы можете удалить его, и теперь длина нашего массива составляет всего 30. Для чего-то вроде 3, 4, 5, 6 однако 4 равно 2*2, а 6 равно 3*2. 6 является надмножеством 3, поэтому мы удаляем его, но 4 не является надмножеством всего, поэтому оставляем его. НОК равно 3*2*2*5 = 60. Выполнение такого рода вещей само по себе дало бы некоторое ускорение для больших ab, и вам может не понадобиться идти в направлении массива, если это все, что вам нужно.
Кроме того, имейте в виду, что если вы не собираетесь использовать весь результат функции каждый раз — например, иногда вас интересует только наименьшее значение — напишите его как генератор, а не как функцию. Таким образом, вы можете звонить до тех пор, пока у вас не будет достаточно номеров, а затем остановиться, сэкономив время.
person
Patashu
schedule
12.04.2013