基因数据压缩算法是一个初级的数据压缩算法,基因数据如下所示"ATAGATGCAT",如果使用标准的ASCII编码(每个字符1个字节),这个基因字符串的流长度是10*8=80位。

这些字符是由4种不同的字符组成,所有我们可以使用双位编码压缩,比如 A:00, C:01, T:10, G11,压缩之后我们就可以在一个字节存放4个基因字符了,当数据比较大时,压缩效率为25%。

完整代码

#include <iostream>
#include <string>
using namespace std;void PrintBits(const char *pstr, int width = 1);// ACTG A:00, C:01, T:10, G11
class Dna
{
public:Dna() : sizes(0) {}Dna(const char *str);void AddCompress(const char c) { Compress(c); }void AddCompress(const char *pstr);string Expand();int Size() const { return sizes; }string Data() const { return data; }string Compress() const { return compressData; }void PrintCompressData() { PrintBits(compressData.c_str()); }void PrintCompressData(int width) { PrintBits(compressData.c_str(), width); }private:int sizes; // 存放数据数string data;    // 存放原始数据string compressData; // 存放压缩后的二进制数据void Compress(const char c);unsigned char Index(char c);char Table(int index) const;void PrintBits(const char c);void PrintBits(const char *pstr, int width = 1);
};int main(void)
{char str[] = "ACTG";Dna dna(str);cout << dna.Size() << endl;cout << dna.Expand() << endl;dna.AddCompress("GTCA");cout << dna.Size() << endl;cout << dna.Expand() << endl;dna.PrintCompressData();system("pause");return 0;
}Dna::Dna(const char *str) : sizes(0)
{if (str){const char *p = str;while (*p){Compress(*p);p++;}}
}void Dna::AddCompress(const char *pstr)
{if (!pstr)return;const char *p = pstr;while (*p){Compress(*p);p++;}
}// class Dna private scope// 压缩字符c,并添加到compressData中
void Dna::Compress(const char c)
{data.append(1, c);if (sizes % 4 == 0)compressData.append(1, '\0');int n = sizes % 4;compressData[sizes / 4] |= Index(c) << (6 - 2 * n);sizes++;
}// 解压缩,并以string返回
string Dna::Expand()
{string s;for (int i = 0; i < sizes; i++){int n = i % 4;unsigned char index = ((unsigned char)compressData[i / 4]) >> (6 - 2 * n);s.append(1, Table(index));}return s;
}// 根据char值返回对应的索引,比如'A'为0时返回0
unsigned char Dna::Index(char c)
{if (c == 'A')return 0;else if (c == 'C')return 1;else if(c == 'T')return 2;else // if(c == 'G')return 3;
}// 根据index值返回对应的字符,比如index为0时返回'A'
char Dna::Table(int index) const
{static char table[4] = { 'A', 'C', 'T', 'G' };return table[index % 4];
}void Dna::PrintBits(const char c)
{for (int i = 0; i < 8; i++){if ((c << i) & 0x80)cout << '1';elsecout << '0';}
}void Dna::PrintBits(const char *pstr, int width)
{if (!pstr)return;const char *p = pstr;int nums = 0;while (*p){PrintBits(*p);p++;if (!((++nums) % width))cout << endl;}cout << endl;
}

输出结果为:

参考

《算法》 第四版 5.5 数据压缩

基因数据压缩算法(ACTG) C++相关推荐

  1. TCGA肿瘤基因数据的访问(二)

    TCGA(The Cancer Genome Atlas)项目完成后,最终和其它的一些肿瘤医学项目一起归档在 GDC Portal网站,方便人们访问. 网址是  https://portal.gdc. ...

  2. 基于JPEG压缩编码的数据压缩算法的研究与实现(转)

    基于JPEG压缩编码的数据压缩算法的研究与实现(转) 编辑器加载中... JPEG压缩方法由于其较高的压缩比和理想的压缩效果,是目前应用最广泛的图像压缩方法.它采用一种特殊的有损压缩算法,将不易被人眼 ...

  3. 【论文笔记】高维基因数据中的特征选择

    原论文:Feature Selection for High-Dimensional Genomic Microarray Data 介绍 基因数据通常具有较高的维度,同时可用样本数少.不到100例维 ...

  4. lz78算法c语言,LZW数据压缩算法研究

    内容介绍 LZW数据压缩算法研究 46页 3.2万字 摘 要 随着信息化技术的蓬勃发展,日常需要处理或者传输的数据越来越多,数据的压缩也就变得越来越重要了.我们迫切的需要有好的压缩算法来支持我们的数据 ...

  5. 高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据...

    原文链接:http://tecdat.cn/?p=23378 1 介绍 在本文中,我们将研究以下主题 证明为什么低维预测模型在高维中会失败. 进行主成分回归(PCR). 使用glmnet()进行岭回归 ...

  6. python编写同步欧氏距离轨迹压缩_基于相对同步欧氏距离筛选的在线GPS轨迹数据压缩算法.PDF...

    基于相对同步欧氏距离筛选的在线GPS轨迹数据压缩算法 第35卷第3期 计算机应用与软件 Vol35No.3 2018年3月 ComputerApplicationsandSoftware Mar.2 ...

  7. bwt比对算法 C语言,BWT数据压缩算法

    urrower-Wheeler变换 1994年 Michael Burrows 和 David Wheeler在<A Block-sorting Lossless Data Compressio ...

  8. R语言零基础基因/数据差异分析(二)

    文章目录 结果展示 安装ggplot2包 制作方法 注意,本 系列 有连贯性,每一步都很详细,每一步都很重要,请耐心读完!! 结果展示 安装ggplot2包 如图操作 找到并勾上即可. 制作方法 关于 ...

  9. 数据压缩算法—2无损压缩算法

    几个常见的编码算法 (一) 字典算法   字典算法是最为简单的压缩算法之一.它是把文本中出现频率比较多的单词或词汇组合做成一个对应的字典列表,并用特殊代码来表示这个单词或词汇.例如:   有字典列表: ...

最新文章

  1. ELK 性能优化实践
  2. 面向对象的 JavaScript 编程及其 Scope 处理
  3. hbid新建html标签不能用,hbhdjtx.html
  4. JS的parseInt
  5. 声明属性Hibernate的Annotation注解
  6. 创建java取消module_IntelliJ IDEA 2020使用之模块新建删除导入!
  7. jquery 赋值时不触发change事件解决
  8. zip:命令行下zip压缩/解压缩
  9. jpa 事务嵌套事务_JPA 2 | EntityManagers,事务及其周围的一切
  10. leetcode 188. 买卖股票的最佳时机 IV(dp)
  11. 维码扫描之集成Zxing
  12. Matlab【光学】波动光光学系统
  13. 十分钟玩转3D绘图:WxGL完全手册(第二版)
  14. HPD2368计算机上没有打印机,HPD2368打印机显示堵纸了,打印不了, – 手机爱问
  15. 从标准到开源,阿里大淘宝技术的“创新担当”
  16. Pentaho Data Integration初步安装
  17. java lua_请问该如何在Java中使用Lua脚本语言?
  18. 黑马程序员————高新技术————类加载器
  19. python基础之内置成员和魔法函数(16)
  20. 互联网结合产业,并不是为了继续建筑互联网与实体产业之间的高墙

热门文章

  1. 通向Golang的捷径【19. 创建一个完整应用】
  2. 华为荣耀8,奇怪的耳机模式~
  3. 港湾教育集团VI设计(企业视觉识别)
  4. 可优比消毒柜开关按键失灵和无法加热问题
  5. ANSYS Topology Optimization拓扑优化技术在轻量化设计应用概述
  6. Java VisualVM
  7. 使用 MethodInfo 调用带ref参数的方法
  8. android onresume 焦点,Android – 是否有一个回调,在onResume()之后被调用?
  9. oracle中如何查看端口号,Oracle EMGC查看端口
  10. 淘宝优质详情页优化策略