搜尋引擎中長串匹配及聚類演算法 字尾樹演算法

2021-05-27 14:29:25 字數 1757 閱讀 8685

上個月寫了乙個字尾樹演算法,但是生成樹的效率極低,這次重新改寫,效率接近線性了,c++實現的,下面面是核心演算法:

node *ptmpnode;

edge *pedge, *ptmpedge;

unsigned int i,edgenum;

unsigned int matchedpos=0;//匹配到的位置

bool bmatched=false;

m_poldnode=null;

#ifdef debug

#ifdef add_node

printf("<<<<<<<<<<<<<< '%s' >>>>>>>>>>>>>>>>\n",subdata(start,1).c_str());

#endif

#endif

//搜尋節點是否包含待加入字元

while(!bmatched)

}//顯示節點

else

}}

if(bmatched)

//最後字元不匹配

else

//3.顯示節點,僅在顯示節點下新增葉子節點

//顯示節點下新增葉子節點(含上面隱式變顯示的節點)

ptmpedge=new edge(start,0,m_activenode.m_pnode,this);//end為0時表示葉子節點

m_activenode.m_pnode->addedge(ptmpedge);

#ifdef debug

#ifdef add_node

int endpos=0;

if(m_activenode.m_bimplicit)

endpos=m_activenode.getedge()->getendpos();

else if(m_activenode.m_pnode!=m_proot)

endpos=m_activenode.m_pnode->getfrontedge()->getendpos();

printf("\nnew:\n %d-(%d,%d '%s'--'%s')\n\n",endpos,

start,start+1,subdata(endpos-1,1).c_str(),subdata(ptmpedge->getstartpos(),ptmpedge->charsize()).c_str());

#endif

#endif

//匹配更短的字尾

//判斷字尾指標是否存在

if(m_activenode.m_pnode->hasnextsuffixpointer())

//若不存在則手動搜尋下乙個更短字尾

else

*/while( (ptmpedge=ptmpnode->getfrontedge()) != null )

}str.erase(0,1);

//不連續時會出問題!!!

//str=this->subdata(ptmpedge->getstartpos()+1,matchedpos-(ptmpedge->getstartpos()+1));

if(str.length()==0)//表示沒有更短的字尾了,將根節點作為啟用節點

else if(search(str,ptmpnode,pos))//必定能找到,查詢到結果後,隱式節點返回值ptmpnode為父節點指標

else

}}

}//end of else

}//end of while

搜尋引擎技術及趨勢

隨著網際網路的迅猛發展 web資訊的增加,使用者要在資訊海洋裡查詢資訊,就象大海撈針一樣,搜尋引擎技術恰好解決了這一難題 它可以為使用者提供資訊檢索服務 目前,搜尋引擎技術正成為計算機工業界和學術界爭相研究 開發的物件。搜尋引擎 search engine 是隨著web資訊的迅速增加,從1995年開...

搜尋引擎 平移演算法簡介

在開發新聞搜尋引擎的時候,出現乙個問題就是有很多的新聞屬於 的形式,要判斷新聞是否 經過實驗,我發現可以用 平移 演算法來實現。以上兩個新聞是 同一 但是略做了更動,根據平移演算法,我們固定乙個字串,然後將另外乙個字串從末尾對應第一字串的開頭進行平移,然後計算兩個字串之間的交集。如果字元完全一樣則為...

搜尋引擎分詞演算法介紹

原文 http sf.hit.edu.cn bbs read.php?fid 1 tid 52 fpage 1 搜尋引擎分詞演算法介紹 自動分詞是基於字串匹配的原理進行的 所謂自動分詞方法,指的是漢字字串匹配 的進行方式。1.最大匹配法 亦稱mm法 其基本思想是這樣的,假設自動分詞詞典 或詞庫 中的...