我正在寻找一种算法来获取长度为 n 布尔向量的整个向量空间,并将其划分为与条目旋转相同的向量。例如,如果 n=3,分区将是:-{(0,0,0)} -{(0,0,1),(0,1,0),(1,0,0)} -{( 0,1,1),(1,1,0),(1,0,1)} -{(1,1,1)} 一种(看似缓慢)的方法是生成所有可能的长度为 n 的布尔向量在列表的每个条目处生成所有与原始向量相似的向量,并将这些向量从列表中删除。关于更快算法的任何想法?
按相似度对布尔向量进行分组,直至旋转
计算科学
线性代数
算法
2021-12-08 03:04:01
2个回答
您可以从计算每个向量的布尔元素的总和开始。这将为您提供每个向量的置换不变度量。然后,您可以将具有相同(或相似)总和的向量聚类到相同的桶中。您可以轻松地为此使用哈希表。然后操作完成时间。
提供长度的向量足够大,值得考虑,这是离散傅里叶变换的完美问题。向量的 DFT是向量有条目
.
如果是循环置换向量的运算符经过, IE
,
那么循环置换和傅里叶变换的关系就很简单了:
。
一旦你计算了两个向量的 DFT,通过这个关系,你可以在时间内通过检查它们的 DFT 是否根据最后一个方程相关来检查它们是否是彼此的循环排列。DFT 的求和公式表明它只能 mathcal O(N\log N) 时间内计算,但通过一些聪明的做法,DFT 可以在时间内计算;执行此操作的算法称为快速傅里叶变换或 FFT。无论您使用什么语言,都可能有一个 FFT 实现。
其它你可能感兴趣的问题