青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

FireEmissary

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  14 隨筆 :: 0 文章 :: 20 評論 :: 0 Trackbacks
 

經典的求公共子序列算法需要兩個序列的長度已知.而且通常用于計算字符串的公共子序列.

我實現的算法針對原有的算法輸入需求解耦合,使得算法極度可適配.能用于字符串公共子序列計算和文件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分別調用它們的begin()end()方法轉調用到LCS_Calculate的第一個版本.

L_*打頭的指代比較序列中左邊那個,R_*打頭的指代比較序列中右邊那個.

最后一個參數Container&out接收一個容器用來輸出序列各段相同的地方.典型的Container參數為std::deque<FEtool::SectionCommon> section;也可以為FEtool:: EmptyContainer.

class EmptyContainer
{
public:
    
void push_back(SectionCommon const&){};
    LCS_Size size()
{return 0;}
    
void clear(){}
}
;


如果為FEtool:: EmptyContainer參數則通過模板特化代碼選擇不計算兩段序列的相同部分。

 

struct LCS_Compare_Trait
{
template
<typename L,typename R>
static   bool equal(L const& left, R const& right)
        
{
            
return left==right;
        }

}
;

定義了比較算法,默認用operator==.你可以在FEtool空間通過特化或偏特化LCS_Compare_Trait:: equal來定制它.

 

struct SectionCommon
{
    LCS_Size L_begin;
    LCS_Size R_begin;
    LCS_Size count;
    
void clear(){L_begin=0;R_begin=0;count=0;}
}
;

指示兩個序列的相同部分. 比如SectionCommon:: L_begin0, SectionCommon:: R_begin10, SectionCommon::count5.就表示左邊序列從0開始的5個數據,和右邊序列從10開始的5個數據都相同.

 

LCS_Calculate內部根據傳入參數優化實現.經過對經典的動態規劃解公共子序列算法的考察發現,外圍那個循環只需要遍歷它代表的序列一次;即左邊序列則滿足輸入迭代器即可.它要求右邊序列始終是傳入隨機迭代器.內部計算用到的數組使用了滾動數組(LCSArray)實現,空間占用為右邊序列長度*2.


LCS_Calculate
的最后一個參數不為EmptyContainer則會計算公共子序列在左右序列中各段的順序和長度.這里L_Iterator是不是隨機訪問迭代器就會影響到性能了.L_Iterator不是隨機迭代器內部就會用到一個動態增長的輔助數組(TrackArrayDynamic)來做回溯; L_Iterator是隨機迭代器則直接一次申請(左序列*右序列)這么大的空間(TrackArrayStatic)來輔助回溯計算.
而如果LCS_Calculate的最后一個參數為EmptyContainer則會選擇一個空數組(TrackArrayEmpty)實現.TrackArrayEmpty類把所有操作展開為空操作.

所有這些,基于模板來自動選擇.用戶不需要指定不同的函數來優化性能:

template<typename L_Iterator,typename R_Iterator,typename Container/*vector<LCS_Section>*/>
LCS_Size LCS_Calculate(L_Iterator lbeg,L_Iterator lend,
                    R_Iterator rbeg,R_Iterator rend,
                    Container 
&out)
{
    
out.clear();
    detail::LCSArray array(rend
-rbeg);
   typedef detail::SelectTrackArray
<Container,typename std::iterator_traits<L_Iterator>::iterator_category> SelectTrack;//選擇適當的回溯數組
   typename SelectTrack::Array trackArr(SelectTrack::TotalRows(lbeg,lend),array.columns());//選擇適當的回溯數組
    LCS_Size leftSize;
    LCS_Size rightSize;
  
for( leftSize=1;lbeg!=lend;++lbeg,++leftSize)//外層只需要是輸入迭代器就可
        
for( rightSize=1;rightSize<=array.columns();++rightSize)
        
{
            
if(LCS_Compare_Trait::equal(*lbeg,*(rbeg+rightSize-1))){
                array(leftSize,rightSize)
=array(leftSize-1,rightSize-1)+1;
                trackArr(leftSize,rightSize)
=0;
            }

            
else if(array(leftSize-1,rightSize)>=array(leftSize,rightSize-1)){
                array(leftSize,rightSize)
=array(leftSize-1,rightSize);
                trackArr(leftSize,rightSize)
=1;
            }

            
else{
                array(leftSize,rightSize)
=array(leftSize,rightSize-1);
                trackArr(leftSize,rightSize)
=-1;
            }


        }

        detail::LCS_KeepTrack(trackArr,
out);

    
return array(leftSize-1,array.columns());

}


完整代碼包括測試代碼下載

posted on 2010-03-27 19:31 FireEmissary 閱讀(2844) 評論(1)  編輯 收藏 引用

評論

# re: 最長公共子序列的泛型算法 2010-03-28 10:22 expter
我覺得用c語言直接寫DP還清晰明了點。。。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            美女视频黄 久久| 亚洲大片在线| 亚洲综合第一页| 国产美女高潮久久白浆| 欧美aⅴ99久久黑人专区| 亚洲缚视频在线观看| 久久久精品国产免大香伊 | 国产精品激情电影| 久久久青草青青国产亚洲免观| 亚洲人成亚洲人成在线观看图片| 亚洲午夜激情| 亚洲人成在线观看一区二区| 欧美亚一区二区| 欧美成人一品| 欧美一区二区在线视频| 一区二区三区视频免费在线观看| 欧美va日韩va| 日韩亚洲综合在线| 亚洲欧洲综合另类| 乱人伦精品视频在线观看| 欧美一区国产在线| 亚洲一区二区三区777| 欧美一区=区| 亚洲电影在线播放| 亚洲一级免费视频| 亚洲一区二区在线免费观看| 亚洲免费av观看| 午夜精品在线| 欧美一区二区三区视频| 欧美不卡视频一区| 国产伦精品一区二区三区免费迷| 亚洲国产另类久久精品| 亚洲日本va午夜在线电影| 亚洲欧美日韩中文在线制服| 激情久久影院| 伊人色综合久久天天| 在线电影一区| 午夜亚洲性色福利视频| 亚洲少妇在线| 午夜日韩福利| 91久久夜色精品国产九色| 欧美一级一区| 国产精品日韩一区| 一区二区三区在线观看视频| 亚洲欧美另类国产| 亚洲每日在线| 亚洲一区尤物| 欧美精品偷拍| 国产伦精品一区二区三区四区免费| 亚洲国产精品精华液2区45| 亚洲精品一区二区三区四区高清| 99伊人成综合| 欧美综合国产| 亚洲高清成人| 男女视频一区二区| 国产精品乱看| 136国产福利精品导航网址| 亚洲毛片av在线| 欧美日本不卡视频| 99精品久久免费看蜜臀剧情介绍| 日韩特黄影片| 欧美精品乱码久久久久久按摩| 1024亚洲| 亚洲日本在线观看| 欧美午夜精品久久久久久久 | 欧美日韩123| 国产精品久久久久毛片大屁完整版| 亚洲精品欧洲| 一区二区日韩免费看| 国产精品福利网| 欧美一区二区三区久久精品| 欧美一区二区视频网站| 黄色一区二区在线| 亚洲国产美女久久久久| 久久国产精品久久精品国产| 免费不卡在线视频| 国产欧美综合在线| 一区二区三区三区在线| 久久综合九色欧美综合狠狠| 亚洲最新在线| 国产精品影片在线观看| 久久久综合网站| 在线综合视频| 欧美国产专区| 亚洲国产色一区| 亚洲欧洲精品一区二区三区 | 国产精品一卡二卡| 久久综合一区二区| 欧美日韩高清一区| 久久精品国产第一区二区三区| 日韩视频一区二区在线观看 | 美日韩精品免费| 亚洲网站啪啪| 久久国产精品久久久久久电车| 亚洲全黄一级网站| 亚洲午夜激情| 亚洲欧洲精品一区二区三区波多野1战4 | 久久这里只有| 欧美区在线播放| 久久亚洲精品网站| 欧美日韩亚洲一区二区三区在线观看 | 亚洲激情在线观看视频免费| 亚洲激情六月丁香| 欧美日韩精品一本二本三本| 亚洲在线视频观看| 亚洲区在线播放| 久久精品91| 性做久久久久久免费观看欧美| 亚洲国产专区| 亚洲免费精彩视频| 亚洲精品乱码久久久久久久久| 国产精品日日摸夜夜摸av| 欧美日韩无遮挡| 欧美午夜久久| 国产精品区一区二区三| 国产精品电影在线观看| 国产日韩欧美在线| 欧美一区二区黄色| 久久精品视频免费播放| 亚洲三级电影在线观看| 亚洲欧洲另类| 性8sex亚洲区入口| 久久久亚洲人| 欧美日韩情趣电影| 国产伦精品一区二区三区照片91| 国产啪精品视频| 亚洲激情视频在线播放| 亚洲一级片在线观看| 久久久久网址| 亚洲美女91| 午夜视频在线观看一区二区三区| 久久久久欧美| 欧美三级在线| 欧美日韩亚洲一区三区| 韩日成人在线| 尹人成人综合网| 亚洲欧美国产高清| 欧美成人tv| 亚洲欧美不卡| 亚洲最快最全在线视频| 久久一区二区精品| 亚洲免费视频一区二区| 欧美日韩小视频| 日韩午夜中文字幕| 亚洲人成亚洲人成在线观看图片| 亚洲视频每日更新| 亚洲九九精品| 欧美日韩精品在线| 亚洲精品在线观看视频| 欧美激情中文字幕一区二区| 91久久精品一区二区别| 欧美成人免费在线视频| 99精品欧美一区二区三区 | 久久一区二区三区四区五区| 亚洲午夜激情网页| 国产精品夜夜夜| 久久精品在线播放| 美女网站久久| 性一交一乱一区二区洋洋av| 亚洲一级在线观看| 亚洲国产精品一区二区第一页| 男人的天堂成人在线| 欧美人在线观看| 久久婷婷蜜乳一本欲蜜臀| 久久一二三四| 国产欧美日韩不卡| 免费观看成人| 国产精品国产三级国产aⅴ9色| 久久乐国产精品| 欧美视频中文在线看| 欧美.www| 国产亚洲欧美一级| 久久超碰97人人做人人爱| 久久精品视频亚洲| 亚洲制服av| 欧美日韩国产探花| 亚洲第一主播视频| 国产一区二区激情| 欧美有码视频| 极品少妇一区二区三区| 亚洲免费福利视频| 99国产精品久久久久老师| 先锋影院在线亚洲| 欧美视频在线观看视频极品| 亚洲国产小视频在线观看| 精品9999| 欧美aⅴ99久久黑人专区| 久久久久久亚洲精品不卡4k岛国| 国产精品久久久免费| 日韩午夜免费视频| 欧美在线不卡| 在线观看中文字幕亚洲| 老司机精品导航| 亚洲午夜高清视频| 国产精品免费看片| 欧美一区二区福利在线| 久久天天躁狠狠躁夜夜爽蜜月| 黄色成人av网| 欧美高清在线一区| 午夜亚洲一区|