時間高效過濾詞演算法

2021-08-03 08:06:54 字數 3352 閱讀 1048

過濾詞是做遊戲伺服器必須面對的乙個問題,選乙個高效的方法尤其重要。下面以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...

敏感詞過濾演算法實現

說到敏感詞過濾,我也覺得這裡沒有必要寫這個文章,因為前人已經前前後後有過很多種演算法解決該問題。這裡我之所以寫這個文章,是因為我自己自創了一種演算法 真的是自創哦,因為我在寫這個演算法的時候,完全是自己想出來的方式,沒有借鑑任何 靈感來自於一篇文章中的一句話 如果能掃瞄一遍文字就能將所有的詞找出來,...