给定一个整数列表,找到由除当前索引之外的所有元素的乘积组成的列表
Given a list of integers, find the list consisting of the product of all elements but the current index
我正在使用 Python 3.8.
考虑一个(严格)正整数的列表,例如
L = [1,2,3,4,5]
我的任务是计算一个新列表,使其第 i 个元素是 L 中除第 i 个元素之外的所有元素的乘积。因此,对于给定的 L,我们的结果将是
R = [120, 60, 40, 30, 24]
显然,我可以做到
R = [functool.reduce(operator.mul, [L[ix] for ix in range(len(L)) if ix != k]) for k in range(len(L))]
但是,这具有 二次 时间复杂度。
从数学上讲,简单地将 L 的所有元素相乘,然后通过将此乘积除以 L 的每个元素来构造 R 会更有效。当然,这有浮点精度限制,并且它在我的计算机上不适用于大型列表(len(L) 大约 10^4,数字在 1 到 1000 之间)。
有什么想法吗?请注意,如果第二种方法有效,时间复杂度会降低到 linear.
您很幸运,因为 Python 具有 任意精度 整数!所以你实际上可以将它们全部相乘然后除以给定的整数:
L = [1,2,3,4,5]
prod = 1
for el in L:
prod *= el
R = [prod//el for el in L]
注意使用整数除法//
。由于所有元素 el
都是 prod
的因子,因此这总是会导致精确除法。仅使用 /
会导致浮点除法,可能会引入错误。
我正在使用 Python 3.8.
考虑一个(严格)正整数的列表,例如
L = [1,2,3,4,5]
我的任务是计算一个新列表,使其第 i 个元素是 L 中除第 i 个元素之外的所有元素的乘积。因此,对于给定的 L,我们的结果将是
R = [120, 60, 40, 30, 24]
显然,我可以做到
R = [functool.reduce(operator.mul, [L[ix] for ix in range(len(L)) if ix != k]) for k in range(len(L))]
但是,这具有 二次 时间复杂度。
从数学上讲,简单地将 L 的所有元素相乘,然后通过将此乘积除以 L 的每个元素来构造 R 会更有效。当然,这有浮点精度限制,并且它在我的计算机上不适用于大型列表(len(L) 大约 10^4,数字在 1 到 1000 之间)。
有什么想法吗?请注意,如果第二种方法有效,时间复杂度会降低到 linear.
您很幸运,因为 Python 具有 任意精度 整数!所以你实际上可以将它们全部相乘然后除以给定的整数:
L = [1,2,3,4,5]
prod = 1
for el in L:
prod *= el
R = [prod//el for el in L]
注意使用整数除法//
。由于所有元素 el
都是 prod
的因子,因此这总是会导致精确除法。仅使用 /
会导致浮点除法,可能会引入错误。