最长公共子序列的泛型算法

最长公共子序列的泛型算法

经典的公共子序列算法需要两个序列的长度已知.而且通常用于计算字符串的公共子序列.

我实现的算法剥离了一些易变部分,使得算法极度可适配.能用于字符串公共子序列计算和文件diff计算.理论上能用于任何具备相似特征的两个序列的公共子序列计算.

LCS_Calculate有三个变种:

template<typename L_Iterator,typename R_Iterator,typename Container>

LCS_Size FEtool::LCS_Calculate(L_Iterator lbeg,L_Iterator lend,

                    R_Iterator rbeg,R_Iterator rend,Container &out);

template<typename L_Iterator,typename R_Container,typename Container>

inline LCS_Size FEtool::LCS_Calculate(L_Iterator lbeg,L_Iterator lend,

                    R_Container const&rcontainer, Container &out);

template<typename L_Container,typename R_Container,typename Container>

inline LCS_Size FEtool::LCS_Calculate(L_Container const& lcontainer,

                    R_Container const&rcontainer, Container &out);

L_Iterator接受输入迭代器. R_Iterator接受随机迭代器. L_ContainerR_Container分别接受stl接口兼容的容器并调用begin()end()转调用到LCS_Calculate的第一个版本.

L_*打头的指代比较序列中左边那个,R_*打头的指代比较序列中右边那个.

最后一个参数Container&out接收一个序列用来输出序列各段相同的地方.典型的Container参数为std::deque<FEtool::SectionCommon> section;也可以为FEtool:: EmptyContainer.如果为FEtool:: EmptyContainer参数则通过模板特化代码选择不计算两段序列的相同部分。

 

struct FEtool::LCS_Compare_Trait定义了比较算法,默认用operator==.你可以在FEtool空间通过特化或偏特化LCS_Compare_Trait:: equal来定制它.

 

struct FEtool::SectionCommon指示两个序列的相同部分. 比如SectionCommon:: L_begin0, SectionCommon:: R_begin10, SectionCommon::count5.就表示左边序列从0开始的5个数据,和右边序列从10开始的5个数据都相同.

 

LCS_Calculate内部根据传入参数优化实现.它要求右边序列始终是传入随机迭代器.左边序列则满足输入迭代器即可.内部计算用到的数组使用了滚动数组(LCSArray)实现,空间占用为右边序列长度*2.

LCS_Calculate的最后一个参数不为EmptyContainer则会计算公共子序列在左右序列中各段的顺序和长度;这里L_Iterator不是随机迭代器内部就会用到一个动态增长的辅助数组来做回溯; L_Iterator是随机迭代器则直接一次申请(左序列*右序列)这么大的空间来辅助计算.

源程序和测试代码可在vs2008和codeblocks上通过

代码下载

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值