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

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>
            欧美一区二区视频97| 欧美成人情趣视频| 午夜一区二区三视频在线观看| 亚洲手机视频| 国产伦精品一区二区三区视频孕妇 | 久久一区二区视频| 狠狠入ady亚洲精品| 久久精品国产亚洲aⅴ| 欧美国产高潮xxxx1819| 欧美国产乱视频| 一本一道久久综合狠狠老精东影业| 免费成人黄色av| 999在线观看精品免费不卡网站| 亚洲一区网站| 亚洲电影一级黄| 国产精品夜夜夜一区二区三区尤| 欧美亚洲综合在线| 久久一区二区三区国产精品| 亚洲精品日本| 久久综合成人精品亚洲另类欧美| 美女日韩欧美| 欧美一区二区三区在线观看视频 | 久久久91精品| 日韩午夜在线| 伊人精品成人久久综合软件| 欧美日精品一区视频| 久久女同精品一区二区| 欧美激情a∨在线视频播放| 亚洲欧美一区二区三区久久 | 午夜精品久久久久久| 美女精品自拍一二三四| 国产精品每日更新| 欧美日韩精品三区| 欧美成人精品一区二区| 久久精品亚洲精品国产欧美kt∨| 亚洲私人影院| 亚洲图片欧美午夜| 免费日韩av| 欧美精品在线一区| 欧美久久久久| 在线观看成人小视频| 亚洲男女自偷自拍图片另类| 99精品国产99久久久久久福利| 久久www免费人成看片高清| 亚洲免费视频成人| 欧美激情精品久久久久久大尺度| 午夜久久99| 国产精品色午夜在线观看| 亚洲精品一区二区三区不| 亚洲成人在线免费| 欧美一区午夜精品| 亚洲最新色图| 亚洲欧美在线aaa| 日韩视频在线一区| 美乳少妇欧美精品| 性欧美xxxx视频在线观看| 欧美日韩天天操| 国产精品大片免费观看| 国产精品毛片大码女人| 一区二区三区日韩在线观看| 亚洲欧美国内爽妇网| 亚洲第一色在线| 1769国内精品视频在线播放| 午夜伦理片一区| 久久久久久999| 亚洲男人的天堂在线| 久久免费视频在线| 韩国av一区| 蜜桃久久av| 欧美成人激情视频| 99ri日韩精品视频| 99热在线精品观看| 欧美香蕉大胸在线视频观看| 国产精品视频免费观看www| 一区二区三区视频在线观看| 日韩亚洲欧美成人| 国产精品美女久久久久久久| 午夜天堂精品久久久久| 亚洲欧美精品| 一区二区三区在线高清| 亚洲午夜日本在线观看| 久久精品国产一区二区三区| 免费成人你懂的| 欧美a级大片| 一本色道精品久久一区二区三区 | 亚洲承认在线| 亚洲午夜电影在线观看| 国产精品一区一区| 鲁大师影院一区二区三区| 国产精品99久久久久久久女警| 久久精品日韩欧美| 亚洲日本在线视频观看| 日韩一级成人av| 国产亚洲成av人在线观看导航 | 亚洲欧美一区二区三区极速播放| 亚洲一区二区三区激情| 欧美大胆人体视频| 亚洲综合欧美| 久久麻豆一区二区| 国产精品一区二区三区四区| 欧美在线观看一区| 欧美成人福利视频| 欧美在线免费播放| 欧美激情网站在线观看| 亚洲电影免费观看高清完整版在线观看 | 亚洲小说区图片区| 欧美日韩精品欧美日韩精品| 国外成人在线| 99视频精品在线| 亚洲第一视频| 亚洲男人av电影| 亚洲美女视频在线免费观看| 久久影视三级福利片| 欧美久久久久免费| 老牛嫩草一区二区三区日本| 欧美日韩午夜在线| 免费欧美在线视频| 国产日产欧美一区| 久久国产毛片| 欧美日韩免费观看一区二区三区 | 亚洲人成在线播放网站岛国| 久久久亚洲高清| 亚洲欧美综合| 欧美激情精品久久久久| 老牛影视一区二区三区| 国产亚洲人成a一在线v站 | 亚洲欧美日韩一区在线| 一区二区电影免费在线观看| 玖玖玖免费嫩草在线影院一区| 一区在线播放| 午夜精品999| 亚洲欧美视频在线观看| 欧美日韩午夜在线视频| 最新中文字幕一区二区三区| 欧美日韩国产免费观看| 欧美xx69| 欧美日韩亚洲综合| 亚洲精品1区| 亚洲人成欧美中文字幕| 日韩视频免费观看| 99视频一区| 欧美日韩岛国| 亚洲老司机av| 亚洲一区二三| 国产精品一区一区三区| 亚洲在线网站| 久久久久久久欧美精品| 精品福利电影| 欧美sm视频| 日韩午夜电影在线观看| 亚洲综合首页| 国产伦理一区| 久久国产精品网站| 欧美大胆人体视频| 日韩一级网站| 国产精品欧美风情| 久久精品国产精品亚洲精品| 久久视频国产精品免费视频在线| 欧美成人午夜77777| 亚洲国产午夜| 狠狠色狠狠色综合日日91app| 久久成人亚洲| 亚洲第一天堂av| 亚洲在线日韩| 韩国精品久久久999| 欧美wwwwww| 亚洲午夜精品一区二区三区他趣| 国产精品久久久久久久浪潮网站 | 欧美日韩福利| 亚洲影院免费| 欧美肥婆bbw| 亚洲一区二区动漫| 狠狠色香婷婷久久亚洲精品| 欧美bbbxxxxx| 制服诱惑一区二区| 美女精品在线| 亚洲欧美日韩精品久久久| 伊人成综合网伊人222| 欧美区视频在线观看| 国产一区二区精品| 欧美一区二区三区四区视频| 欧美一级视频精品观看| 亚洲调教视频在线观看| 欧美在线播放一区二区| 亚洲国产精品ⅴa在线观看| 亚洲欧美区自拍先锋| 久久在线免费观看| 亚洲视频免费观看| 在线观看av不卡| 国产精品美女999| 欧美成人影音| 久久国产精品久久久久久电车| 亚洲经典三级| 免费一级欧美片在线播放| 亚洲专区一区二区三区| 亚洲精品美女免费| 伊甸园精品99久久久久久| 国产精品尤物福利片在线观看| 欧美激情精品久久久久久蜜臀| 久久不射中文字幕|