|
发表于 2019-6-24 14:28:26
|
显示全部楼层
本帖最后由 王小召 于 2019-6-24 14:31 编辑
借用楼上答案, 本题重点:对于大数据查找效率考量,速度从快到慢:set > dict > list 如果本题第16行用 if num in b_nums(也就是:in + list模式) 做替换,用时可能会多百倍,复杂度会从O(log N) 编程了 O(N)!!
结果是:{134043: [3, 7, 13, 491], 134044: [2, 2, 23, 31, 47], 134045: [5, 17, 19, 83], 134046: [2, 3, 3, 11, 677]}
用时:0.6084039 秒
- import time
- def prime(N):
- bool_num = [1] * N
- bool_num[0], bool_num[1] = 0, 0
- for i, j in enumerate(bool_num):
- if j:
- for x in range(i**2, N, i):
- bool_num[x] = 0
- return [i for i, j in enumerate(bool_num) if j]
- def composite_numbers(num, b_nums, s_nums, result = []):
- if num in s_nums:
- result.append(num)
- return [num]
- sqr_n = num**0.5 + 1
- for each_prime in b_nums:
- if not num % each_prime:
- result.append(each_prime)
- composite_numbers(int(num/each_prime), b_nums, s_nums, result)
- break
- elif each_prime > sqr_n:
- break
- return result
- def cal_(N):
- b_nums = prime(N)
- s_nums = set(b_nums)
- d_result = {}
- for number in range(647, N):
- tmp = composite_numbers(number, b_nums, s_nums, [])
- if len(set(tmp)) == 4:
- d_result[number] = tmp
- else:
- d_result.clear()
- if len(d_result) == 4:
- return d_result
- print("结果是:{}\n用时:{} 秒".format(cal_(150000), time.process_time()))
复制代码
|
|