上個月寫了乙個字尾樹演算法,但是生成樹的效率極低,這次重新改寫,效率接近線性了,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法 其基本思想是這樣的,假設自動分詞詞典 或詞庫 中的...