想象你是一位古代的书信师,受托把一部长篇家书誊抄到羊皮纸上,交给驿站送往千里之外。你心里清楚:路上可能遇雨打湿字迹、被虫蛀出窟窿、被粗心的驿卒涂改,一百年后收信人打开信封,看到的可能是一张千疮百孔的纸。于是你在写信时就动足了脑筋——每一页编上页码,句末加上固定格式,关键词句多写几遍,甚至按一套秘密规则在信尾附上“验算数字”。写信人做的这些防损准备,就像DNA存储中的纠错编码。 DNA存储的思路与此几乎一模一样:我们把0和1的二进制信息,翻译成由A、T、C、G四个碱基组成的“字母表”写进人造DNA链里。可问题是,写入DNA(合成)和读出DNA(测序)这两个环节都不是百分百可靠的,就像誊抄和辨认都可能出错。一部长篇家书抄完,几乎必然会出现几处污损和错字。为了让数据在“碱基之路”上安然抵达几十年甚至几百年后的读者手中,科学家设计了一套又一套“防损心法”:有像账房先生验算数字一样的Reed-Solomon码,有像邻里互相作证一样的LDPC码,还有把两层防护套在一起的级联设计。这篇文章,就是带你认识这些让信息穿越时间的匠心工艺。

岗位关联

对AI从业者而言,理解DNA纠错编码,等于掌握“在物理不可靠介质上保证数据可靠”的底层方法论——这套思想可以迁移到分布式存储、数据传输、基因数据工程等场景,是数据可靠性工程师的核心内功。

目录
  1. 可视化演示
  2. 写入与读出的笔误:合成测序差错
  3. 账房先生的验算表:Reed-Solomon码
  4. 邻居互证夜巡队:LDPC码
  5. 内胆加木匣:级联设计
  6. 信纸上的密度博弈:冗余与容量
  7. 为DNA路况定制排版:错误模式优化
  8. 暴雨中的终考:基准评估
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示DNA存储中的三类错误模式、Reed-Solomon与LDPC纠错编码原理,以及内外码级联架构与冗余度权衡。

本节配有交互动效(进入视口后自动加载,约 3KB)。

DNA存储错误类型 替换(Sub):碱基被误读为另一碱基,序列长度不变 插入/删除(Indel):额外碱基插入或碱基漏读,引起相位错位 P_err = P_sub + P_ins + P_del, indel causes frame shift

写入与读出的笔误:合成测序差错

你还记不记得誊抄长信时最怕什么?笔尖一抖,把“戌”写成了“戍”;油灯太暗,加了一笔变成“戎”。等信送到收信人手里,老人家眯着眼睛读,又把“戍”看成了“戊”。DNA存储中的错误也分这两种来路:合成错误是“写信人写错”,测序错误是“收信人看错”。合成DNA时,机器在一个个位置拼接碱基,每一步化学反应的效率不是百分之百,于是序列里会混入错误的碱基;测序时,仪器靠荧光信号猜每个位置是A还是T,信号一模糊就可能猜错。

这两类错误具体表现为三种形态:替换(一个碱基被换成另一个)、插入(多出一个碱基)、缺失(漏掉一个碱基)。在纠错编码的语言里,替换叫substitution,插入和缺失合称indel。除此之外,DNA还有自己的“体质问题”:G和C含量过高或过低会让DNA链不稳定,连续重复同一个碱基(比如AAAA)容易让合成酶“打滑”。

这些错误对存储系统意味着什么?假设一条DNA片段有600个碱基,哪怕每个位置出错的概率只有百分之一,整条片段完全正确的概率也是惊人的低。所以,想用DNA存数据,必须先接受一个事实:错误是常态,不是意外。纠错编码的使命,不是假设路上不出岔子,而是假定岔子一定会来,然后确保收信人依然能还原出家书原文。

账房先生的验算表:Reed-Solomon码

账房先生每天要登记几十笔收支。他担心账本被虫蛀、被水泡,于是在每页末尾根据当天所有数字,按一套数学规则算出几个“验算数”。日后哪怕某几格数字看不清了,他也能凭验算数反推出原来的数字。这就是Reed-Solomon码(RS码)给人的感觉——一种非常“工整”的代数纠错码。

RS码的工整之处在于,它把数据切成许多符号(symbol),每个符号是一组比特。对于DNA存储,一个常见的做法是把4个碱基打包成1个符号(4个碱基正好有4⁴ = 256种组合,对应1字节)。编码时,k个数据符号经过多项式运算,生成n个总码元,多出来的n-k个码元就是“验算数”。解码时,只要出错符号的数量不超过上限,账房先生就能靠公式把正确的数字逐一还原。

RS码最迷人的性质是“符号级纠错”。一个符号内部哪怕有好几个碱基都错了,在RS码眼中也只是一个符号错误。这就像账本上一整行数字被水泡得面目全非,账房先生只当“这一行坏了”来处理,而不是逐个数字去猜。DNA存储中,测序错误常常成串出现,这种“按行算账”的思路就特别对症。

回到信纸的比喻:RS码就像在每页信纸末尾附上一组由正文数字算出来的验算数。只要被虫蛀掉的格子不超过总格数的一半减去一个,账房先生就能凭公式把真账从残页里完整还原出来。

RS(n,k),d=n−k+1,t=⌊n−k2⌋\displaystyle \text{RS}(n, k), \quad d = n - k + 1, \quad t = \left\lfloor \frac{n-k}{2} \right\rfloor
这段公式告诉我们:RS码的总长度n、数据符号数k、最小距离d和纠错能力t四个参数环环相扣,冗余符号越多,能纠正的错误也越多。
  1. 总码元数n编码后整组符号的总个数,相当于一页信纸上“正文格子 + 验算格”的总数。nn
  2. 数据符号数k真正承载信息的符号个数,对应信纸上的正文格子。kk
  3. 最小距离d任意两个合法码字之间至少有多少个符号不同。距离越大,一个字越不容易被错认成另一个字。d=n−k+1d = n - k + 1
  4. 纠错能力t能安全纠正的错误符号数上限,等于冗余符号数的一半向下取整。t=⌊n−k2⌋t = \left\lfloor \frac{n-k}{2} \right\rfloor

邻居互证夜巡队:LDPC码

如果说RS码靠的是账房先生一枝笔、一张验算表,那么LDPC码(低密度奇偶校验码)靠的则是一整个村子的人互相作证。村里每户人家(数据位)都跟几户邻居(校验位)提前约定:“咱两家的灯必须同亮同灭。”夜里哪家的灯坏了,邻居们一对暗号,发现“我和他约好了同亮,怎么我亮他灭?”于是大家举手表决,把出错那家的灯修正回来。LDPC码的校验规则非常稀疏,每家只跟少数几户有约定,这正是“低密度”名字的由来。

LDPC码的约束关系写下来就是一张稀疏的校验矩阵H。一个合法的码字c必须满足所有邻居约定:

LDPC的译码靠迭代消息传递:每个码元先根据自己接收到的值发表“看法”,邻居们收到看法后互相纠正,多轮“开会”之后,整个系统收敛到一个合法码字。这种集体议事的优点是纠错能力极强,在码长很长时能逼近香农极限(信道编码的理论上限);缺点是会议开得久,译码延迟比RS大。用在DNA存储上,LDPC更像“长链条的整体保险”,适合数据块大、错误分散的场景。

H⋅cT=0\displaystyle H \cdot c^{\mathsf{T}} = \mathbf{0}
这条式子用一句话说:校验矩阵乘上码字必须等于全零向量。只要某条约定被违反,就说明码字里藏着错误,下一步就交给迭代译码去修。
  1. 校验矩阵H一张稀疏表格,行代表校验约束(邻居约定),列代表码元位(各家各户),大部分格子是0,只有少数是1。HH
  2. 码字转置cᵀ把一整个码字竖起来,和表格做乘法。cTc^{\mathsf{T}}
  3. 零向量合法码字必须让每一条约定都恰好平衡。哪一行乘积不是0,就说明那一行相关的位置里有猫腻。0\mathbf{0}

内胆加木匣:级联设计

寄一封贵重的长信,你会怎么打包?先在里面套一层防水油纸,再装进结实的木匣。油纸挡住潮气,木匣扛住磕碰——两层防护各管一段。级联编码就是这个思路:一个编码器(内码)先贴近物理信道处理局部错误,另一个编码器(外码)在高一层兜底,清理内码漏掉的残余错误。

具体到DNA存储,常见组合是外层用RS码、内层用LDPC码。数据先经过外码RS编码,加上一层“验算数”;再经过内码LDPC编码,打散成适合写入DNA的码字。读出时顺序反过来:先做内码LDPC译码,处理掉大部分合成测序造成的零散错误;再做外码RS译码,把内码译码后残留的少量错误也收拾干净。

为什么两层叠加效果这么好?关键在于两层防护的职责不同,漏网之鱼的概率会相乘:

信纸、油纸、木匣,三层各司其职。级联编码的成功秘诀不是某一层特别强,而是每层只解决一层问题:内码吃下大量物理错误,外码负责“精修”。两套编码器串起来,数据就能在更恶劣的错误率下安然无恙。

P总≈P内×P外\displaystyle P_{\text{总}} \approx P_{\text{内}} \times P_{\text{外}}
如果内码把错误率降到1%,外码再把残余错误降到1%,最终错误率就是万分之一的量级——这就是级联的威力。
  1. P内内码译码之后仍然残留的错误概率,也就是第一层油纸没挡住的潮气。P内P_{\text{内}}
  2. P外外码译码之后最终残留的错误概率,是木匣最后把关后的结果。P外P_{\text{外}}
  3. 乘积近似两层独立防护的漏网概率相乘,比单层防护低好几个数量级。P总≈P内×P外P_{\text{总}} \approx P_{\text{内}} \times P_{\text{外}}

信纸上的密度博弈:冗余与容量

写长信时你常纠结:同一句话要不要写两遍?多写一遍,信纸更抗损,但一页纸能装的实质内容就变少。这就是冗余与容量的博弈。在DNA存储里,冗余度决定纠错能力,但也直接吃掉存储密度。

DNA每个碱基位置有4种选择,理论上最多携带2比特信息。但如果把纠错码的校验位算进去,实际每碱基携带的有效比特就不足了。我们定义编码率R为数据符号数k占总码元数n的比例:

冗余度买来的每一点纠错能力,都要用存储密度和合成成本来支付。DNA合成是按碱基收费的,冗余越多,成本越高,密度越低。工程师们要做的不是“越多越好”的堆料,而是在目标错误率约束下找到最小必要冗余——就像聪明的信使会根据路途的凶险程度决定抄几遍家书,而非盲目地每句话抄十遍。

R=kn,C=R×2 bit/nt\displaystyle R = \frac{k}{n}, \qquad C = R \times 2 \ \text{bit/nt}
编码率R表示“有效信息占比”,有效存储密度C等于编码率乘以每个碱基的理论上限2比特。冗余越多,R越低,密度越小。
  1. 编码率R有效数据符号在总码元中的占比,好比一页信纸上正文行数占总行数的比例。R=knR = \frac{k}{n}
  2. 每碱基2比特四种碱基对应四种状态,刚好编码2比特,这是DNA存储的物理天花板。2 bit/nt2 \ \text{bit/nt}
  3. 有效密度C扣除校验码元后,每个碱基位置平均携带的有效信息量。C=R×2C = R \times 2
  4. 单位bit/nt每核苷酸(即每个碱基)承载的比特数。bit/nt\text{bit/nt}

为DNA路况定制排版:错误模式优化

如果你常年跑某条驿道,就会积累一套经验:这条路多雨,得用防水墨;那段林子里虫子多,关键段落得隔页留白。DNA也有自己固定的“路况问题”,针对这些问题优化编码,相当于为DNA定制排版。

第一个路况是GC含量失衡。G和C之间的氢键比A和T更牢固,GC比例过高或过低都会影响DNA链的稳定性和合成效率。理想的编码会让整条序列中G和C的占比尽量接近50%。第二个路况是均聚物:连续出现多个相同的碱基(比如AAAAAA)会让合成酶“打滑”,测序时也容易数错个数。好的编码会限制连续相同碱基的长度,比如不超过3个。第三个路况是长程重复:同一段序列在远处反复出现会造成结构混乱,编码时要尽量避开。

这些约束可以用一个优化目标统一起来:

这些“排版规则”和RS/LDPC信道编码不同,它不属于纠错码,而是约束编码(constrained coding),作用是在信息写进DNA之前就把“路况差”的序列过滤掉。把排版功夫做在写字之前,后面的纠错码就能少面对许多麻烦。

min⁡s λ1∣GC(s)−0.5∣+λ2[max⁡_run(s)−3]+\displaystyle \min_{s} \ \lambda_1 \left| \text{GC}(s) - 0.5 \right| + \lambda_2 \left[ \max\_\text{run}(s) - 3 \right]_{+}
这条公式的意思是:在编码时给序列做“体检”,GC占比偏离50%越远、连续同碱基长度超过3越多,惩罚就越大,编码器会避开这些“差路况”。
  1. GC比例序列s中G和C两种碱基占全部碱基的比例,理想值是0.5。GC(s)=#G+#C#A+#T+#G+#C\text{GC}(s) = \frac{\#G + \#C}{\#A + \#T + \#G + \#C}
  2. 最大连续长度序列中最长连续相同碱基的个数,比如AAAA的run就是4。max⁡_run(s)\max\_\text{run}(s)
  3. 截断惩罚超过3的部分才计入惩罚,等于允许3个以内连续但不超过3个。[x]+=max⁡(0,x)\left[ x \right]_{+} = \max(0, x)
  4. 加权求和两个路况问题按重要程度加权,λ越大说明该问题对实验越致命。λ1(⋯ )+λ2(⋯ )\lambda_1(\cdots) + \lambda_2(\cdots)

暴雨中的终考:基准评估

各种防损方案到底谁强谁弱?不能靠写信人自吹自擂,得把同一封信用不同方法书写,放进同一场暴雨里淋,再让同一批收信人辨认。标准化基准就是这场暴雨的制定者。

在研究界,DNA存储有一批公开的基准数据集,它们包含真实的合成测序错误。评测方案时,研究者通常会看几个指标:原始错误率(不纠错时测序结果有多离谱)、纠错后错误率(经过纠错编码后还有多少错误)、存储密度(每碱基实际携带的有效比特数)、以及成本与译码复杂度。这些指标的权衡关系决定了方案是否实用。

不同方案在基准上的表现揭示了一个规律:没有万能的编码。在替换错误占主导的场景,RS+LDPC级联方案表现优秀;在合成错误严重、插入缺失较多的场景,特别处理indel的编码方案会胜出;而GC约束和均聚物约束在各种方案之上叠加,几乎总是能进一步降低错误率。工程上的最优解,永远是针对具体错误模式、成本预算和数据规模做出的折中。

这就像同一条驿道上,有的信使擅长防水,有的擅长防虫,有的信纸轻薄但怕潮,有的厚重但成本高——真正的老师傅会根据季节、路况和预算,挑出最合适的那一套组合。DNA纠错编码的本质,正是这样一门“读懂路况、精心打包、毫不懈怠”的手艺。

AI 应用场景

国家档案馆的DNA数字档案保存

阶段:数据编码与可靠性设计

解决的问题:档案馆想把海量珍贵档案存进DNA,存放几百年。传统硬盘寿命只有十几年,而DNA合成和测序的错误率又高得惊人。通过RS码作为外码、LDPC码作为内码的级联设计,加上GC含量平衡的约束编码,把错误率从千分之一量级压到百万分之一以下,让档案在“碱基信纸”上长眠百年。

具体案例:某国家级档案馆计划把一批古籍扫描数据编码进DNA。工程师先将文件按块切分,每块用RS(255, 223)加外码,再用LDPC内码编码,并做均聚物约束。模拟测序时,即使整条600碱基链出现20个合成错误,解码后依然能100%还原原文。

合成生物学中的DNA喷码溯源

阶段:信息编码与安全

解决的问题:合成生物公司需要在每一批合成DNA片段中嵌入身份标签(类似二维码),但标签序列本身也会在合成测序中出错。传统方案直接连一串编号,错一个碱基就认错产品。引入纠错编码后,编号被包裹进RS码,少量碱基错误不影响溯源判断。

具体案例:一家生物公司给每支合成基因片段尾端加上16个碱基的纠错标签:8个碱基存编号,8个碱基做校验。出库质检时即便测序读出3个错误碱基,系统也能准确识别出批次和产线信息,大大提升了溯源可靠性。

基因测序数据链路的完整性校验

阶段:数据存储与传输

解决的问题:测序仪每天产出TB级reads数据,传输和归档过程中可能发生硬件错误。传统存储系统用通用校验码,但对生物数据语义不理解。借鉴DNA纠错编码的级联思想,在测序数据归档前做一层纠错封装,可同时抵抗传输噪声和存储介质老化。

具体案例:某基因测序公司搭建数据湖,把参考基因组比对后的BAM文件按块加LDPC纠错码,再上传云端。某次存储节点故障导致少量数据块损坏,运维团队用编码冗余在几分钟内完成了原文件的无损恢复,避免了重新测序的巨大成本。

Python 演示

python60 行
from itertools import combinations # 简化版 Reed-Solomon 纠错演示# 用 GF(7) 小素数域模拟有限域 展示 DNA 存储的符号级纠错思想 def add(a, b):    return (a + b) % 7 def mul(a, b):    return (a * b) % 7 def div(a, b):    inv = pow(b, 5, 7)  # 费马小定理 b^6 = 1 mod 7    return (a * inv) % 7 def interp(xs, ys, x):    # 拉格朗日插值 计算多项式在 x 处的值    total = 0    for i in range(len(xs)):        num = 1        den = 1        for j in range(len(xs)):            if i == j:                continue            num = mul(num, (x - xs[j]) % 7)            den = mul(den, (xs[i] - xs[j]) % 7)        total = add(total, mul(ys[i], div(num, den)))    return total def rs_encode(data):    # 4 个数据符号 在 6 个非零点求值 得到 6 个码元    xs = [1, 2, 3, 4, 5, 6]    return [interp([1, 2, 3, 4], data, x) for x in xs] def rs_correct(recv):    # 任选 4 个位置插值恢复 再重编码验证    xs = [1, 2, 3, 4, 5, 6]    for combo in combinations(range(6), 4):        px = [xs[i] for i in combo]        py = [recv[i] for i in combo]        data = [interp(px, py, x) for x in [1, 2, 3, 4]]        enc = rs_encode(data)        diff = [i for i in range(6) if enc[i] != recv[i]]        if len(diff) == 1:            return data, True    return None, False def main():    data = [1, 2, 3, 4]    enc = rs_encode(data)    print("encoded:", enc)    recv = enc[:]    recv[3] = (recv[3] + 2) % 7  # 模拟第 4 个码元发生替换错误    print("received:", recv)    fixed, ok = rs_correct(recv)    print("fixed data:", fixed)    print("success:", ok and fixed == data) if __name__ == "__main__":    main()
目的:用GF(7)上的简化RS码演示DNA存储中的符号级纠错——4个数据符号编码为6个码元后,即使其中一个码元被替换,也能通过插值验证法把它找出来并恢复原始数据。
  1. return (a + b) % 7有限域加法,所有运算结果都落在0到6的符号集合内,保证编码闭环。
  2. inv = pow(b, 5, 7)用费马小定理求乘法逆元,让“除法”在有限域里可行。
  3. data = [interp(px, py, x) for x in [1, 2, 3, 4]]用任意4个未损坏的码元反推出原来的数据符号。
  4. enc = rs_encode(data)把还原出的数据重新编码,与接收到的码元比对。
  5. diff = [i for i in range(6) if enc[i] != recv[i]]找出重编码与接收码元不一致的位置,那个位置就是错误码元。
  6. if len(diff) == 1恰好只有一处不一致,说明成功定位并纠正了错误;这也对应RS码“冗余够一半就能纠一”的性质。

常见误区

误区DNA测序不是很准吗?现在测序仪精度那么高,估计错误率不到百万分之一,直接存数据就行了,加纠错码只会浪费宝贵的存储空间。

正解测序仪的单碱基读序精度确实很高,但那是在“读一段已知DNA”时反复测序取平均的结果。对于DNA存储,写入时每合成一个碱基的错误率通常在千分之一到百分之一量级,一条几百碱基的链几乎必然带错。更关键的是,单次测序读出的信号可能有模糊,需要多次覆盖再投票,这本质上也是一种纠错。纠错编码不是可选项,而是DNA存储能成立的基石。

为何常见:人们容易被测序仪宣传的“高精度”误导,把“人类基因组测序的最终共识结果”误当成“单次读取的真实水平”,忽略了纠错在背后扮演的角色。

误区既然纠错编码能把错误率降下来,那我把校验位加到总长度的一半,纠错能力不就越强?DNA存储越安全。

正解冗余不是免费的午餐。校验位越多,编码率R越低,存储密度越小,合成成本还随总长度直线上升。工程上正确的做法是:先设定一个可接受的目标错误率(比如让一份档案百年内损坏概率低于亿分之一),再反向寻找最小冗余方案。多出来的冗余买到的只是用不上的“安全感”,却付出了真实的密度和金钱代价。

为何常见:人的直觉是“保险越多越好”,但忽略了保险有保费;在存储系统里,这个保费就是密度、成本和带宽。

误区Reed-Solomon码这么厉害,多加几个校验符号,不管信被水泡成什么样都能还原。

正解RS码的纠错能力有严格上限:t = ⌊(n-k)/2⌋,最多只能纠正冗余符号一半那么多个错误。如果错误的符号数超过这个上限,解码器要么报错,要么还原出完全错误的数据。而且RS码纠错的是符号错误,一个符号内部错再多位也只算一个错误;反过来,如果错误分散在每个符号各错一位,那也照样算多个符号错误。任何纠错码都有天花板,设计时必须在错误率、冗余和成本之间取平衡。

为何常见:大家在看纠错码宣传时常被“强大”字眼迷惑,忽略了它的数学边界;边界恰恰是工程设计的起点。

误区LDPC码能逼近香农极限,RS码又老又弱,DNA存储直接用LDPC不就行了?

正解两者擅长场景不同。LDPC在长码长、高码率下性能逼近理论极限,但译码要迭代多轮,延迟高、硬件复杂度大;RS码在中等码长下实现简单、译码延迟低、对突发错误更稳。在DNA存储的实践中,RS和LDPC经常是以级联形式合作,RS做外码、LDPC做内码,各用所长。盲目用LDPC替代一切,反而可能在短片段场景得到更差的效果。

为何常见:人们容易用“新碾压旧”的简单线性思维看技术演进,但不同编码在码长、错误模式、复杂度维度上各有生态位。

误区我RS+LDPC级联已经很猛了,序列里出现连续六个A、GC比例高一点又有什么关系,反正最后都能纠回来。

正解如果GC含量严重失衡或均聚物过长,合成效率会大幅下降,甚至导致整条DNA链合不出来;测序时均聚物区域也容易数错碱基个数。更糟的是,这类问题会成片出现,直接把错误率推到纠错码的纠错上限之外。所以约束编码(GC平衡、均聚物限制)和信道编码(RS/LDPC)是互补的两层防线:先把路况修好,再让纠错码安心工作。

为何常见:初学者常把纠错编码当成万能药,忽略信道编码之前的“信号整形”环节,然而在物理存储系统中,坏到极致的信道是任何纠错码都救不回来的。

面试题

Q1. DNA存储中,合成和测序过程会引入错误,这两个环节分别对应什么?

单选题 · easy

  • A.压缩与加密环节
  • B.写入与读出环节← 正确答案
  • C.编码与解码环节
  • D.存储与删除环节

答案:B。合成是把信息“写”进DNA链,对应写入环节;测序是读出DNA序列,对应读出环节。两者都会引入错误,就像写信和读信都可能出错。压缩、加密、编码是信息处理环节,不是物理写入读出的过程。

Q2. Reed-Solomon码把数据切成符号来处理,一个关键特点是?

单选题 · easy

  • A.按符号级整体纠错← 正确答案
  • B.按比特逐个纠错
  • C.依赖深度学习训练
  • D.需要重复发送三遍

答案:A。RS码是符号级纠错,一个符号内部坏再多位都只算一个符号错误。这就像账房先生把一整行数字当成一个整体来验算,而不是逐个数字盯。DNA测序的错误常成串出现,符号级纠错天然适配。

Q3. DNA一个碱基位置有四种选择,理论上最多携带多少比特信息?

单选题 · easy

  • A.1比特
  • B.2比特← 正确答案
  • C.4比特
  • D.8比特

答案:B。四种碱基对应四种状态,2比特正好有4种组合。这是DNA存储的物理密度上限。实际还要乘以编码率R扣除纠错冗余,所以有效密度达不到2比特/碱基。

Q4. RS(n,k)码能纠正的符号错误数t是多少?

单选题 · mid

  • A.冗余符号的总个数
  • B.冗余个数的一半取整← 正确答案
  • C.数据符号的一半取整
  • D.与冗余个数无关

答案:B。RS码的纠错能力是冗余符号数的一半向下取整,即 t = ⌊(n-k)/2⌋。冗余数量决定了纠错上限,超过这个上限就无法恢复。就像验算数再多也不可能让整页被烧掉的信纸复原。

Q5. LDPC码译码时主要采用什么方法?

单选题 · mid

  • A.深度优先搜索
  • B.迭代消息传递← 正确答案
  • C.穷举所有码字
  • D.直接查表求解

答案:B。LDPC译码通过各变量节点与校验节点之间反复交换“软信息”,多轮迭代让所有约束达成一致。相当于村里邻居互相传递消息、反复商讨,最终达成共识。穷举在长码长下不可行,查表也因码字过多而不可行。

Q6. 级联编码中,内码的主要职责是什么?

单选题 · mid

  • A.负责压缩数据体积
  • B.负责物理层局部纠错← 正确答案
  • C.负责对数据加密
  • D.负责生成索引编号

答案:B。内码贴近物理信道,负责吃掉大部分合成测序带来的随机和突发错误;外码则处理内码遗留的残余错误。就像油纸先挡潮气、木匣再扛磕碰,两层职责不同、缺一不可。

Q7. DNA序列中出现均聚物(如连续多个A)会带来什么问题?

单选题 · hard

  • A.使测序信号更清晰
  • B.导致聚合酶滑移错误← 正确答案
  • C.增加碱基多样性
  • D.提升数据编码效率

答案:B。均聚物让合成酶在连续相同碱基处“打滑”,造成插入缺失错误;测序时也难以精确数出连续相同碱基的个数。所以编码时要限制均聚物长度,比如不超过3个,这是DNA存储特有的约束优化。

Q8. 下列哪些是针对DNA特有错误模式的编码优化策略?

多选题 · mid

  • A.保持GC含量平衡← 正确答案
  • B.限制均聚物长度← 正确答案
  • C.增加连续重复碱基
  • D.避免长程重复结构← 正确答案

答案:ABD。GC平衡、限制均聚物、避免长程重复都是针对DNA物理化学特性的约束编码手段。增加连续重复碱基反而会制造均聚物,加剧错误,是错误选项。这些策略在RS/LDPC纠错之前就把“路况”修好。

Q9. 关于冗余度与存储密度的关系,下列说法正确的有哪些?

多选题 · hard

  • A.增加冗余会降低存储密度← 正确答案
  • B.冗余为零时纠错能力最强
  • C.存储密度与编码率成正比← 正确答案
  • D.增加冗余会提升合成成本← 正确答案

答案:ACD。冗余增加意味着校验位占比提高,编码率R下降,密度和成本都会受损;冗余为零时没有纠错能力。密度C = R × 2 bit/nt,与R成正比。工程上要在目标错误率下找最小必要冗余。

Q10. 在GF(q)上构造的RS码中,一个符号内部错多个比特与错1个比特,在纠错计数上有何区别?

单选题 · extreme

  • A.都记为单个符号错误← 正确答案
  • B.按比特数累计错误
  • C.无法计算错误数量
  • D.按碱基个数分次记错

答案:A。RS码工作在符号级,一个符号无论内部错1位还是错满全部位,都只算一个符号错误。反之,如果错误分散在多个符号中,哪怕每个符号只错1位,也要按多个符号错误计算。理解这一点是设计RS参数、估算纠错上限的前提,也是面试中的高频考点。