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

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 閱讀(2849) 評論(1)  編輯 收藏 引用

評論

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品夜夜夜| 欧美国产激情二区三区| 日韩系列欧美系列| 亚洲激情在线视频| 久久久久久亚洲精品不卡4k岛国| 久久不射中文字幕| 欧美体内谢she精2性欧美| 日韩一级免费观看| 亚洲免费人成在线视频观看| 欧美日韩在线一区二区| 一区二区三区视频免费在线观看| 亚洲国产婷婷综合在线精品| 欧美在线播放| 国产精品综合| 一本色道综合亚洲| 欧美日韩精品久久| 久久久久久久91| 一本色道久久88综合日韩精品| 亚洲欧美色一区| 亚洲精品乱码久久久久久按摩观| 欧美日韩亚洲综合在线| 亚洲一区二区高清视频| 免费久久精品视频| 亚洲一区二区三区四区在线观看| 国产一区二区精品在线观看| 欧美国产第二页| 久久国产一区二区三区| 亚洲精品美女在线观看| 欧美一区二区高清| 中国女人久久久| 在线成人激情| 极品少妇一区二区三区精品视频| 欧美激情一级片一区二区| 久久精品国产99精品国产亚洲性色| 亚洲国产精品成人综合| 国产精品人成在线观看免费| 久久久久久69| 久久在线视频在线| 久久av老司机精品网站导航| 亚洲——在线| 性久久久久久久| 午夜精品久久| 亚洲欧美日韩视频一区| 亚洲欧美综合| 久久久999精品免费| 夜夜嗨av一区二区三区免费区| 亚洲精品女av网站| 亚洲成色777777在线观看影院| 在线成人中文字幕| 99re视频这里只有精品| 99精品99| 亚洲国产色一区| 亚洲欧洲视频| 欧美一区二区三区在线观看视频 | 鲁大师成人一区二区三区| 亚洲调教视频在线观看| 欧美一区二区在线观看| 久久这里只精品最新地址| 亚洲欧洲日本国产| 欧美中文在线视频| 欧美日韩国产另类不卡| 亚洲第一页自拍| 一区二区三区四区五区视频| 久久国产福利| 亚洲一区二区三区精品在线观看 | 亚洲激情一区| 一本色道久久加勒比精品| 午夜免费久久久久| 亚洲人成毛片在线播放女女| 亚洲欧美日韩国产成人精品影院| 欧美在线3区| 欧美精品日韩www.p站| 好看的日韩视频| 99国产精品国产精品久久 | 久久亚洲精品中文字幕冲田杏梨| 久久久久久久综合日本| 一本色道久久加勒比精品| 欧美电影免费观看网站| 在线高清一区| 免播放器亚洲一区| 久久久无码精品亚洲日韩按摩| 欧美激情精品久久久久久| 激情国产一区二区| 亚洲欧美日韩国产一区二区| 亚洲美女视频| 国语自产精品视频在线看8查询8| 久久久久**毛片大全| 亚洲手机成人高清视频| 欧美精品久久久久久久久老牛影院 | 国产在线成人| 亚洲无线视频| 亚洲午夜日本在线观看| 欧美三级日本三级少妇99| 中文日韩在线| 亚洲精品影院| 亚洲成色精品| 国产精品a久久久久| 久久成人这里只有精品| 久久精品视频网| 亚洲一区二区三区四区五区午夜| 亚洲一卡久久| 国语对白精品一区二区| 亚洲人成网站色ww在线| 国产亚洲欧洲| 日韩亚洲精品电影| 国内精品国产成人| 99成人免费视频| 欧美午夜一区二区福利视频| 久久久.com| 欧美日韩视频在线观看一区二区三区| 亚洲四色影视在线观看| 久久九九国产精品| 久久免费视频一区| 欧美日韩三级视频| 欧美激情精品久久久久| 国产一区二区三区四区hd| 亚洲自拍偷拍麻豆| 亚洲一级二级在线| 性欧美videos另类喷潮| 亚洲一区二区三区免费在线观看 | 国产精品入口尤物| 一区二区免费在线观看| 欧美伊人久久久久久午夜久久久久| 国产精品丝袜白浆摸在线| 欧美在线免费观看| 欧美高清一区| 在线免费一区三区| 亚洲第一在线综合在线| 亚洲欧洲免费视频| 久久国产精品99国产精| 久久国产一区二区| 久久精品国产欧美激情| 亚洲一区二区三区影院| 一区二区三区在线观看国产| 欧美激情综合色| 久久久久久久久伊人| 亚洲一区二区免费在线| 麻豆视频一区二区| 亚洲美女淫视频| 国产日韩欧美在线播放| 麻豆亚洲精品| 中国成人在线视频| 久久婷婷麻豆| 妖精成人www高清在线观看| 国产精品中文字幕欧美| 欧美怡红院视频一区二区三区| 免费日韩av电影| 欧美自拍偷拍| 一本色道久久综合狠狠躁篇的优点| 香蕉久久国产| 亚洲精品日韩在线| 国产日韩欧美综合在线| 欧美啪啪一区| 欧美国产日韩视频| 久久视频这里只有精品| 国产一区二区中文| 久久国产精品久久久久久久久久| 亚洲人午夜精品免费| 欧美成人免费小视频| 久久人人爽人人爽爽久久| 亚洲一区二区精品在线| 亚洲欧洲精品一区二区三区不卡| 韩国欧美一区| 国产亚洲精品资源在线26u| 欧美日韩免费视频| 欧美日本高清视频| 欧美高清视频在线播放| 欧美成人69| 欧美精品激情| 欧美日韩亚洲高清一区二区| 欧美激情视频网站| 欧美视频在线免费| 国产精品a久久久久久| 国产免费观看久久黄| 国产日本欧美视频| 狠狠色丁香婷婷综合久久片| 国产在线观看一区| 精品动漫一区二区| 一本色道久久88综合日韩精品| 欧美大尺度在线| 亚洲男人第一av网站| 免费久久99精品国产自| 免费在线观看成人av| 欧美韩日视频| 国产精品影片在线观看| 亚洲第一成人在线| 亚洲欧美一区二区激情| 久久久久久999| 欧美成人一区在线| 亚洲精品一区在线观看香蕉| 免费成人高清视频| 亚洲最新在线视频| 在线观看欧美| 精品999在线播放| 国产精品视频免费一区| 久久亚洲一区| 欧美一区亚洲二区| 欧美一级电影久久| 中文在线不卡| 一区二区三区视频在线|