gen similarity compute

256 篇文章 3 订阅
149 篇文章 2 订阅

1.similar_gen.cpp

#include <string.h>
#include <iostream>
#include <string>
#include <algorithm>
#include "boost/noncopyable.hpp"
using namespace std;
class similar_gen : public boost::noncopyable {
public:
    inline static similar_gen &get() {
        static similar_gen obj;
        return obj;
    }
    int compute_similarity(const string &gen_str0, const string &gen_str1) {
        if (false == check_gen_str(gen_str0) ||  false == check_gen_str(gen_str1)) {
            cerr << "invalid gen string...!" << endl;
            return -1;
        }
        make_status_equation(gen_str0, gen_str1);
        int size0 = gen_str0.size();
        int size1 = gen_str0.size();
        for (int i = 1;i <= size0;i++) {
            for (int j = 1;j <= size1;j++) {
                status_equation_[i][j] = max(status_equation_[i][j], status_equation_[i - 1][j - 1] + get_similarity(gen_str0[i - 1], gen_str1[j - 1]));
                status_equation_[i][j] = max(status_equation_[i][j], status_equation_[i][j - 1] + get_similarity(gen_str1[j - 1], '-'));
                status_equation_[i][j] = max(status_equation_[i][j], status_equation_[i - 1][j] + get_similarity(gen_str0[i - 1], '-'));
            }
        }
        return status_equation_[size0][size1];

    }
private:
    bool check_gen_str(const string &gen_str) {
        if (gen_str.size() > max_gen_len) {
            return false;
        }
        for (auto &ch : gen_str) {
            if (ch != 'A' && ch != 'C' && ch != 'G' && ch != 'T') {
                return false;
            }
        }
        return true;
    }
    void make_similarity() {
        similarity_array_['A']['A'] = 5;
        similarity_array_['A']['C'] = -1;
        similarity_array_['A']['G'] = -2;
        similarity_array_['A']['T'] = -1;
        similarity_array_['A']['-'] = -3;

        similarity_array_['C']['A'] = -1;
        similarity_array_['C']['C'] = 5;
        similarity_array_['C']['G'] = -3;
        similarity_array_['C']['T'] = -2;
        similarity_array_['C']['-'] = -4;

        similarity_array_['G']['A'] = -2;
        similarity_array_['G']['C'] = -3;
        similarity_array_['G']['G'] = 5;
        similarity_array_['G']['T'] = -2;
        similarity_array_['G']['-'] = -2;

        similarity_array_['T']['A'] = -1;
        similarity_array_['T']['C'] = -2;
        similarity_array_['T']['G'] = -2;
        similarity_array_['T']['T'] = 5;
        similarity_array_['T']['-'] = -1;

        similarity_array_['-']['A'] = -3;
        similarity_array_['-']['C'] = -4;
        similarity_array_['-']['G'] = -2;
        similarity_array_['-']['T'] = -1;
        similarity_array_['-']['-'] = -10;
    }
    inline int get_similarity(char ch0, char ch1) {
        return similarity_array_[ch0][ch1];
    }
    void make_status_equation(const string &gen_str0, const string &gen_str1) {
        memset(status_equation_, 0, sizeof(status_equation_));
        int size = gen_str0.size();
        for (int i = 1;i <= size;i++) {
            status_equation_[i][0] = status_equation_[i - 1][0] + get_similarity(gen_str0[i - 1], '-');
        }
        size = gen_str1.size();
        for (int i = 1;i <= size;i++) {
            status_equation_[0][i] = status_equation_[0][i - 1] + get_similarity(gen_str1[i - 1], '-');
        }
    }
private:
    similar_gen() {
        make_similarity();
    }
    virtual ~similar_gen() = default;
private:
    static const int max_gen_len = 100;
private:
    int similarity_array_[256][256];
    int status_equation_[max_gen_len + 1][max_gen_len + 1];

};
int main() {
    string str0 = "AGTGATG";
    string str1 = "GTTAG";
    cout << similar_gen::get().compute_similarity(str0, str1) << endl;

    return 0;
}

2.make.sh

g++ -std=c++14 -g -o Test similar_gen.cpp -I ../boost_1_69_0/ -L ../boost_1_69_0/libs/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值