来自密集集的对:确定总和的直方图比 Ο(n²) 快得多
Pairs from a dense set: Determine histogram of sums much faster than Ο(n²)
给定S个n个小于9的自然数n/7,如何确定从 0 到 18n/7 中每个数字的总和的对数?(2 个组合,3 < n)
设m为S.
中元素的最大值
如果 m 是 n-1,则对的计数序列总和为 ( 0, 1, … 18n/7 ) 将是 [ 0, 1, 1, 2, 2, … m/2, m/2, (m+2)/2 , m/2, m/2, (m-2)/2, … 2, 1, 1, 0, …, 0 ] 为奇数 n, 或 [ 0, 1, 1, 2, … (n-2)/2, (n- 2)/2, n/2, n/2, n/2, (n-2)/2, (n-2)/2, (n-4)/2 , … 2, 1, 1, 0, …, 0 ] 对于偶数 n.
如果 n 是 S 的一个元素(而下面的数字之一不是),则建立计数并不难,就像嵌套两个循环并仅计算出现的次数一样每个总和 - Ο(n²):
如何建立 对总和的直方图 (比 Ο(n²) 快得多)?
(知道 m < 9n/7 有帮助吗?
9n/2 < m((半)稀疏集)是否特别难?)
可以在 O(nlogn)
中使用傅里叶变换完成。
首先回忆一下 convolution 定义为:
(h*g)[n] = sum { h[n-i] + f[i] | i in Z }
并注意 histogram of the data is exactly what you want. Convolution can be calculated in O(nlogn)
using Fourier transform 上的卷积。
这给出了以下基本算法:
- 使用基于 has/tree 的地图创建直方图。让它成为h.
- 使用傅里叶变换求 (h*h)。
给定S个n个小于9的自然数n/7,如何确定从 0 到 18n/7 中每个数字的总和的对数?(2 个组合,3 < n)
设m为S.
中元素的最大值
如果 m 是 n-1,则对的计数序列总和为 ( 0, 1, … 18n/7 ) 将是 [ 0, 1, 1, 2, 2, … m/2, m/2, (m+2)/2 , m/2, m/2, (m-2)/2, … 2, 1, 1, 0, …, 0 ] 为奇数 n, 或 [ 0, 1, 1, 2, … (n-2)/2, (n- 2)/2, n/2, n/2, n/2, (n-2)/2, (n-2)/2, (n-4)/2 , … 2, 1, 1, 0, …, 0 ] 对于偶数 n.
如果 n 是 S 的一个元素(而下面的数字之一不是),则建立计数并不难,就像嵌套两个循环并仅计算出现的次数一样每个总和 - Ο(n²):
如何建立 对总和的直方图 (比 Ο(n²) 快得多)?
(知道 m < 9n/7 有帮助吗?
9n/2 < m((半)稀疏集)是否特别难?)
可以在 O(nlogn)
中使用傅里叶变换完成。
首先回忆一下 convolution 定义为:
(h*g)[n] = sum { h[n-i] + f[i] | i in Z }
并注意 histogram of the data is exactly what you want. Convolution can be calculated in O(nlogn)
using Fourier transform 上的卷积。
这给出了以下基本算法:
- 使用基于 has/tree 的地图创建直方图。让它成为h.
- 使用傅里叶变换求 (h*h)。