假设我有一个如下所示的二维数组:
GACTG
AGATA
TCCGA
每个数组元素都取自一个小的有限集(在我的例子中是 DNA 核苷酸 -- {A, C, G, T}
)。我想以某种方式随机打乱这个数组,同时保留行和列核苷酸频率。这可能吗?能否高效完成?
[编辑]:我的意思是我想生成一个新矩阵,其中每一行的A
s、C
s、G
s 和T
s 的数量与原始矩阵的相应行相同,并且每列的A
s 数量相同,C
s, G
s 和T
s 作为原始矩阵的对应列。 置换原始矩阵的行或列通常不会实现这一点。 (例如,对于上面的示例,顶行有 2个,G
每个1个A
,C
和T
A
G
T
通过一次改组一列来保留列频率很简单,对于行也是如此。但这样做通常会改变另一种频率。
到目前为止我的想法: 如果可以选择 2 行和 2 列,以便这个矩形角的 4 个元素具有模式
XY
YX
对于一些不同的元素X
和Y
,然后将这 4 个元素替换为
YX
XY
将保持行和列频率。在顶部的示例中,可以对(至少)第 1 行和第 2 行以及第 2 和第 5 列(其角为 2x2 矩阵AG;GA
)以及第 1 行和第 3 行以及第 1 和第 4 列(其角为GT;TG
)执行此操作. 显然,这可以重复多次以产生某种程度的随机化。
概括一下,由行子集和列子集引起的任何“子矩形”,其中所有行的频率相同,所有列的频率相同,都可以将其行和列置换以产生一个有效的完整矩形。(其中,只有那些至少改变了 1 个元素的子矩形才是真正有趣的。)大问题:
- 是否所有有效的完整矩阵都可以通过一系列这样的“子矩形重排”到达? 我怀疑答案是肯定的。
- 是否所有有效的子矩形重排都可以分解为一系列 2x2 交换? [编辑]:mhum 的反例表明答案是否定的。不幸的是,因为这似乎使得想出一个有效的算法变得更加困难,但知道这一点很重要。
- 是否可以有效地计算部分或全部有效重排?
这个问题解决了一个特殊情况,其中可能元素的集合是{0, 1}
。人们提出的解决方案与我自己提出的解决方案相似,并且可能可用,但并不理想,因为它们需要任意数量的回溯才能正常工作。我也担心只考虑 2x2 交换。
最后,理想情况下,我希望有一个解决方案可以证明可以从具有与原始相同行频率和列频率的所有矩阵集中随机均匀地选择一个矩阵。我知道,我要求很多:)