過濾詞是做遊戲伺服器必須面對的乙個問題,選乙個高效的方法尤其重要。下面以c++實現的一種過濾詞演算法,過濾效率還是很高的。
演算法輸入為:
abcd
acbacd
bcdac
ab構建的樹結構圖,紅色字母表示是乙個終點。
測試字串:輸出結果
abc : **c
acd : ***
acdef : ***ef
efacd : ef***
efacdefacd : ef***ef***
ac : **
acef : **ef
efac : ef**
efacefac : ef**ef**
標頭檔案 wfilter_mgr.h
class wfilter_mgr
bool get_flag()const
wnode** add_node(wchar_t c, wnode* p);
void longest_match(const wchar_t* c, int index, int& last_index);
bool shortest_match(const wchar_t* c, int index);
static wnode* construct();
static void release(wnode* p);
public:
iterator begin()
iterator find(wchar_t c)
iterator end()
bool empty()
const_iterator begin()const
const_iterator find(wchar_t c) const
const_iterator end() const
bool empty() const
private:
wnext m_next; //下一節點指標
bool m_flag; //是否達到節點的結尾
};public:
wfilter_mgr();
~wfilter_mgr();
void destroy();
bool empty() const;
void add_word(std::wstring::const_iterator _first, std::wstring::const_iterator _last);
void load(const std::wstring& wstr);
void unload();
bool has_filter(const std::wstring& wstr) const;
void parse(std::wstring& wstr);
private:
wnode* m_node;
};
cpp檔案 wfilter_mgr.cpp
wfilter_mgr::wnode::wnode() : m_flag(false)
wfilter_mgr::wnode::~wnode()
}} wfilter_mgr::wnode** wfilter_mgr::wnode::add_node(wchar_t c, wnode* p)
return null; }
void wfilter_mgr::wnode::longest_match(const wchar_t* c, int index, int& last_index)
if (l'\0' == *c)
const_iterator it = node->find(*c);
if (node->end() != it)
node = it->second;
continue;
}break;
} }bool wfilter_mgr::wnode::shortest_match(const wchar_t* c, int index)
if (l'\0' == *c)
const_iterator it = node->find(*c);
if (node->end() != it)
node = it->second;
continue;
}break;
} return false;
} wfilter_mgr::wnode* wfilter_mgr::wnode::construct()
void wfilter_mgr::wnode::release(wnode* p)
wfilter_mgr::wfilter_mgr() : m_node(null)
wfilter_mgr::~wfilter_mgr()
void wfilter_mgr::destroy()
bool wfilter_mgr::empty() const
void wfilter_mgr::add_word(std::wstring::const_iterator _first, std::wstring::const_iterator _last)
wnode::iterator it = (*node)->find(*itr);
if ((*node)->end() == it)
node = (*node)->add_node(*itr, null);
}else}}
if (*node)
} void wfilter_mgr::load(const std::wstring& wstr)
if (c == '\r' || c == '\n')
}else if (!flag)
}if (flag)
}void wfilter_mgr::unload()
bool wfilter_mgr::has_filter(const std::wstring& wstr) const
const wchar_t* sbuf = wstr.data();
for (int i = 0; l'\0' != sbuf[i];)
else
}return false;
} void wfilter_mgr::parse(std::wstring& str)
const wchar_t* sbuf = str.data();
for (int i = 0; l'\0' != sbuf[i];)
i = last_index;
}else}}
Java Web 敏感詞過濾演算法
1.dfa演算法 dfa演算法的原理可以參考這裡,簡單來說就是通過map構造出一顆敏感詞樹,樹的每一條由根節點到葉子節點的路徑構成乙個敏感詞,例如下圖 簡單實現如下 public class textfilterutil 構建敏感詞庫 param keyword private static voi...
Java Web敏感詞過濾演算法
1.dfa演算法 dfa演算法的原理可以參考 這裡 簡單來說就是通過map構造出一顆敏感詞樹,樹的每一條由根節點到葉子節點的路徑構成乙個敏感詞,例如下圖 簡單實現如下 public class textfilterutil 構建敏感詞庫 param keyword private static vo...
敏感詞過濾演算法實現
說到敏感詞過濾,我也覺得這裡沒有必要寫這個文章,因為前人已經前前後後有過很多種演算法解決該問題。這裡我之所以寫這個文章,是因為我自己自創了一種演算法 真的是自創哦,因為我在寫這個演算法的時候,完全是自己想出來的方式,沒有借鑑任何 靈感來自於一篇文章中的一句話 如果能掃瞄一遍文字就能將所有的詞找出來,...