使用BitSet对核苷酸数据压缩保存(减少87.5%空间)

简介: 使用BitSet对核苷酸数据压缩保存(减少87.5%空间)

DNA中组成基因的核苷酸。每个核苷酸只能是以下4个值之一:A、C、G或T。如果将基因存储为Java字符串(可以将其视为Unicode字符的集合),则每个核苷酸将由一个字符表示,在Java中通常需要16位的存储空间(Java默认使用UTF-16编码)。二进制只需要2位来存储这种具有4个值的类型,00、01、10和11就是可以用2位表示的4个不同值。如果用00表示A,01表示C,10表示G,11表示T,那么一个核苷酸字符串所需的存储空间可以减少87.5%(每个核苷酸从16位减少到2位)。我们可以将核苷酸存储为位串类型,而不是String(见图1.5)。正如其名,位串就是由1和0组成的任意长度的序列。

一、代码实现

import java.util.BitSet;
 
public class CompressedGene {
    private BitSet bitSet;
    private int length;
 
    /**
     * @param gene 核苷酸字符创:ACGT
     */
    public CompressedGene(String gene) throws IllegalAccessException {
        compress(gene);
    }
 
    /**
     * 将字符串压缩为bitSet
     *
     * @param gene
     */
    private void compress(String gene) throws IllegalAccessException {
        length = gene.length();
        // 初始化BitSet大小
        bitSet = new BitSet(length * 2);
 
        final String upperGene = gene.toUpperCase();
        for (int i = 0; i < length; i++) {
            final int firstLocation = 2 * i;
            final int secondLocation = 2 * i + 1;
            switch (upperGene.charAt(i)) {
                case 'A': // 00
                    bitSet.set(firstLocation, false);
                    bitSet.set(secondLocation, false);
                    System.out.print("00 ");
                    break;
                case 'C':// 01
                    bitSet.set(firstLocation, false);
                    bitSet.set(secondLocation, true);
                    System.out.print("01 ");
                    break;
                case 'G':// 10
                    bitSet.set(firstLocation, true);
                    bitSet.set(secondLocation, false);
                    System.out.print("10 ");
                    break;
                case 'T':// 11
                    bitSet.set(firstLocation, true);
                    bitSet.set(secondLocation, true);
                    System.out.print("11 ");
                    break;
                default:
                    throw new IllegalAccessException("The provided gene String contains characters other than ACGT");
            }
        }
        System.out.println();
    }
 
    /*
     *解压
     * */
    public String decompress() {
        if (bitSet == null) {
            return "";
        }
        StringBuilder builder = new StringBuilder(length);
        for (int i = 0; i < (length * 2); i += 2) {
            final int firstBit = (bitSet.get(i) ? 1 : 0);
            final int secondBit = (bitSet.get(i + 1) ? 1 : 0);
            // lastBits是通过将第一位左移一位,然后将结果与第二位进行“或”运算(运算符为|)得到的。
            // 当一个值被向左移动时,使用<<运算符,出现的空位用0来填充。或运算表示“如果这些位中的任何一位为1,则结果为1。
            final int lastBits = firstBit << 1 | secondBit;
            switch (lastBits) {
                case 0b00:
                    builder.append("A");
                    break;
                case 0b01:
                    builder.append("C");
                    break;
                case 0b10:
                    builder.append("G");
                    break;
                case 0b11:
                    builder.append("T");
                    break;
            }
        }
        return builder.toString();
    }
   
}

二、测试

 public static void main(String[] args) throws IllegalAccessException {
      final String original="TAGGATTAACCCTTATATAATAT";
        CompressedGene compressedGene=new CompressedGene(original);
        String decompress = compressedGene.decompress();
        System.out.println(decompress);
    }
11 00 10 10 00 11 11 00 00 01 01 01 11 11 00 11 00 11 00 00 11 00 11 
TAGGATTAACCCTTATATAATAT

相关文章
|
XML 数据挖掘 Linux
服务器丨Linux安装测试单细胞分析软件copykat,遇到的常见报错与解决思路与方法
服务器丨Linux安装测试单细胞分析软件copykat,遇到的常见报错与解决思路与方法
|
传感器 测试技术 定位技术
HarmonyOS Next 模拟器安装与探索
HarmonyOS 5 的发布带来了许多新特性,尤其是 HarmonyOS Next 模拟器。本文将带你一步步了解如何安装和使用这个强大的工具,帮助你更好地进行开发,加速项目进展。通过 DevEco Studio 的 Device Manager,你可以轻松创建、配置并启动模拟器,模拟真实设备的效果,支持多窗口、跨设备测试等新特性。此外,模拟器还提供了虚拟传感器、GPS 模拟、音频输入等功能,极大地方便了开发和调试过程。掌握这些功能,能让你的开发更加高效便捷。
1133 9
WK
|
算法
粒子群算法的优缺点分别是什么
粒子群优化(PSO)算法概念简单,易于编程实现,参数少,收敛速度快,全局搜索能力强,并行处理高效。然而,它也容易陷入局部最优,参数设置敏感,缺乏坚实的理论基础,且性能依赖初始种群分布,有时会出现早熟收敛。实际应用中需根据具体问题调整参数以最大化优势。
WK
2069 3
|
搜索推荐 Docker 容器
生信分析代码之前还好好的,怎么就报错了 Error in Ops. data. frame(guide_loc, panel_loc) :'==' only defined for equally-sized data frames
执行 `DimPlot` 函数时遇到错误 `;Error in Ops. data. frame(g guides_loc, panel_loc) : &#39;==&#39; only defined for equally-sized data frames`。解决方案和办法
2670 0
生信分析代码之前还好好的,怎么就报错了 Error in Ops. data. frame(guide_loc, panel_loc) :'==' only defined for equally-sized data frames
|
机器学习/深度学习 存储 数据采集
【Python 机器学习专栏】PCA(主成分分析)在数据降维中的应用
【4月更文挑战第30天】本文探讨了主成分分析(PCA)在高维数据降维中的应用。PCA通过线性变换找到最大化方差的主成分,从而降低数据维度,简化存储和计算,同时去除噪声。文章介绍了PCA的基本原理、步骤,强调了PCA在数据降维、可视化和特征提取上的优势,并提供了Python实现示例。PCA广泛应用在图像压缩、机器学习和数据分析等领域,但降维后可能损失解释性,需注意选择合适主成分数量及数据预处理。
1519 1
|
物联网 程序员 语音技术
STM32智能小车(循迹、跟随、避障、测速、蓝牙、wife、4g、语音识别)总结-3
STM32智能小车(循迹、跟随、避障、测速、蓝牙、wife、4g、语音识别)总结
STM32智能小车(循迹、跟随、避障、测速、蓝牙、wife、4g、语音识别)总结-3
【读paper】比kmer更省空间的minimizer
【读paper】比kmer更省空间的minimizer
972 1
【读paper】比kmer更省空间的minimizer
【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放
从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,还是那就话,别死记网上结论、在使用内外关联时,特别是简写方式时记住关联条件不要乱放!【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放
|
算法
【无标题】牛客网——水仙花数
【无标题】牛客网——水仙花数
170 0
|
机器学习/深度学习 数据可视化 算法
Nat. Commun. | 从单细胞转录组数据中学习可解释的细胞和基因签名嵌入
Nat. Commun. | 从单细胞转录组数据中学习可解释的细胞和基因签名嵌入
453 0
Nat. Commun. | 从单细胞转录组数据中学习可解释的细胞和基因签名嵌入