当前位置: 首页 > news >正文

《深度剖析算法优化:提升效率与精度的秘诀》

想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以通过特定的算法来解决。算法就像是一把神奇的钥匙,为解决各种各样的问题提供了方法和途径。无论是在科学研究、商业运营还是日常生活中,算法都发挥着不可或缺的作用。

原型—源码

原型

import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

原型—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。

    • 但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

一次优化—源码

任何一个数只需要找其小于开根号的整数即可

import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

一次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。

    • 但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

二次优化—源码

跳过小于2的数

import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

二次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。

    • 但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

三次优化—源码

在检查大于2的数时,只检查奇数

import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

三次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 首先排除小于2的数,因为它们不是质数。

    • 对于2这个特殊的数,直接返回True。

    • 对于偶数(除了2),直接返回False。

    • 然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。

    • 如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

四次优化—源码

先算乘积

import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

四次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。

    • 但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

五次优化—源码

任何一个数只需要找其小于开根号的整数即可 先算乘积

import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)    if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

五次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。

    • 但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

六次优化—源码

跳过小于2的数 先算乘积

import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)    if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

六次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 首先排除小于2的数,因为它们不是质数。

    • 对于2这个特殊的数,直接返回True。

    • 对于偶数(除了2),直接返回False。

    • 然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。

    • 如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

七次优化—源码

在检查大于2的数时,只检查奇数 先算乘积

import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)    if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

七次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 首先排除小于2的数,因为它们不是质数。

    • 对于2这个特殊的数,直接返回True。

    • 对于偶数(除了2),直接返回False。

    • 然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。

    • 如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

八次次优化—源码

p、q循环减半

import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

八次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。

    • 但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

九次优化—源码

任何一个数只需要找其小于开根号的整数即可 p、q循环减半

import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

九次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。

    • 但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

十次优化—源码

跳过小于2的数 p、q循环减半

import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

十次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 首先排除小于2的数,因为它们不是质数。

    • 对于2这个特殊的数,直接返回True。

    • 对于偶数(除了2),直接返回False。

    • 然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。

    • 如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq02函数,传入的参数是99460729。

优化建议:

  1. 优化is_prime函数,只需要检查到sqrt(n)就可以了。

  2. 对于prime_pq02函数,可以考虑使用更高效的算法,如试除法结合埃拉托斯特尼筛法来找出质数因子。

  3. 可以添加更多的错误检查和边界条件处理,例如检查输入的n是否为正整数。

下面是优化后的代码:

import math
import timedef is_prime(n):if n <= 1:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if is_prime(p) and n % p == 0:q = n // pif is_prime(q):print(p, '*', q)end = time.time()print(end - start)returnprint("No prime factors found")if __name__ == '__main__':prime_pq02(99460729)

这个优化后的代码应该会更快地找到99460729的两个质数因子。

十一次优化—源码

在检查大于2的数时,只检查奇数 p、q循环减半

import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

十一次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 首先排除小于2的数,因为它们不是质数。

    • 对于2这个特殊的数,直接返回True。

    • 对于偶数(除了2),直接返回False。

    • 然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。

    • 如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。

    • 如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

十二次优化—源码

减少p、q循环时间,并对判断p、q为循环优化依次调用

import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

十二次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。

    • 但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。

    • 然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

十三次优化—源码

任何一个数只需要找其小于开根号的整数即可 减少p、q循环时间,并对判断p、q为循环优化依次调用

import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

十三次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。

    • 但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。

    • 然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

十四次优化—源码

跳过小于2的数 减少p、q循环时间,并对判断p、q为循环优化依次调用

import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

十四次优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 首先排除小于2的数,因为它们不是质数。

    • 对于2这个特殊的数,直接返回True。

    • 对于偶数(除了2),直接返回False。

    • 然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。

    • 如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。

    • 然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

最终优化—源码

在检查大于2的数时,只检查奇数 减少p、q循环时间,并对判断p、q为循环优化依次调用

import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)

最终优化—源码解析

这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:

  1. 导入模块:

    • math: 这个模块提供了数学函数,但在这个代码中并没有被使用。

    • time: 这个模块被用来测量程序的执行时间。

  2. is_prime函数:

    • 这个函数用于判断一个数是否为质数。

    • 首先排除小于2的数,因为它们不是质数。

    • 对于2这个特殊的数,直接返回True。

    • 对于偶数(除了2),直接返回False。

    • 然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。

    • 如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。

  3. prime_pq函数:

    • 这个函数用于找出一个数的两个质数因子。

    • 它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。

    • 然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。

    • 这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。

  4. 主程序:

    • 在主程序中,调用了prime_pq函数,传入的参数是99460729。

高阶优化

思路:

1、优化is_prime函数,只需要检查到sqrt(n)就可以了。
2、prime_pq函数,可以考虑使用更高效的算法,如试除法结合埃拉托斯特尼筛法/Pollard's rho算法来找出质数因子。
3、并行化处理在多核处理器上运行,可以将筛选质数或者试除的过程进行并行化,进一步提高效率。
4、添加更多的错误检查和边界条件处理,例如检查输入的n是否为正整数。

以后有时间再来演示高阶算法。

相关文章:

《深度剖析算法优化:提升效率与精度的秘诀》

想象一下&#xff0c;你面前有一堆杂乱无章的数据&#xff0c;你需要从中找到特定的信息&#xff0c;或者按照一定的规则对这些数据进行排序。又或者&#xff0c;你要为一个物流公司规划最佳的配送路线&#xff0c;以降低成本和提高效率。这些问题看似复杂&#xff0c;但都可以…...

Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引工作原理,索引失效,索引创建原则等)

索引是数据库中用于加速查询操作的重要机制。通过索引&#xff0c;MySQL可以快速定位到满足查询条件的数据行&#xff0c;而不需要扫描整个表。合理的索引设计可以显著提高查询性能&#xff0c;但不合理的索引可能会导致性能下降和磁盘空间浪费。因此&#xff0c;理解索引的工作…...

matlab使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理等等

%% 初始化程序 warning off % 关闭报警信息 close all % 关闭所有图窗 clear % 清空变量 clc % 清空命令行 setdemorandstream(172) %设置随机种子为1%% 读取数据 data xlsread(Y.xlsx); %% 划分训练集…...

systemd-networkd NetworkManager 介绍

systemd-networkd 和 NetworkManager 的详细介绍 systemd-networkd 和 NetworkManager 都是 Linux 系统中常用的网络管理工具&#xff0c;但它们的设计目标和使用场景不同。以下是它们的详细介绍、功能、使用场景和差异。 1. systemd-networkd systemd-networkd 是一个由 syst…...

本地部署项目管理工具 Leantime 并实现外部访问

Leantime 是一款开源 AI 项目。它可以在本地直接运行大语言模型 LLM、生成图像、音频等。直接降低了用户使用AI的门褴。本文将详细的介绍如何利用 Docker 在本地部署 Leantime 并结合路由侠实现外网访问本地部署的 Leantime 。 第一步&#xff0c;本地部署安装 Leantime 1&am…...

PHP cURL 函数初学者完全指南

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

C#中的Array数组,List集合和ArrayList集合--07

目录 一.Array数组概念的简单理解 1.数组的初始化 2.数组的长度 3.数组的克隆和复制 4.数组的清空 5.数组的查找 6.数组的逆转 7.数组的拓展和缩减 8.数组的比较 9.数组的合并 10.使用Array类中的静态方法,如Array.Sort,Array.BinarySearch 等 二.Array数组进阶 1.二…...

基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用

在使用 PySide6 进行开发时&#xff0c;管理应用程序的资源&#xff08;如图标、图片、字体、样式表、音视频等&#xff09;是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc&#xff0c;它能够将资源文件&#xff08;.qrc&#xff09;编译成 Python 模块&#xff0c;然后…...

硬件实用技巧:TPS54331DR横杠标识识别1引脚

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/145116969 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

《C++11》nullptr介绍:从NULL说起

在C11之前&#xff0c;我们通常使用NULL来表示空指针。然而&#xff0c;NULL在C中有一些问题和限制&#xff0c;这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中&#xff0c;NULL实际上是一个整数0&#xff0c;而不是一个真正的…...

自然语言处理基础:全面概述

自然语言处理基础&#xff1a;全面概述 什么是NLP及其重要性、NLP的核心组件、NLU与NLG、NLU与NLG的集成、NLP的挑战以及NLP的未来 自然语言处理&#xff08;NLP&#xff09;是人工智能&#xff08;AI&#xff09;中最引人入胜且具有影响力的领域之一。它驱动着我们日常使用的…...

网络安全的几种攻击方法

攻击方法 挂马: 就是在别人的网站文件里面放入网页木马或者是将代码潜入到对方正常的网页文件里&#xff0c;以使浏览者中马。 挖洞: 指漏洞挖掘。 加壳: 就是利用特殊的算法&#xff0c;将EXE可执行程序或者DLL动态连接库文件的编码进行改变&#xff08;比如实现压缩、加密&a…...

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章&#xff1a;Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具&#xff0c;放到C盘根目录&#xff0c; 2.1 打开windows Powershell&#xff08;WinX&#xff09;&#xff0c;下边那个最好。 输入两条指令&a…...

【pycharm发现找不到python打包工具,且无法下载】

发现找不到python打包工具,且无法下载 解决方法&#xff1a; 第一步&#xff1a;安装distutils&#xff0c;在CMD命令行输入&#xff1a; python -m ensurepip --default-pip第二步&#xff1a;检查和安装setuptools和wheel&#xff1a; python -m pip install --upgrade …...

C++ QT 自绘表盘

文章目录 效果图代码 效果图 代码 代码没什么好说的&#xff0c;直接上源码.h #pragma once#include <QWidget> #include <QPainter> #include <QResizeEvent> #include <QtMath> #include <QCoreApplication>class DialPlateWidget : public …...

数据科学与数据工程:两者的区别与交集

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

MAC AndroidStudio模拟器无网络

先确认PC端是正常访问网络的&#xff1b; 模拟器端修改Wifi设置&#xff1a;设置 - 网络和互联网 - WALN设置 按照上图修改&#xff1b; IP设置&#xff1a;从DHCP修改为静态&#xff0c;IP地址&#xff1a;10.0.2.16 &#xff0c;网关&#xff1a;10.0.2.2 &#xff0c; DNS…...

PHP语言的多线程编程

PHP语言的多线程编程 引言 在现代Web开发中&#xff0c;PHP以其简洁和易用性广受欢迎。它常用于构建动态网站和应用程序。然而&#xff0c;PHP本身是单线程的&#xff0c;这意味着它在处理多个任务时可能会受到性能限制。随着互联网的发展&#xff0c;对高并发、高可用性和实…...

当自动包布机遇上Profinet转ModbusTCP网关,“妙啊”,工业智能“前景无限

在自动化控制技术日新月异的当下&#xff0c;Profinet与ModbusTCP这两种协议在工业通信领域占据着举足轻重的地位。ModbusTCP是基于以太网的串行通信协议&#xff0c;而Profinet则是依托工业以太网的现场总线协议。它们在数据传输速度、实时性表现以及兼容性等方面各具特色。不…...

浅析大语言模型安全和隐私保护国内外标准和政策

过去两年&#xff0c;大模型技术已经普及并逐步渗透到各行各业&#xff0c;2025年注定是大模型应用井喷式发展的一年&#xff0c;AI在快速发展的同时&#xff0c;其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载&#xff1a;600多…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...

C++ Saucer 编写Windows桌面应用

文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架&#xff0c;开发Windows桌面应用&#xff0c;把一个html页面作为GUI设计放到Saucer里&#xff0c;隐藏掉运行时弹…...

CCF 开源发展委员会 “开源高校行“ 暨红山开源 + OpenAtom openKylin 高校行活动在西安四所高校成功举办

点击蓝字 关注我们 CCF Opensource Development Committee CCF开源高校行 暨红山开源 openKylin 高校行 西安站 5 月 26 日至 28 日&#xff0c;CCF 开源发展委员会 "开源高校行" 暨红山开源 OpenAtom openKylin 高校行活动在西安四所高校&#xff08;西安交通大学…...

django paramiko 跳转登录

在使用Django框架结合Paramiko进行SSH远程操作时&#xff0c;通常涉及到自动化脚本的执行&#xff0c;比如远程服务器上的命令执行、文件传输等。如果你的需求是“跳转登录”&#xff0c;即在登录远程服务器后&#xff0c;再通过该服务器的SSH连接跳转到另一台服务器&#xff0…...

AI短视频创富营

课程内容&#xff1a; 相关资料 【第一章】前期准备 001.【涨粉技巧】新账号如何快速涨粉?_ev(1).mp4 002.【带贷权限】如何开通账号带贷权限?(1).mp4 003.【费用缴纳】如何缴纳账号保证金?_ev(1).mp4 004.【账号检测】如何检测账号是否限流?(1).mp4 005.【风险规避…...

使用swoole作为MQTT客户端并接收实现即时消息推送

环境准备 首先需要安装swoole 可以使用pecl进行安装 &#xff0c;如 pecl install swool, 注意加上版本号 或者使用构建好的docker镜像&#xff0c;这里使用构建好的 zacksleo/php:7.1-alpine-fpm-swoole 镜像 使用 compose 安装依赖库 composer require jesusslim/mqttcl…...

低空城市场景下的多无人机任务规划与动态协调!CoordField:无人机任务分配的智能协调场

作者&#xff1a;Tengchao Zhang 1 ^{1} 1 , Yonglin Tian 2 ^{2} 2 , Fei Lin 1 ^{1} 1, Jun Huang 1 ^{1} 1, Patrik P. Sli 3 ^{3} 3, Rui Qin 2 , 4 ^{2,4} 2,4, and Fei-Yue Wang 5 , 1 ^{5,1} 5,1单位&#xff1a; 1 ^{1} 1澳门科技大学创新工程学院工程科学系&#xff0…...