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

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 閱讀(2854) 評論(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>
            伊人成年综合电影网| 日韩视频在线一区| 久久精品天堂| 欧美中文在线免费| 国产亚洲人成网站在线观看| 欧美在线看片| 久久精品国产v日韩v亚洲| 黄色工厂这里只有精品| 老司机一区二区三区| 久久综合影音| 99热这里只有精品8| 日韩视频一区二区三区| 国产精品午夜在线| 久久青草久久| 欧美大片免费看| 亚洲专区在线视频| 欧美在线资源| 99视频热这里只有精品免费| 亚洲一级一区| 亚洲成人原创| 一本大道久久精品懂色aⅴ| 国产精品一区二区三区乱码| 久热这里只精品99re8久| 欧美激情麻豆| 久久精品九九| 欧美日韩国产成人在线91| 久久精品电影| 欧美日韩理论| 久久一区二区三区国产精品 | 另类春色校园亚洲| 欧美1区3d| 午夜久久久久久久久久一区二区| 久久精品成人一区二区三区蜜臀| 91久久久一线二线三线品牌| 亚洲在线观看免费| 亚洲欧洲精品一区二区三区不卡| 亚洲午夜日本在线观看| 亚洲精品一二区| 欧美一区二区三区免费在线看 | 欧美少妇一区| 欧美a级在线| 国产视频在线观看一区| 日韩午夜精品| 亚洲精选一区| 久久久久久色| 久久久人人人| 国产人成精品一区二区三| 99精品99久久久久久宅男| 亚洲黄色精品| 久久久久成人精品| 久久精品国产精品亚洲| 欧美日韩在线视频首页| 亚洲人妖在线| **欧美日韩vr在线| 久久久久久久久伊人| 久久精品国产99国产精品| 欧美三级不卡| 亚洲最黄网站| 正在播放亚洲| 欧美日韩精品在线播放| 亚洲国产视频一区| 亚洲国产免费看| 免费91麻豆精品国产自产在线观看| 久久精品在这里| 国产一区二区日韩| 久久精品亚洲精品| 久久亚洲私人国产精品va媚药| 国产欧美一区二区三区久久 | 久久午夜精品一区二区| 久久久蜜桃一区二区人| 国产日韩欧美一区二区| 午夜在线不卡| 久久久久久夜| 在线精品视频在线观看高清| 久久亚洲国产成人| 欧美国产亚洲另类动漫| 亚洲美女av电影| 欧美日韩三区四区| 亚洲网站在线看| 久久精品论坛| 亚洲国产经典视频| 欧美另类高清视频在线| 99视频一区| 欧美在线精品免播放器视频| 国产在线精品一区二区夜色| 久久久久久久999精品视频| 欧美国产第一页| 99精品视频网| 国产日韩欧美一区| 美国三级日本三级久久99| 亚洲国产视频一区二区| 亚洲直播在线一区| 国产在线视频不卡二| 免费成人av在线| 一个色综合av| 麻豆免费精品视频| 中文久久精品| 韩国三级电影久久久久久| 欧美mv日韩mv国产网站app| 在线亚洲电影| 欧美国产国产综合| 亚洲综合精品四区| 亚洲高清不卡| 国产精品女人网站| 美女网站久久| 亚洲女人小视频在线观看| 男女视频一区二区| 亚洲欧美日韩一区二区三区在线 | 国产精品青草久久| 久久久精品久久久久| 99热免费精品| 欧美激情麻豆| 久久久久久**毛片大全| 一本色道久久综合亚洲精品小说| 国产一区二区三区网站| 欧美视频专区一二在线观看| 久久久久久999| 亚洲永久网站| 夜久久久久久| 亚洲国产精品久久人人爱蜜臀| 久久成人免费| 午夜精品三级视频福利| 一区二区精品国产| 亚洲人精品午夜在线观看| 国产日韩欧美在线一区| 国产精品久久久久久久久久久久久| 久久夜色精品亚洲噜噜国产mv| 亚洲免费视频在线观看| 一本色道久久综合亚洲精品小说| 女仆av观看一区| 久久免费少妇高潮久久精品99| 亚洲欧美乱综合| 亚洲天堂av图片| 亚洲精品一线二线三线无人区| 在线观看av不卡| 狠狠爱综合网| 国产综合欧美| 黄色av日韩| 黄色成人在线网站| 好看的av在线不卡观看| 国产三级欧美三级| 国产欧美精品日韩区二区麻豆天美| 欧美日韩在线观看一区二区三区 | 一区二区成人精品| 日韩午夜三级在线| 日韩一区二区久久| 99国产精品久久久| 在线视频你懂得一区| 一本到高清视频免费精品| 亚洲精品一区二区三区婷婷月| 亚洲国产一区二区三区青草影视 | 亚洲另类视频| 日韩亚洲精品视频| 99精品欧美一区二区蜜桃免费| 日韩一区二区免费高清| 日韩视频在线观看国产| 99视频精品| 亚洲欧美日本精品| 欧美一区综合| 欧美+日本+国产+在线a∨观看| 欧美大片免费观看| 欧美视频在线观看视频极品| 国产精品网红福利| 在线国产亚洲欧美| 亚洲精品欧美日韩| 亚洲一区二区三区精品视频| 欧美一区成人| 欧美成人免费在线视频| 亚洲国内精品| 亚洲综合视频网| 老司机午夜免费精品视频| 欧美日本在线看| 国产欧美 在线欧美| 在线成人av.com| 亚洲小视频在线观看| 久久久精品午夜少妇| 欧美激情一区二区三区在线| 99国产成+人+综合+亚洲欧美| 性欧美1819sex性高清| 美女91精品| 国产女主播一区| 亚洲精品中文字幕在线| 午夜亚洲福利| 亚洲高清视频在线| 性欧美videos另类喷潮| 欧美另类高清视频在线| 国产一区二区三区网站| 中文精品视频一区二区在线观看| 久久久久女教师免费一区| 亚洲破处大片| 久久婷婷国产综合精品青草| 国产精品久久精品日日| 亚洲人精品午夜在线观看| 久久国产精品亚洲77777| 亚洲免费观看在线观看| 久久五月天婷婷| 国产亚洲精品资源在线26u| 在线午夜精品自拍| 欧美高清在线视频| 久久成人精品一区二区三区|