非常抱歉因为表述不清而给您带来困扰,但实际上我不知道我的操作中哪一部分是低效的。
我制作了一个程序,可以处理正整数列表(例如*):
*真实列表的长度可以长达2000个元素,元素的值在0到100,000之间(不包括100,000)。
并创建一个字典,其中每个数字与其索引(例如:
因此,3的条目将是:
找出所有唯一可能的三元组,其中第三个值可以被第二个值整除,而第二个值可以被第一个整除,这与it技术有关。如果您认为有更好的方法来完成整个过程,我很乐意重新做整个过程。最终编辑:通过重新评估我所需要的功能,我已经找到了计算三元组数量的最佳方法。这种方法实际上并不会找到三元组,只是计算它们的数量。
我制作了一个程序,可以处理正整数列表(例如*):
[1, 1, 3, 5, 16, 2, 4, 6, 6, 8, 9, 24, 200,]
*真实列表的长度可以长达2000个元素,元素的值在0到100,000之间(不包括100,000)。
并创建一个字典,其中每个数字与其索引(例如:
(number,index)
)成为键,每个键的值是输入中可以被它整除的每个数字(及其索引)的列表。因此,3的条目将是:
(3,2):[(16, 4),(6, 7),(6, 8),(9, 10),(24, 11)]
我的代码如下:num_dict = {}
sorted_list = sorted(beginning_list)
for a2, a in enumerate(sorted_list):
num_dict[(a, a2)] = []
for x2, x in enumerate(sorted_list):
for y2, y in enumerate(sorted_list[x2 + 1:]):
if y % x == 0:
pair = (y, y2 + x2 + 1)
num_dict[(x, x2)].append(pair)
但是,当我运行这个脚本时,我遇到了一个 MemoryError
错误。
我知道这意味着我的内存不足,但在我所处的情况下,增加更多的内存或更新到64位版本的Python都不是一个选项。
我确定问题不是来自于列表排序或第一个 for 循环。一定是第二个 for 循环。 我只是为了上下文而包含其他行。
以上列表的完整输出将是(抱歉,字典就是这样不排序):
(200, 12): []
(6, 7): [(24, 11)]
(16, 10): []
(6, 6): [(6, 7), (24, 11)]
(5, 5): [(200, 12)]
(4, 4): [(8, 8), (16, 10), (24, 11), (200, 12)]
(9, 9): []
(8, 8): [(16, 10), (24, 11), (200, 12)]
(2, 2): [(4, 4), (6, 6), (6, 7), (8, 8), (16, 10), (24, 11), (200, 12)]
(24, 11): []
(1, 0): [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (6, 7), (8, 8), (9, 9), (16, 10), (24, 11), (200, 12)]
(1, 1): [(2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (6, 7), (8, 8), (9, 9), (16, 10), (24, 11), (200, 12)]
(3, 3): [(6, 6), (6, 7), (9, 9), (24, 11)]
有没有更好的方法来处理这个问题?
编辑:
然后将使用此字典:
ans_set = set()
for x in num_dict:
for y in num_dict[x]:
for z in num_dict[y]:
ans_set.add((x[0], y[0], z[0]))
return len(ans_set)
找出所有唯一可能的三元组,其中第三个值可以被第二个值整除,而第二个值可以被第一个整除,这与it技术有关。如果您认为有更好的方法来完成整个过程,我很乐意重新做整个过程。最终编辑:通过重新评估我所需要的功能,我已经找到了计算三元组数量的最佳方法。这种方法实际上并不会找到三元组,只是计算它们的数量。
def foo(l):
llen = len(l)
total = 0
cache = {}
for i in range(llen):
cache[i] = 0
for x in range(llen):
for y in range(x + 1, llen):
if l[y] % l[x] == 0:
cache[y] += 1
total += cache[x]
return total
这里是一个函数的版本,它在执行过程中解释了思路(由于打印的垃圾信息,对于巨大的列表不太好):
def bar(l):
list_length = len(l)
total_triples = 0
cache = {}
for i in range(list_length):
cache[i] = 0
for x in range(list_length):
print("\n\nfor index[{}]: {}".format(x, l[x]))
for y in range(x + 1, list_length):
print("\n\ttry index[{}]: {}".format(y, l[y]))
if l[y] % l[x] == 0:
print("\n\t\t{} can be evenly diveded by {}".format(l[y], l[x]))
cache[y] += 1
total_triples += cache[x]
print("\t\tcache[{0}] is now {1}".format(y, cache[y]))
print("\t\tcount is now {}".format(total_triples))
print("\t\t(+{} from cache[{}])".format(cache[x], x))
else:
print("\n\t\tfalse")
print("\ntotal number of triples:", total_triples)