【问题标题】:Boolean convolution algorithm?布尔卷积算法?
【发布时间】:2014-03-27 09:26:19
【问题描述】:

我需要执行布尔卷积;即位向量的卷积,其中:

  • OR 是“加法”运算
  • AND 是“乘法”运算

有没有我可以使用的算法(可能类似于 FFT)以比二次方时间更快的速度执行此操作?

我研究过“数论变换”(NTT),但它们似乎是模算术的傅立叶模拟(在加法时回绕),而不是布尔算术(在加法时饱和)。

我知道的最佳选择是通过浮点 1 和 0 的向量来近似它,并简单地使用 FFT 并在某个截止值处对结果进行阈值化,但这可能容易出错(并且可能比必要的慢,虽然错误是我更关心的问题)。
(无论如何,我想知道是否有一种“正确”的方法可以做到这一点,尽管有这种潜在的选择。)

【问题讨论】:

  • 您确定要使用 OR 表示“加法”吗?通常,AND 和 XOR 会在布尔值上为您提供环结构...
  • 注意:我看到了一些优化机会:1)如果你使用OR,你可以短路。 2)您可以在窗口(或两个窗口)中保留 0s/1s 的计数,当它全部为 0s/1s 时,您就知道该离散点的结果。
  • @Krystian:是的;我不是在这里寻找环形结构。所以这意味着convolve([1], [1]) 对于我的应用程序肯定应该是[1]
  • @KarolyHorvath:我不确定你的意思。你在考虑游程编码吗?如果你是,我认为虽然在某些情况下它非常有效,但在其他情况下它可能是二次的。如果没有,那么我想我没有理解你的意思。
  • 1) 正如你所说,加法饱和。一旦达到 1,它就会一直停留在那里,所以不需要计算这个值的其余操作

标签: algorithm boolean fft convolution


【解决方案1】:

如果您将布尔向量作为 0-1 向量在整数上对大于较短向量长度的整数进行卷积(即分离中的最大项数),则非零条目的模式是相同的.

【讨论】:

  • +1 它确实在某些时候发生在我身上,但我没有意识到它必须是 shorter 向量的长度。感谢您指出。 (仍在寻找更好的答案,但至少这给出了一个准确的解决方案。)
  • @Mehrdad Re 一个更好的答案:有些半环我们不知道如何有效地进行卷积(参见,例如,mathoverflow.net/questions/10237/…)。如果已知更好的算法,那么它会以某种根本不同的方式利用布尔半环的结构。这将是一个非常有趣的结果,所以我觉得如果它存在的话我现在会遇到它(但话又说回来,这不是我的“家”算法子领域)。你可以试试 cstheory 网站。
  • 哇哦,这真的很有趣。我认为可能的原因是,当我搜索时,我看到到处都提到“FFT”,但我不确定它如何应用于布尔卷积。例如,on this page,他们提到了“布尔卷积(FFT)”,但没有提到如何去做,所以我不确定在那里做什么。我可以试试那个网站,谢谢..