tokenpockettokenpocketapp中文下载|dfa

作者: tokenpockettokenpocketapp中文下载
2024-03-07 18:10:56

DFA 基础简介及简单使用 - 知乎

DFA 基础简介及简单使用 - 知乎切换模式写文章登录/注册DFA 基础简介及简单使用Arch住在霓虹的城市 握着飞向天空的钥匙DFA 是什么 定义 Deterministic Finite Automaton,确定有限状态自动机。对于一个给定的属于该自动机的状态和一个属于该自动机字母表的字符,它都能根据事先给定的转移函数转移到下一个状态(这个状态可以是先前那个状态)。 确定:每个状态在一个输入下的转移状态只有一个 有限:状态的数量有限 由以下五部分组成: 一个非空有限状态集合 Set 一个输入字母表(非空有限字符集合)Set 一个转移函数 (state:State, char:string) => State 一个初始状态State 一个接受状态集合 Set 用途:词法分析 类似正则,判断一个字符串是否符合某种规则 eg:考虑以下 ttml 标签,注意 class 的值: 合法 非法 2. 解析/序列化一个字符串 eg:CSS 属性 transition 语法为 div {

transition: ;

} 由于 CSS 众所周知的原因(老古董),当使用 JS 去对一个 DOM 的 style 进行 transition 的读取和修改时,是比较麻烦的。例如已有的 transition 为 top 1s ease .5s, left 1s ease .5s ,此时需要修改 top 的 duration 为.1s,那么就需要解析这个字符串,找到 top 属性对应的 duration 的位置,替换为 .1s。 使用案例1 - 解析 ttml 模板标签属性,即判断一个 ttml 某个标签的某个带模板的属性值是否合法,以及该值属性值的语义 确定该 DFA 的五个部分:(注:以下顺序与定义顺序不同,但是个人觉得会更方便一些) 输入字母表 先确定特殊字符 识模板部分的 { } 标识字符串部分的 ' " 其余所有的字符用 other 表示 所以输入字母表为: enum ALPHABET {

LEFT_BRACE = 1, // 左括号

RIGHT_BRACE, // 右括号

SINGLE_QUOTE, // 单引号

DOUBLE_QUOTE, // 双引号

OTHER, // 其它字符

}

2. 初始状态 直接定义一个状态 1 为初始状态 (注:一般情况下状态常用字母表示,但是为了在状态矩阵中比较好转移,这里统一用数字表示) 3. 转移函数 确定转移函数是最麻烦也是最重要的一步,一般用状态转移图来帮助确定。 所以可以写出表示转移函数的矩阵: const MOVE_MATRIX = [ // 状态转移矩阵

[2, 1, 1, 1, 1],

[3, 1, 1, 1, 1],

[3, 4, 5, 6, 3],

[3, 1, 3, 3, 3],

[5, 5, 3, 5, 5],

[6, 6, 6, 3, 6],

];

4. 状态集合 由状态转移图自然可以得到 6 个状态 enum STATE { // 状态集合

INIT_OR_END = 1, // 初始 or 终止状态

RECEIVED_ONE_LEFT_BRACE, // 已接受一个 {

IN_EXPR, // 在表达式中,即已接受两个 {

RECEIVED_ONE_RIGHT_BRACE, // 已接受一个 }

IN_EXPR_SINGLE_QUOTE, // 在表达式中的单引号字符串中

IN_EXPR_DOUBLE_QUOTE, // 在表达式中的双引号字符串中

}

5. 接受状态集合 显然只有一个状态可以被接受,即 状态 1:INIT_OR_END const FINAL_STATES = new Set([STATE.INIT_OR_END]);

接下来要做的事情就是从初始状态开始,不断接受字符,在状态转移的过程中,在合适的时机 emit 出对应的 token 。 完整代码: enum STATE { // 状态集合

INIT_OR_END = 1,

RECEIVED_ONE_LEFT_BRACE,

IN_EXPR,

RECEIVED_ONE_RIGHT_BRACE,

IN_EXPR_SINGLE_QUOTE,

IN_EXPR_DOUBLE_QUOTE,

}

enum ALPHABET { // 输入字母表

LEFT_BRACE = 1,

RIGHT_BRACE,

SINGLE_QUOTE,

DOUBLE_QUOTE,

OTHER,

}

const MOVE_MATRIX = [ // 状态转移矩阵

[2, 1, 1, 1, 1],

[3, 1, 1, 1, 1],

[3, 4, 5, 6, 3],

[3, 1, 3, 3, 3],

[5, 5, 3, 5, 5],

[6, 6, 6, 3, 6],

];

const move = (state: STATE, char: ALPHABET) => { // 状态转移函数

return MOVE_MATRIX[state - 1][char - 1]; // 因为状态枚举中,数字是从1而不是从0开始的,所以用于数组索引时要-1

};

const FINAL_STATES = new Set([STATE.INIT_OR_END]); // 接受状态集合,这里就一个状态 1

const INIT_STATE = STATE.INIT_OR_END; // 初始状态 1

function mapCharToAlphabet(char: string): ALPHABET { // 将每个字符映射到字母表里

switch (char) {

case `{`:

return ALPHABET.LEFT_BRACE;

case `}`:

return ALPHABET.RIGHT_BRACE;

case `'`:

return ALPHABET.SINGLE_QUOTE;

case `"`:

return ALPHABET.DOUBLE_QUOTE;

default:

return ALPHABET.OTHER;

}

}

interface Expr {

type: SLICE_TYPE;

value: string;

}

export enum SLICE_TYPE {

NORMAL = 'normal',

EXPR = 'expr',

}

export default function tokenize(text: string): { success: boolean; exprs: Expr[] } {

let char = ALPHABET.OTHER;

let prevState = INIT_STATE;

let state = INIT_STATE;

let sectionStart = 0;

let sectionEnd = 0;

const exprs: Expr[] = [];

function emit(type: SLICE_TYPE) { // 往 exprs 里塞一个元素

const slice = text.slice(sectionStart, sectionEnd + 1);

if (slice.length > 0) {

exprs.push({ type, value: slice });

}

}

for (let i = 0; i < text.length; i++) {

char = mapCharToAlphabet(text.charAt(i));

prevState = state;

state = move(state, char); // 状态转移

if (prevState === STATE.RECEIVED_ONE_LEFT_BRACE && state === STATE.IN_EXPR) {

// 从2转移到3,说明进入了一个 expr

sectionEnd = i - 2;

emit(SLICE_TYPE.NORMAL); // emit 该 expr 之前的部分,一定是 normal text(两个紧挨着的 expr 中间的空字符串会在 emit 中被过滤掉)

sectionStart = i - 1;

} else if (prevState === STATE.RECEIVED_ONE_RIGHT_BRACE && state === STATE.INIT_OR_END) {

// 从4转移到5,说明退出了一个 expr

sectionEnd = i;

emit(SLICE_TYPE.EXPR); // emit 该 expr

sectionStart = i + 1;

}

}

sectionEnd = text.length - 1;

emit(SLICE_TYPE.NORMAL); // emit 最后一部分 normal text(如果有)

if (FINAL_STATES.has(state)) { // 如果最终状态在接受状态集合里,说明输入合法,解析成功

return {

success: true,

exprs,

};

} else {

return {

success: false,

exprs: [],

};

}

}

测试结果: 合法 非法 ttml 属性值非法。非法原因:模板中引号未完全匹配 ttml 属性值合法,但模板中 JS 非法,此时可将该 JS expression 传给其他 JS 解析器例如 babel-parser 去验证合法性。 使用案例2 - 解析 CSS transition 属性,使 JS 可以方便读写该属性 css transition 是 四个值的合并简写。其本身的解析规则为: 由 1 - 4 个部分组成(空格隔开),否则非法 4 个部分按照字符串类型分为"时间"、"timing-function"、"其他" 时间最多出现 2 个,否则非法。第一个作为 duration ,第二个作为 delay 去掉时间部分 如果还剩下 1 个部分:该部分若为 timing-function,则作为 timing-function。否则作为 property 如果还剩下 2 个部分 a 和 b: a b 均为 timing-function:a 作为 timing-function,b 作为 property a 为 timing-function,b 为其他:a 作为 timing-function,b 作为 property a 为其他,b 为timing-function:a 作为 property,b 作为timing-function a b 均为其他:非法 如果剩下 > 2 个部分:非法 由于这里重点关注 DFA,即词法分析过程,上述为语法分析规则,所以在这里做一个简化: 对时间定义 第一个非时间部分作为 property,第二个非时间部分作为 timing-function 第一个时间部分作为 duration,第二个时间部分作为 delay 接下来按照案例 1 的步骤来: 输入字母表 先确定特殊字符 空格,用于区分每个部分 数字,包含 0 - 9 和 . 左括号 ( 右括号 ) 逗号,用于分隔属性 其它 2. 初始状态 直接定义一个状态 1 为初始状态 3. 转移函数 矩阵为: const MATRIX = [

[0, 1, 2, 2, 0, 2],

[4, 1, 1, 1, 0, 1],

[4, 2, 3, 2, 0, 2],

[3, 3, 3, 2, 3, 3],

[4, 1, 2, 2, 0, 2],

];

4. 状态集合 const STATES = {

START: 0,

IN_TIME: 1,

IN_STR: 2,

IN_PARENTHESES: 3,

END: 4,

};

5. 接受状态集合 const FINAL_STATES = new Set([STATES.END]);

语法分析过程大致为: 在每次首次到达 end 或者 start 状态时,说明此时已经解析完了一个 section,根据上述语法分析的规则,将对于的属性赋值为当前解析完毕的 section 在每次首次到达start状态时,说明此时已经解析完了一个完整的transition,将之前保存属性的对象赋给最终结果,以 property 作为 key 完整代码: const STATES = {

START: 0,

IN_TIME: 1,

IN_STR: 2,

IN_PARENTHESES: 3,

END: 4,

};

const ALPHABET = {

SPACE: 0,

NUMBER: 1,

LEFT_PARENTHESE: 2,

RIGHT_PARENTHESE: 3,

COMMA: 4,

OTHERS: 5,

};

const MATRIX = [

[0, 1, 2, 2, 0, 2],

[4, 1, 1, 1, 0, 1],

[4, 2, 3, 2, 0, 2],

[3, 3, 3, 2, 3, 3],

[4, 1, 2, 2, 0, 2],

];

const move = (state, char) => MATRIX[state][char];

const FINAL_STATES = new Set([STATES.END]);

const INIT_STATE = STATES.START;

const mapCharToAlphabet = (char) => {

if (char === "(") {

return ALPHABET.LEFT_PARENTHESE;

}

if (char === ")") {

return ALPHABET.RIGHT_PARENTHESE;

}

if (char === " ") {

return ALPHABET.SPACE;

}

if (char === ",") {

return ALPHABET.COMMA;

}

if ((char >= "0" && char <= "9") || char === ".") {

return ALPHABET.NUMBER;

}

return ALPHABET.OTHERS;

};

export const parseTransition = (transition) => {

let map = {};

if (transition[transition.length - 1] !== ",") {

transition += ",";

}

let prevState = INIT_STATE;

let state = INIT_STATE;

let sectionStart = 0;

let sectionEnd = 0;

let property = "";

let duration = "";

let timingFunction = "";

let delay = "";

const emitProperty = () => {

let str = transition.slice(sectionStart, sectionEnd);

if (prevState === STATES.IN_STR) {

if (property.length === 0) {

property = str;

} else {

timingFunction = str;

}

} else if (prevState === STATES.IN_TIME) {

if (duration.length === 0) {

duration = str;

} else {

delay = str;

}

}

};

const emit = () => {

if (property.length === 0) {

property = "all";

}

map[property] = {

property,

duration,

timingFunction,

delay,

};

property = "";

duration = "";

timingFunction = "";

delay = "";

};

let char;

for (let i = 0; i < transition.length; i++) {

char = mapCharToAlphabet(transition[i]);

prevState = state;

state = move(state, char);

if (

(state === STATES.IN_STR || state === STATES.IN_TIME) &&

prevState !== state &&

prevState !== STATES.IN_PARENTHESES

) {

sectionStart = i;

} else if (state === STATES.END && prevState !== state) {

sectionEnd = i;

emitProperty();

} else if (state === STATES.START && prevState !== state) {

sectionEnd = i;

emitProperty();

emit();

}

}

return map;

};

export const stringifyTransition = (map) => {

return Object.values(map)

.map(

({ property, duration, timingFunction, delay }) =>

`${property} ${duration} ${timingFunction} ${delay}`

)

.join(",");

};

测试结果: 参考资料: 发布于 2021-10-18 20:08前端开发JavaScript​赞同 5​​2 条评论​分享​喜欢​收藏​申请

有穷自动机DFA&NFA (学习笔记) - 知乎

有穷自动机DFA&NFA (学习笔记) - 知乎切换模式写文章登录/注册有穷自动机DFA&NFA (学习笔记)小蜗牛cs本科生Part 1_自动机介绍:有穷自动机(finite state automata)是一个识别器,它对每个输入的字符做识别和判断,以确定其能到达的最终状态或状态集和路径,有穷自动机分为两类,即不确定的有穷自动机NFA和确定的有穷自动机DFA[1].例子1:红绿灯系统: G(绿灯亮了的状态);R(红灯亮的状态);Y(黄灯亮的状态)例子2:零售机(vending machine)。它接受五角和一块的硬币,但是要至少积累到3元才能按下选择,并且只有作出选择才会执行。所以从初始state开始,每一个状态之后都有两种选择:要么投5角,要么投1元;每次投完都会到达一个新的状态(目前投入硬币总数)。Part 2_专用名词解释:在介绍DFA和NFA之前,先介绍几个名词:alphabet 字母表:符号的有限集合。 记作: Σ 例如:{a, b, ... , x, m}strings 字符串: 通常我们用到建立在 Σ 上的字符串:有穷的符号序列。 例如:对于 Σ={a, b, c}, “ababc” 就是 Σ 上的一个字符串。languages 语言:通常我们也只用建立在Σ上的语言,语言就是多个字符串的集合。例如 {ababc, ab, bc, ..}sentences 句子:句子是语言集合中元素(字符串)的另一个称呼。notation 符号:Σ* 是Σ上所有可能的字符串的集合。例如:Σ={a, b}, Σ* = { ε, a, b, ab, ba}Part 3_DFA:DFA: Deterministic Finite State 确定的有穷自动机第一种计算模型:用来解决对一个已知字符串,看它是否能被某个自动机所接受。一个DFA有有穷个状态(state),主要分为三种状态:初始状态(initial state):自动机开始的状态;终止状态(final state):一个DFA至少有一个终止状态;中间状态。「状态间转换的公式: 状态 x 输入字符 --> 状态」3. DFA的定义:(共5部分) A = ( Σ, S, s0, F, N )Σ: 输入字母表(alphabet),是一个输入字符的集合。S:状态的集合s0: 初始状态F:终止状态集合 F ⊆ SN:转换公式 N:S×Σ → S4. 「“确定”意味着对于一个输入字符,只有唯一的可能状态」5. 例子:从上图我们可以得到一个转换公式表格:单步表示: N (S0, 0): 是自动机从s0状态,读取符号0之后的状态。从表格中可以看出N (S0, 0) = S1.多步表示: N (N (S0, 0), 1) = S2.** 重要定理: 对S中所有的状态s,所有 Σ*中的字符串 α,β, 有:N*(s, αβ) = N*(N*(s, α), β)。6. 最终状态公式 (eventual state function):从任意一个状态,经过一个string到达的最终状态的所有可能情况。表达为: N* : S × Σ* → S7. 如果一个字符串从一个DFA的初始状态出发,能在某一个终止状态结束,那这个字符串就被这个DFA所接受。所有的这种字符串的集合就是这个自动机的语言(language)。8. 自动机等同:如果两个自动机接受相同的语言,就说这两个自动机相等。9. 状态等同:如果对于所有的输入字符串 w, 有并且只有 N*(Sj,w) ∈ F 并且N*(Sk,w) ∈ F (F是final state的集合) 注意,一个非终止状态永远不可能与一个终止状态等同。10. 状态消除: 1)等同状态消除:如果两个状态等同,那么其中一个可以被消除,来简化自动机。 以上面9.为例,Sk可以被消除, 消除Sk之后的新的自动机A' = (Σ, S', s0, F', N' ) S' = S-Sk F‘ = F-Sk N‘(s,w)= (if N(s,w)=Sk then Sj else N(s,w))(注意这里有个前提,Sk不能是初始状态,因为初始状态不能被消除。) 2) 无法到达的状态消除:如果一个状态是无法从初始状态到达的,那么它可以被消除,例如下图的S3。11. 这里有一个传统的分组算法,可以用来最简化自动机,这里不做详细介绍。Part 4_NFA:1. NFA(Non-Deeterministic Finite State Automata)不确定的有穷自动机: 对一个输入符号,有两种或两种以上可能对状态,所以是不确定的。2. NFA可以转换成DFA,NFA和DFA的主要区别在于[1]: 1)DFA没有输入空串之上的转换动作; 2)对于DFA,一个特定的符号输入,有且只能得到一个状态,而NFA就有可能得到一个状态集;3. NFA的定义:(共5部分) A = ( Σ, S, s0, F, N ) (具体表示内容与DFA相同)4. 对于输入字符串w,如果满足 ∃ s ∈F. R*(s0, w, s), 那么w是被自动机所接受的。 所有被该自动机接受的字符串就是这个自动机的语言。5. 定理:如果语言L被一个NFA所接受,那么一定存在一些DFA也接受这一语言L。[1] 对DFA和NFA的理解以及它们之间的区别 - 编译学习者的日志 - 网易博客发布于 2017-10-12 20:09自动机​赞同 402​​27 条评论​分享​喜欢​收藏​申请

争取能让大家都能看懂的 DFA 算法 - 知乎

争取能让大家都能看懂的 DFA 算法 - 知乎首发于写代码的大胖切换模式写文章登录/注册争取能让大家都能看懂的 DFA 算法写代码的大胖为什么要学习这个算法我们公司一直都有的一个敏感词检测服务,前一段时间遇到了瓶颈,因为词库太多了导致会有一些速度过慢,而且一个正则表达式已经放不下了,需要进行拆分正则才可以。正好我以前看过有关 dfa 的介绍,但是并没有深入的进行研究,所以就趁着周末好好的了解一下这个东西。跟 php 的正则进行一下对比,看看速度如何,如果表现较好,说不定还能用得上。什么是 dfa通过百度可以知道 dfa 是 确定有穷自动机 的缩写。 应该还会见到类似下面图的说明 原谅我实在一些,我这人数学不好不说,貌似看图能力也不行,这个图恕我直言我没看懂。所以关于精准的解释,请大家去百度或者 google 自行查阅了。我的理解说明之前,我们先看看做检测需要准备的东西一个组织好的关键词树待检测的字符串什么是组织好的关键词树我们一批需要检测词库,比如下面这些 日本人,日本鬼子,日本人傻,破解*版 先做个解释,前三个大家都能看懂,那么 * 是什么,这个是我定义的通配符,代表着 * 可以是 0 - n 个占位符用来替代在关键词中间插入混淆字符。至于可以替换几个我们可以在代码中进行定义,需要注意 n 越大,速度就会越慢。说明完了,来看看构造好的树是什么一样的,应该是跟下图差不多的。 为什么要手动画一个,因为需要对比,我的理解跟程序是否一致,如果不一致,就要找出程序是不是写的不对了。那么我们来看看程序生成的是啥样的。 程序生成的跟图片一致,到这里还都是正确的。待检测的字符串这个就很容易理解了,就是我们需要检测的字符串。为什么要组织好那样的一棵树(算法思路)这块需要先说一个概念 它是是通过event和当前的state得到下一个state,即event+state=nextstate 这句话,或者类似的话你会在绝大多数的解释文章里面看到。而我的理解就是,一个字符一个字符的检测,如果检测的字符在我们的树种,就进入命中的树,看下一个字在不在树里面,如果持续的命中就持续进入,最后完全命中了,也就是那个字的子树只有一个元素,并且元素的键是 end (这里是在我们的这个例子中,看图就明白了)。就是完全命中了关键词,就可以记录命中,或者准备替换了。这里说一个可以优化的点,看我们的例子有两个词 日本人,日本鬼子 这两个,如果为了快,完全可以去掉第二个词,质保流一个就行了,这样当检测到 end 就可以直接屏蔽或者记录了,而在我们的例子中,还需要判断元素数量,不是 1 的情况下还得继续深入,看看是不是命中了长尾。这样的长尾检测会引发一个问题,那就是 回滚,当我们命中了前置的词,后续的没有命中的时候就得记录并且回滚,这个回滚的长度是是多少呢?其实不仅仅是没有命中长尾的回滚,还有一个 回滚 操作,就是检测率几个字之后就没命中率额,就得回顾,这个回滚的长度是,已检测字符长度 - 1 的长度 。那么没有命中长尾的长度我们就知道了,已检测字符长度 - 上次命中的长度 就可以了。下面我们来看看代码实现。// 通配符的数量

$maskMin = 0;

$maskMax = 3;

// 关键词词典字符串,这个部分的处理自己可以替换

$dict = "傻瓜";

$checkDfaTree = [];

$dictArr = explode(',', $dict);

// 重组一下带有 * 通配符的数组

$fullDictArr = [];

foreach ($dictArr as $word) {

if (mb_strpos($word, '*') !== false) {

// 带有通配符就把通配符去掉

for ($maskIndex = $maskMin; $maskIndex <= $maskMax; $maskIndex++) {

$maskString = str_pad('', $maskIndex, '*');

$inputWord = str_replace('*', $maskString, $word);

$fullDictArr[] = $inputWord;

}

} else {

$fullDictArr[] = $word;

}

}

foreach ($fullDictArr as $word) {

// 每次开始新词都要回到树的根部

$treeStart = &$checkDfaTree;

$wordLen = mb_strlen($word);

for ($i = 0; $i < $wordLen; $i++) {

$char = mb_substr($word, $i, 1);

$treeStart[$char] = isset($treeStart[$char]) ? $treeStart[$char] : [];

if ($i + 1 == $wordLen) {

// 如果已经是次的结尾了就设置null

$treeStart[$char]['end'] = true;

}

// 移动指针到下一个

$treeStart = &$treeStart[$char];

}

}

// 遍历str

$start = microtime(true);

$checkMessageLen = mb_strlen($checkMessage);

$wordArr = [];

$checkTreeStart = &$checkDfaTree;

$hasPrefixLength = 0;

$targetWord = '';

for ($i = 0; $i < $checkMessageLen; $i++) {

// 获取一个字符

$char = mb_substr($checkMessage, $i, 1);

if (isset($checkTreeStart[$char])) {

// 如果有这个字就进入子树里面

if (isset($checkTreeStart[$char]['end']) && $checkTreeStart[$char]['end'] === true) {

// 如果包含这个标识,就记录标识

$hasPrefixLength = mb_strlen($targetWord);

}

$checkTreeStart = &$checkTreeStart[$char];

$targetWord .= $char;

} else if (isset($checkTreeStart['*'])) {

// 如果有通配符就进入子树

$checkTreeStart = &$checkTreeStart['*'];

$targetWord .= $char;

} else {

if ($hasPrefixLength) {

$wordArr[] = mb_substr($targetWord, 0, $hasPrefixLength + 1);

// 回滚

$i -= mb_strlen($targetWord) - $hasPrefixLength;

} else {

// 回滚

$i -= mb_strlen($targetWord);

}

// 回到头部

$checkTreeStart = &$checkDfaTree;

$targetWord = '';

$hasPrefixLength = 0;

}

if (count($checkTreeStart) == 1 && isset($checkTreeStart['end']) && $checkTreeStart['end'] === true) {

// 子树只有一个并且是end 就说明是命中了

// 赋值

$wordArr[] = $targetWord;

// 清空

$targetWord = '';

// 回到头部

$checkTreeStart = &$checkDfaTree;

$hasPrefixLength = 0;

}

}

var_dump($wordArr);

echo "
useTime:" . (microtime(true) - $start) * 1000;

下面这个就是匹配加测试了,目前我能想到的都测试通过了,如果有问题,可以回复我。结论目前来看,效率是比正则要好一些,命中的情况下速度差不多,没命中的情况下表现要优于正则。发布于 2020-03-30 12:23计算机算法设计​赞同 17​​4 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录写代码

dfa_百度百科

百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心dfa播报讨论上传视频面向装配的设计收藏查看我的收藏0有用+10dfa是面向装配的设计(Design for assembly)的英文简称,是指在产品设计阶段设计产品使得产品具有良好的可装配性,确保装配工序简单、装配效率高、装配质量高、装配不良率低和装配成本低。面向装配的设计通过一系列有利于装配的设计指南例如简化产品设计、减少零件数量等,并同装配工程师一起合作,简化产品结构,使其便于装配,为提高产品质量、缩短产品开发周期和降低产品成本奠定基础。书    名dfa别    名面向制造和装配的产品设计指南、面向装配的设计作    者钟元出版社机械工业出版社出版时间2011年5月1日定    价28 元ISBN9787111340089外文名Design for assembly目    的简化产品装配工序条    件产品设计阶段提出者Geoff Boothroyd开 本A5目录1装配设计▪目的▪发展历史▪内容简介▪前言▪图书目录2编译原理3财务分析4其他定义装配设计播报编辑目的通过面向装配的设计,产品开发能够达到以下目的:简化产品装配工序缩短产品装配时间减少产品装配错误减少产品设计修改降低产品装配成本提高产品装配质量提高产品装配效率降低产品装配不良率提高现有设备使用率发展历史20世纪60和70年代,人们根据实际设计经验和装配操作实践,提出了一系列有利于装配的设计建议,以帮助设计人员设计出容易装配的产品,这些设计建议并辅以真实的案例告诉人们如何从产品设计着手来改善产品的装配。1977年,Geoff Boothroyd教授第一次提出了面向装配的设计(Design for Assembly, DFA)这一概念,并被广泛接受。面向装配的设计旨在提高零件的可装配性以减少装配时间、降低装配成本和提高装配质量。1982年,Boothroyd教授在《自动化装配》一书中,提出了一套评估零件可装配性的体系,并以此为基础,开发出面向装配的设计软件。自诞生之初,面向装配的设计就受到很多企业的重视,并取得很好的应用效果。1981年,施乐企业的制造经理Sidney Liebson估计施乐因为实施面向装配的设计而节省了几百万美元。1988年,福特企业因为DFA的实施节省了10亿美元。内容简介面向制造和装配的产品设计是企业以“更低的开发成本、更短的开发周期、更高的产品质量”进行产品开发的关键。本书详细介绍了面向制造和装配的产品设计指南,包括面向装配的设计指南、塑胶件设计指南、钣金件设计指南和压铸件设计指南等,辅以图形和真实案例,并提供面向制造和装配的产品设计检查表,具有非常高的实用价值。 本书适合从事产品开发的工程师阅读,也可供高等院校机械类专业学生学习。前言产品开发如同奥林匹克竞技。更低的产品开发成本、更短的产品开发周期、更高的产品质量,永远是企业追求的最高境界。在全球化的背景下,企业之间的竞争日益加剧,在产品开发中任何一个环节稍有落后,就可能被竞争者超越,甚至被淘汰出局。 企业如何才能以“更低的成本、更短的时间、更高的质量”进行产品开发呢?面向制造和装配的产品设计正是这样的一个有效手段。它从提高产品的可制造性和可装配性入手,在产品开发阶段就全面考虑产品制造和装配的需求,同时与制造和装配团队密切合作,通过减少产品设计修改、减少产品制造和装配错误、提高产品制造和装配效率,从而达到降低产品开发成本、缩短产品开发周期、提高产品质量的目的。本书首先介绍了面向制造和装配的产品开发;然后重点介绍了面向制造和装配的设计指南,其中包括面向装配的设计指南、塑胶件设计指南、钣金件设计指南、压铸件设计指南和公差分析等;最后提供了面向制造和装配的产品设计检查表,用于系统化地检查产品设计是否满足产品制造和装配的需求。 本书根据作者多年产品开发实际经验编写,并结合了国内外先进的产品开发理念和产品设计思想,具有以下特色:1.详细介绍面向装配的设计指南同产品的制造一样,产品的装配处于同等重要甚至更为重要的地位,但长期被忽视。本书详细介绍了面向装配的设计指南,以确保产品设计符合产品装配的要求,减少装配错误,降低装配成本,提高装配效率和装配质量。2.实用性强本书没有复杂的理论,而是从产品开发的实际应用着手,介绍了面向制造和装配的设计指南。每一条设计指南都来源于真实的产品开发经验和教训总结,违反其中任何一条设计指南都可能会造成产品开发成本的增加、产品开发周期的延长和产品质量的降低。另外,本书提供的产品设计检查表能够帮助机械工程师系统化地检查产品设计,确保产品设计符合制造和装配的要求,其有非常高的实用性。3.实例丰富、强调实践本书的设计指南辅以图形和真实案例,简单易懂。作者从一个机械工程师的角度来分析和讲述每一条设计指南对产品开发的影响,指导机械工程师利用每一条设计指南来提高产品开发的质量。图书目录前言第1章 面向制造和装配的产品开发1.1 绪论1.1.1 产品开发模式的进化1.1.2 产品设计的重要性1.1.3 产品设计的要求1.2 传统产品开发模式1.2.1 传统产品开发流程1.2.2 传统产品开发模式的弊端1.3 面向制造和装配的产品开发模式1.3.1 面向制造和装配的产品开发流程1.3.2 面向制造和装配的产品开发的优点1.3.3 面向制造和装配的产品开发与并行工程1.4 面向制造和装配的产品开发的实施1.4.1 实施的障碍1.4.2 实施的关键第2章 面向装配的设计指南2.1 面向装配的设计2.1.1 装配的定义2.1.2 最好和最差的装配工序2.1.3 面向装配的设计的定义2.1.4 面向装配的设计的目的2.1.5 面向装配的设计的历史2.2 设计指南2.2.1 减少零件数量2.2.2 减少紧固件的数量和类型2.2.3 零件标准化2.2.4 模块化产品设计2.2.5 设计一个稳定的基座2.2.6 设计零件容易被抓取2.2.7 避免零件缠绕2.2.8 减少零件装配方向2.2.9 设计导向特征2.2.10 先定位后固定2.2.11 避免装配干涉2.2.12 为辅助工具提供空间2.2.13 为重要零部件设计装配止位特征2.2.14 防止零件欠约束和过约束2.2.15 宽松的零件公差要求2.2.16 防错的设计2.2.17 装配中的人机工程学2.2.18 线缆的布局第3章 塑胶件设计指南3.1 塑胶3.1.1 塑胶的定义3.1.2 塑胶的特性3,1.3 注射成型3:2 塑胶材料选择3.2.1 塑胶材料的分类3.2.2 常用塑胶材料性能3.2.3 塑胶材料选择原则3.3 设计指南3.3.1 零件壁厚3.3.2 避免尖角3.3.3 脱模斜度3.3.4 加强肋的设计3.3.5 支柱的设计3.3.6 孔的设计3.3.7 提高塑胶件强度的设计3.3.8 改善塑胶件外观的设计3.3.9 降低塑胶件成本的设计3.3.10 注射模具可行性设计3.3.11 注射模具讨论要点3.4 塑胶件的装配方式3.4.1 卡扣装配3.4.2 机械紧固3.4.3 超声波焊接第4章 钣金件设计指南4.1 钣金4.1.1 钣金的概念4.1.2 冲压简介4.1.3 常用钣金材料介绍4.2 设计指南4.2.1 冲裁4.2.2 折弯4.2.3 拉深4.2.4 5包4.2.5 止裂槽4.2.6 指明毛边的方向和需要压毛边的边4.2.7 提高钣金强度的设计4.2.8 降低钣金成本的设计4.2.9 其他钣金设计考虑4.3 钣金常用装配方式4.3.1 卡扣装配4.3.2 拉(铆)钉装配4.3.3 自铆4.3.4 螺钉机械装配4.3.5 点焊4.3.6 各种装配方式比较第5章 压铸件设计指南5.1 压铸简介5.1.1 压铸5.1.2 压铸的优缺点5.1.3 关于压铸件的六大误解5.2 常用压铸材料介绍5.2.1 铝合金5.2.2 锌合金5.2.3 镁合金5.3 设计指南5.3.1 零件壁厚5.3.2 压铸件最小孔5.3.3 避免压铸型局部过薄5.3.4 加强肋的设计5.3.5 脱模斜度5.3.6 圆角的设计5.3.7 支柱的设计5.3.8 字符5.3.9 螺纹5.3.10 为飞边和浇口的去除提供方便5.3.11 压铸件的公差要求5.3.12 简化模具结构,降低模具成本5.3.13 机械加工5.3.14 使用压铸件简化产品结构:降低产品成本第6章 公差分析6.1 公差分析简介6.1.1 引言6.1.2 公差的概念6.1.3 公差的本质6.1.4 公差分析的目的6.2 公差分析的步骤6.2.1 定义公差分析的目标尺寸和判断标准6.2.2 定义尺寸链6.2.3 判断尺寸链中尺寸的正负6.2.4 将非双向对称公差转换为双向对称公差6.2.5 公差分析的计算6.2.6 判断和优化6.2.7 装配偏移6.3 公差分析指南6.3.1 明确目标尺寸及其判断标准6.3.2 公差一致性6.3.3 公差分析结果不满足判断标准时的解决方法6.4 利用Excel进行公差分析第7章 面向制造和装配的设计检查表7.1 和谐的设计7.2 设计检查表7.2.1 简介7.2.2 使用方法编译原理播报编辑定义英文全称:Deterministic Finite Automaton, 简写:DFA [1]定义:一个确定有穷自动机(DFA)M是一个五元组:M=(K,Σ,f,S,Z)其中① K是一个有穷集,它的每个元素称为一个状态;② Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以也称Σ为输入符号字母表;③ f是转换函数,是K×Σ→K上的映射(且可以是部分函数),即,如 f(ki,a)=kj,(ki∈K,kj∈K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;④ S ∈ K是唯一的一个初态;⑤ Z⊂K是一个终态集,终态也称可接受状态或结束状态。 [2]特征图1确定的有限自动机确定的有限自动机与有限机一样,有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。DFA以如下方式接受或拒绝一个字符串:从初始状态出发,对于输入字符串中的每个字符,自动机都将沿着一条确定的边到另一状态,这条边必须是标有输入符号的边。对n个字符的字符串进行了n次状态变换后,如果自动机到达了一个终态,自动机将接收该字符串。若到达的不是终态,或者找不到与输入字符相匹配的边,那么字符串将拒绝接受这个字符串。 由一个自动机识别的语言是该自动机接收的字符串集合。 [2]图1给出了一些确定的有限自动机的实例,每个例子的初态(即其进入边没有来源的状态)都是编号为1的状态,圈圈表示初态,双圈表示终态。标有多个字符的边是多条平行边的缩写。 [1]DFA与NFA1.DFA的一个状态是NFA的一个状态集合。2.读了输入a1 a2 … an后,NFA能到达的所有状态:s1, s2, …, sk,则DFA到达状态{s1, s2, …, sk}3.把NFA变成DFA 一般使用子集构造法4.将DFA化简的方法为合并不可区别状态例子:识别语言(a|b)*ab的DFA:1.首先构造NFA,见图2上。2.按照A = {0, 1, 2, 4, 7}图2最简DFA的构造过程B = {1, 2, 3, 4, 6, 7, 8}C = {1, 2, 4, 5, 6, 7}D = {1, 2, 4, 5, 6, 7, 9}将其转换成DFA。见图2左下。三、最后简化为最简的DFA。A和B是可区别的状态:从A出发,读过单字符b构成的串,到达非接受状态C,而从B出发,读过串b,到达接受状态DA和C是不可区别的状态:从A、C出发读单字符a到达非接受状态B,读单字符b到达非接受状态C,所以无任何串可用来像上面这样区别它们。故而将其合并为一个状态。最终结果见图2右下。 [1]财务分析播报编辑英文全称:Dynamic Financial Analysis,DFA是一种整体性的财务建模方法,它通过对公司未来生存环境和营运结果进行模拟,显示公司营运结果如何受外部环境变动和内部战略决策变动的影响。这种动态财务分析方法是一种整体的区别于静态的、传统的财务比率分析的财务管理方法,体现了“随机性”、“动态性”的思想,能够随机模拟不确定性环境下公司的资产、负债及未来的经营成果,为高层管理者控制经营风险、制定战略决策提供依据。企业战略决策必须面对不确定的未来环境(由未来利率水平、股票市场走势、GDP增长率等构成)。对环境我们可以做出许多组假定,在动态财务分析方法中,每一组假定生成一个情景。动态财务分析的核心是对未来可能的情景进行界定,而情景是对一组外生变量(比如利率、通胀率等)未来状态的具体描述,它构成了公司具体的生存环境。同一情景,在不同战略下,营运结果不同;同一战略,在不同情景下,营运结果也不同。需要注意的是,动态财务分析方法不仅仅是一种战略决策模型,它更是一种把公司整体经营状况整合在一起的思考方式。在一种整体性、全方位的框架中对公司的战略决策进行评估。动态财务分析方法作为全方位的思考方式,允许公司在单一框架中同时处理许多种战略决策,这与传统把不同的战略决策分散在不同的框架中处理的方法形成了鲜明对比。 [3]其他定义播报编辑dimer fatty acid : 二聚脂肪酸(化工)阴离子葡聚糖 ( dextran fluorescein anionic,DFA)differentiend fault analysis荷兰花艺学院专业设计师资格证新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

DFA算法的简单说明与案例实现以及优化思路_简述d fa的优化原理-CSDN博客

>

DFA算法的简单说明与案例实现以及优化思路_简述d fa的优化原理-CSDN博客

DFA算法的简单说明与案例实现以及优化思路

最新推荐文章于 2024-02-04 19:57:51 发布

我姓徐

最新推荐文章于 2024-02-04 19:57:51 发布

阅读量3.1k

收藏

18

点赞数

分类专栏:

笔记

文章标签:

java

算法

敏感词

DFA

dfa算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/xb565517830/article/details/117691306

版权

笔记

专栏收录该内容

5 篇文章

0 订阅

订阅专栏

1.背景

项目中需要对敏感词做一个过滤,首先有几个方案可以选择:

a.直接将敏感词组织成String后,利用indexOf方法来查询。

b.传统的敏感词入库后SQL查询。

c.利用Lucene建立分词索引来查询。

d.利用DFA算法来进行。

首先,项目收集到的敏感词有几千条,使用a方案肯定不行。其次,为了方便以后的扩展性尽量减少对数据库的依赖,所以放弃b方案。然后Lucene本身作为本地索引,敏感词增加后需要触发更新索引,并且这里本着轻量原则不想引入更多的库,所以放弃c方案。于是我们选定d方案为研究目标。

2.DFA算法简介

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。

 

简单点说就是,它是是通过event和当前的state得到下一个state,即event+state=nextstate。理解为系统中有多个节点,通过传递进入的event,来确定走哪个路由至另一个节点,而节点是有限的。

3.敏感词搜寻中的DFA算法

3.1敏感词库构造描述

以王八蛋和王八羔子两个敏感词来进行描述,首先构建敏感词库,该词库名称为SensitiveMap,这两个词的二叉树构造为:

 

用hash表构造为:

 

3.2基于敏感词库收索算法的描述

以上面例子构造出来的SensitiveMap为敏感词库进行示意,假设这里输入的关键字为:王八不好,流程图如下:

  

4.代码编写

4.1构造敏感词实现代码

 

 

4.2实现敏感词查询代码

 

4.3API预览

4.3.1 敏感词替换

String text = "我们决定紧急征调5000人前往宅区帮助灾民,并且决定为紧急事件打开绿灯";

filter.replace(text);

4.3.2. 是否包含敏感词

String text = "我小时候有个朋友叫张三,现在和他几乎没联系了";

filter.include(text);

4.3.3. 获取敏感词数

String text = "我小时候有个朋友叫张三,现在和他几乎没联系了";

int result = filter.wordCount(text);

4.3.4. 获取敏感词列表

String text = "我小时候有个朋友叫张三,现在和他几乎没联系了";

List words = filter.wordList(text);

4.3.5. 增加白名单功能

- blacklist.txt

- whitelist.txt

4.3.6. 增加方法重载

- replace(final String text) // distance=0&symbol=*

- replace(final String text, final char symbol) // distance=0

- include(final String text) // distance=0

- wordCount(final String text) // distance=0

- wordList(final String text) // distance=0

4.3.7. 增加在线添加敏感词方法

//此处将5000加入黑名单

context.addWord(Collections.singletonList("5000"), WordType.BLACK);

4.3.8、增加在线删除敏感词方法

//此处将5000移出黑名单(若黑名单没有该词组将忽略)

context.removeWord(Collections.singletonList("5000"), WordType.BLACK);

//此处将紧急事件移出白名单(若白名单没有该词组将忽略)

context.removeWord(Collections.singletonList("紧急事件"), WordType.WHITE);

 

5.优化思路

5.1敏感词中间填充无意义字符问题

对于“王*八&&蛋”这样的词,中间填充了无意义的字符来混淆,在我们做敏感词搜索时,同样应该做一个无意义词的过滤,当循环到这类无意义的字符时进行跳过,避免干扰。

5.2敏感词用拼音或部分用拼音代替

两种解决思路:一种是最简单是遇到这类问题,先丰富敏感词库进行快速解决。第二种是判断时将敏感词转换为拼音进行对比判断。

不过目前这两种方案均不能彻底很好的解决该问题,此类问题还需进一步研究。

5.3敏感词中间填充其他单字

对于王小八蛋,黑名单中存在‘王八蛋’敏感词,中间填充‘小’字,目前可以设置跳过步长 skip=1 来过滤敏感词,但对于多字又填充多字的情况下,步长skip无法进行统一设置,兼容情况还需要进一步完善。

优惠劵

我姓徐

关注

关注

0

点赞

18

收藏

觉得还不错?

一键收藏

知道了

1

评论

DFA算法的简单说明与案例实现以及优化思路

1.背景项目中需要对敏感词做一个过滤,首先有几个方案可以选择:a.直接将敏感词组织成String后,利用indexOf方法来查询。b.传统的敏感词入库后SQL查询。c.利用Lucene建立分词索引来查询。d.利用DFA算法来进行。首先,项目收集到的敏感词有几千条,使用a方案肯定不行。其次,为了方便以后的扩展性尽量减少对数据库的依赖,所以放弃b方案。然后Lucene本身作为本地索引,敏感词增加后需要触发更新索引,并且这里本着轻量原则不想引入更多的库,所以放弃c方案。于是我们选定d方案为

复制链接

扫一扫

专栏目录

java利用DFA算法实现敏感词过滤功能

08-30

在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解。下面这篇文章主要给大家介绍了关于java利用DFA算法实现敏感词过滤功能的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。

DFA(确定的有穷自动机)的化简

再走一步

05-11

9183

1.实验内容每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA化简为与之等价的最简DFA。2.实验设计分析2.1 实验设计思路    根据实验指导书和书本上的相关知识,实现算法。2.2 实验算法(1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。(2)对I采用下面...

1 条评论

您还未登录,请先

登录

后发表或查看评论

基于DFA算法实现的敏感词屏蔽

06-13

功能介绍

提供一个字符串,即可得到屏蔽敏感词后的字符串

可忽略掉无效字符(汉字、字母、数字以外的符号)

提供了重新选择敏感词库以及添加单个敏感词的功能

提供了查询字符串是否存在敏感词的功能(不进行屏蔽)

文件说明

dfa.py为源码

TestDFA.py为使用pytest进行运行性能测试

sensitive_words.txt为默认敏感词库

DfaApi.py为建立运行于web上的API接口

text_filter/string命令返回是否存在敏感词以及屏蔽后的字符串

add_new_words/string命令向敏感词库添加新的敏感词

change_text/string命令修改新的敏感词词库,string为新文件的path

编译原理期末复习

tuoboyuan

06-04

381

第一章

基本概念

一些语言

自然语言:人与人交流的语言

高级程序设计语言:目前人控制计算机的语言

机器语言:最早的程序设计语言(计算机直接执行的语言)

翻译:从高级程序设计语言到机器语言的转换

编译方式:先翻译,后执行

解释方式:边翻译,边执行

编译器的工作流程

词法分析

输入源程序,输出待检查的单词符号串,目的是将程序分解为单词。

语法分析

输入待检查的单词符号串,输出语法树,目的是得到语法结构并以树的形式表示

语义分析

根据语义规则对语法树中的语法单元进行检查,如x→a,x和a的类型是否一致

中间

编译原理作业_RE-NFA-DFA-minDFA

lyk_sama的博客

04-09

1980

题目将一个正则表达式(regular expression)转换成NFA,之后从NFA转换成DFA,之后在这个DFA中找出minDFA。

一、RE到NFA

RE(Regular Expression)为(a|b)*aba(a|b)*

将RE化成NFA的三个主要的类别是(a|b)和a*和ab

二、NFA到DFA

1,先把NFA的每个状态都标上数字

2,从ε-cl...

DFA 算法

热门推荐

温染的笔记

05-03

5万+

DFA算法的简单介绍以及DFA算法在关键词匹配中的应用,如何简单地使用 Python 3.X 去实现 DFA 算法,来帮助我们从文本中抽取关键词,以及对敏感词进行识别。

记录一次敏感词过滤算法DFA的应用案例

s2008100262

12-24

2151

目录

1、为什么要用DFA

2、DFA工具类实现

3、性能对比效果

3.1 普通关键字过滤

3.2 DFA关键字过滤

1、为什么要用DFA

2、DFA工具类实现

3、性能对比效果

3.1 普通关键字过滤

JMH代码如下:

package com.autocoding.hutool;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.TimeUnit;

i...

【计算理论】计算理论总结 ( 非确定性有限自动机 NFA 转为确定性有限自动机 DFA | 示例 ) ★★

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 )

12-18

1977

非确定性有限自动机 NFA 转为确定性有限自动机 DFA 示例

确定有限状态自动机(DFA)在解算法题中的应用

qq_33297737的博客

11-08

471

语法树;算法;DFA;解析布尔表达式;leetcode 1106;

正则表达式DFA构造方法

么刚的专栏

09-19

2万+

陈梓瀚 vczh@163.com http://www.cppblog.com/vczh/1、问题概述随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词法分析独立出来做研究的重要性。不过词法分析器的作用却不限于此。回想一下我们的老师刚刚开始向我们讲述程序设计的时候,总是会出一道题目:给出一个填入了四则运算式子的字符串,写程序计算该式子的结果。除此之外,我们有时候

easyui动态增加datagrid列_动态规划NOIP提高组历年高频考点(1)

weixin_39968490的博客

11-24

111

点击上面微信号关注我关注我哟定期推送帐号信息学新闻,竞赛自主招生,信息学专业知识,信息学疑难解答,信息学训练营信息等诸多优质内容的微信平台,欢迎分享文章给你的朋友或者朋友圈!有任何问题请联系小编!NOIP2020考前刷题冲刺营课程 通过分析NOIP2011-2018年提高组的试题我们就会发现,考察最多的考点前三名就是模拟,动态规划和贪心算法。简单统计这八年的提高组48个试题我们发现...

常用机器学习算法汇总比较(完)

qq_41978139的博客

06-13

747

机器学习入门系列(2)--如何构建一个完整的机器学习项目,第九篇!常用机器学习算法汇总比较的最后一篇,介绍提升(Boosting)算法、GBDT、优化算法和卷积神经网络的基本原理、优缺点。9. 提升(Boosting)方法简述 提升方法(boosting)是一种常用的统计学习方法,在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提供分类的性能。 boosting 和 baggingboosting 和 bagging 都是集成学习(ensemble learning)领域

(8)【Python/机器学习/深度学习】Deep-Learning模型与算法应用—常见的神经网络ANNMLP, CNN, RNN区别及应用&Keras、TensorFlow框架应用

最新发布

欢迎来到代码骑士的秘密基地

02-04

965

是一个功能强大且易于使用的免费开源Python库,用于开发和评估深度学习模型。(1)定义Keras模型(2)加载数据(3)编译Keras模型(4)拟合Keras模型(5)评估Keras模型(6)进行预测3、ANN多层感知机MLP应用通过一个或多个密集层(Dense layer)创建多层感知器(MLP)。这种模型适用于表格数据,即在表格或电子表格中的数据,每个变量对应一列,每行对应一个变量。您可能希望使用MLP探索的三个预测建模问题包括:二元分类、多类分类和回归。

编译原理 —— DFA的化简

starter_____的博客

05-02

2万+

DFA 的化简

任何正规语言都有一个唯一的状态数目最少的DFA

DFA M的化简是指:寻找一个状态数比M少的DFA M’,使得L(M)=L(M’)

有穷自动机的多余状态:从自动机的开始状态出发,任何可识别的输入串也不能到达的状态

化简了的DFA M’ 满足两个条件:

没有多余状态 ;

没有两个状态是等价的。

DFA M 的化简方法

求解过程:

① 将DFA M的状态集Q分划成两个子集:...

构造正规式最小DFA方法

12-21

该文档详细解释了如何构造最小化DFA和正则表达式之间的转换

DFA算法的简单说明!

weixin_30908103的博客

03-29

1617

1.DFA算法简介

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。

/**

* 敏感词过滤方法.

...

NFA->DFA方法

qq_40062884的博客

11-03

3008

编译原理,每次遇到NFA转化为DFA时都没有思路,本文主要讲解转化的算法,自己做个总结,防止忘记。

NFA->DFA方法

正则表达式–>NFA—>DFA—>最简DFA

DFA(有限自动机,每个状态的下一步都是确定的,没有空。只有一个开始状态,只有一个结束状态)

NFA(有可能转到多个状态,可能有空)

由正则表达式转到NFA:

基本可以分成3种:

AB(连接)

A|B(或)...

DFA的实现

whinah的专栏

09-05

8495

DFA的实现

在工业界,DFA的有效实现一直是一个问题,龙书中提到了一种使用四个数组的通用DFA实现,在汉字分词算法中经常用到double array作为Trie的一种实现。四数组的是通用DFA的实现,双数组的仅能用于实现Trie。并且它们的创建速度慢,难以理解,内存占用也比较多,状态id的值域范围稀疏。

我的实现

我实现了一种很紧凑的DFA,这在某种程度上源于popcount带来的灵感。当

基于‘DFA’的使用‘表驱动法’识别‘字符串模式’的方法

hexiaole1994的专栏

04-19

3944

一、概述

1. 术语简介

1)DFA

Deterministic Finite Automata,确定的有穷自动机,这是一个识别字符串模式的模型,术语参考自书籍《编译原理》。

该模型对应一个状态,字母表,和转换函数的集合。

例如:需要识别字符串aabb

状态:当前字符串识别的状态,在例子中,其中的,a,aa,aab,aabb对应不同的状态,假设对应为状态1,2,3,4,其中4被称作接受...

dfa敏感词过滤算法怎么实现

04-23

敏感词过滤算法可以分为基于规则的过滤算法和基于机器学习的过滤算法两种。 1. 基于规则的敏感词过滤算法 这种算法适合于敏感词列表较小的场景,它的实现步骤如下: (1)将敏感词列表载入程序中,并按长度排序。...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

我姓徐

CSDN认证博客专家

CSDN认证企业博客

码龄7年

暂无认证

43

原创

2万+

周排名

214万+

总排名

14万+

访问

等级

1255

积分

5742

粉丝

116

获赞

17

评论

655

收藏

私信

关注

热门文章

Gitlab的使用(内含Git命令大全)

41567

查看linux中的TCP连接数

7998

centos7 iptables的安装和配置

5817

java搭建阿里云服务器环境(java环境+mysql+tomcat)和部署 JavaWeb 项目到云服务器(十分详细)

4985

Java 常用HTTP请求工具类HttpUtils

4488

分类专栏

日常

1篇

笔记

5篇

服务器

20篇

教程

19篇

最新评论

Gitlab的使用(内含Git命令大全)

岁月不止:

这作者有点意思哈

中国最新省市区sql数据

M2lzl:

很好了

中国最新省市区sql数据

Daylak2107:

给你赞了,多谢

中国最新省市区sql数据

whySoSeriousZl:

并不是最新的 无为已经是无为市了但数据中还是无为县

DFA算法的简单说明与案例实现以及优化思路

Xd聊架构:

谢谢博主,学到了,我的博客说不定有您感兴趣的内容,互相支持哦~

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Java 常用HTTP请求工具类HttpUtils

虚拟机启动docker镜像提示no space left on device

码农即将30岁,焦虑扑面而来

2022年5篇

2021年2篇

2020年5篇

2019年10篇

2018年22篇

目录

目录

分类专栏

日常

1篇

笔记

5篇

服务器

20篇

教程

19篇

目录

评论 1

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

DFA算法的简单说明与案例实现_请设计一个 dfa,其能识别以 b 为开始和结尾符号、且中间可有任意多个 (包括 0 个)-CSDN博客

>

DFA算法的简单说明与案例实现_请设计一个 dfa,其能识别以 b 为开始和结尾符号、且中间可有任意多个 (包括 0 个)-CSDN博客

DFA算法的简单说明与案例实现

最新推荐文章于 2021-06-21 20:07:32 发布

小小华bk

最新推荐文章于 2021-06-21 20:07:32 发布

阅读量3.4w

收藏

54

点赞数

18

分类专栏:

算法

算法

专栏收录该内容

1 篇文章

0 订阅

订阅专栏

1.背景

项目中需要对敏感词做一个过滤,首先有几个方案可以选择:

a.直接将敏感词组织成String后,利用indexOf方法来查询。

b.传统的敏感词入库后SQL查询。

c.利用Lucene建立分词索引来查询。

d.利用DFA算法来进行。

首先,项目收集到的敏感词有几千条,使用a方案肯定不行。其次,为了方便以后的扩展性尽量减少对数据库的依赖,所以放弃b方案。然后Lucene本身作为本地索引,敏感词增加后需要触发更新索引,并且这里本着轻量原则不想引入更多的库,所以放弃c方案。于是我们选定d方案为研究目标。

2.DFA算法简介

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。

 

简单点说就是,它是是通过event和当前的state得到下一个state,即event+state=nextstate。理解为系统中有多个节点,通过传递进入的event,来确定走哪个路由至另一个节点,而节点是有限的。

3.敏感词搜寻中的DFA算法

3.1敏感词库构造描述

以王八蛋和王八羔子两个敏感词来进行描述,首先构建敏感词库,该词库名称为SensitiveMap,这两个词的二叉树构造为:

 

用hash表构造为:

 

3.2基于敏感词库收索算法的描述

以上面例子构造出来的SensitiveMap为敏感词库进行示意,假设这里输入的关键字为:王八不好,流程图如下:

  

4.代码编写

4.1构造敏感词实现代码

 

4.2实现敏感词查询代码

 

5.优化思路

5.1敏感词中间填充无意义字符问题

对于“王*八&&蛋”这样的词,中间填充了无意义的字符来混淆,在我们做敏感词搜索时,同样应该做一个无意义词的过滤,当循环到这类无意义的字符时进行跳过,避免干扰。

5.2敏感词用拼音或部分用拼音代替

两种解决思路:一种是最简单是遇到这类问题,先丰富敏感词库进行快速解决。第二种是判断时将敏感词转换为拼音进行对比判断。

不过目前这两种方案均不能彻底很好的解决该问题,此类问题还需进一步研究。

优惠劵

小小华bk

关注

关注

18

点赞

54

收藏

觉得还不错?

一键收藏

知道了

0

评论

DFA算法的简单说明与案例实现

1.背景项目中需要对敏感词做一个过滤,首先有几个方案可以选择:a.直接将敏感词组织成String后,利用indexOf方法来查询。b.传统的敏感词入库后SQL查询。c.利用Lucene建立分词索引来查询。d.利用DFA算法来进行。首先,项目收集到的敏感词有几千条,使用a方案肯定不行。其次,为了方便以后的扩展性尽量减少对数据库的依赖,所以放弃b方案。然

复制链接

扫一扫

专栏目录

java利用DFA算法实现敏感词过滤功能

08-30

在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和...下面这篇文章主要给大家介绍了关于java利用DFA算法实现敏感词过滤功能的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。

算法总结:DFA(自动机)算法是什么,怎么用

dauiwsbd的博客

07-31

5319

算法总结:高手们常说的DFA(自动机)算法是什么简介一:从一个C++语言程序开始1.基础C语言解法2.DFA(自动机)算法思想3.自动机编程题解二:Leetcode实战注

简介

自动机编程(英语:Automata-based programming)

是编程典范中的一种,是指程式或其中的部份是以有限状态机(FSM)为模型的程式,有些程式则会用其他型式(也更复杂)的自动机为其模型。自动机程序在每个时刻有一个状态 s,每次经过一个行动 f,转移到下一个状态 s’。这样,只需要建立一个覆盖所有情况的从 s 与 f

参与评论

您还未登录,请先

登录

后发表或查看评论

编译原理答案--第四章

lishirong_李世荣的专栏

12-02

3万+

《编译原理》课后习题答案第四章第4章 词法分析第1题构造下列正规式相应的DFA.(1) 1(0|1)*101 (2) 1(1010*|1(010)*1)*0(3) a((a|b)*|ab*a)*b(4) b((ab)*|bb)*ab答案:(1) 先构造NFA: 用子集法将NFA确定化.01X.AAAABABACABACAABYABYACAB除X,A外,重新命名其他状态,令AB为B、AC为C、ABY

DFA 算法

热门推荐

温染的笔记

05-03

5万+

DFA算法的简单介绍以及DFA算法在关键词匹配中的应用,如何简单地使用 Python 3.X 去实现 DFA 算法,来帮助我们从文本中抽取关键词,以及对敏感词进行识别。

C语言“引用” 简化代码

zhencan的博客

04-02

730

#include

int main () {

char arr[10] = {"123"};

char k = 0;

char & a = arr[k];

k = 2;

a = '5';

printf("%c", a);

return 0;

}

unbutun的专栏 此人博客需要关注

Yasin Lee

07-11

5007

unbutun的专栏

ftrace和perf

今天没去参加吃喝玩乐,跑去加班,不过心情还是愉悦的,因为有收获。真是利器啊。

调试例子ftrace_demo.c

/*

* ftrace_demo.c

*/

#include

#include

#include

一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简

学习永无止境

06-21

3万+

有穷状态自动机(Finite Automata, FA)分为确定的和不确定的,简称为DFA和NFA。

确定有穷自动机(DFA)

形式定义:

表示形式为:

注意:终态是用两个圆圈表示的,图中的3号即为DFA的终态。

不确定的有穷自动机(NFA)

形式定义:

DFA与NFA的区别

DFA与NFA的区别在于,NFA的状态转换过程中可以有空串,如下图即为NFA。

这就导致了一个问题:开始之后,在给出字符a或b之前,我们能够确定当前是处于1状态还是2状态吗?很显然,我们是无法确定的,因此才被称为不确定的有穷自

敏感词过滤-DFA算法

许诗宇的博客

04-15

1万+

目录

DFA算法简介

Java实现DFA算法实现敏感词过滤

测试方法

创建DFAMap

根据DFAMap进行检验

完整代码

DFA算法简介

在实现文字过滤的算法中,DFA是唯一比较好的实现算法。DFA即Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过event和当前的state得到下一个state,即event+state=nextst...

基于DFA敏感词查询的算法简析

weixin_33743248的博客

10-14

853

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

项目中需要对敏感词做一个过滤,首先有几个方案可以选择:

a.直接将敏感词组织成String后,利用indexOf方法来查询。

b.传统的敏感词入库后SQL查询。

c.利用Lucene建立分词索引来查询。

d.利用DFA算法来进行。

首先,项目收集到的敏感词有几千...

DFA算法(敏感字屏蔽)

疯狂的程序员

03-18

1360

DFA算法

又称为有限状态机,是由一个树状结构实现(链表构建),每次匹配从根节点出发,遍历树查找,直到叶子节点结束。各个节点就好比各个状态一样,从上往下依次跳转。下面以敏感字查找替换为例,创建敏感词库树状结构如下:

结构图:<猪一样的队友,xxxxxxxx>

R -> |-->a

|-->b

|-->c

|-->d

DFA算法的实现与最小化

我飞故我在的专栏

03-24

4万+

有限自动机分为确定有限自动机(DFA)和不确定有限自动机(NFA),这里介绍DFA,即确定有限自动机。

1. DFA的形式定义

从形式上说,一个有限状态自动机可以用下面的5个参数来定义:

Q: 状态q0, q1, ... , qN的有限集合Σ: 有限的输入符号字母表q0: 初始状态F: 终极状态的集合, F∈Qδ(q, i): 状态之间的转移函数或转移矩阵。给定一个状态q∈Q和一个输入符

基于DFA算法实现的敏感词屏蔽

06-13

文件说明 dfa.py为源码 TestDFA.py为使用pytest进行运行性能测试 sensitive_words.txt为默认敏感词库 DfaApi.py为建立运行于web上的API接口 text_filter/string命令返回是否存在敏感词以及屏蔽后的字符串 add_new_...

基于java实现DFA算法代码实例

09-07

主要介绍了基于java实现DFA算法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

DFA算法敏感庞屏蔽java实现

01-06

DFA算法敏感庞屏蔽java实现DFA算法敏感庞屏蔽java实现

DFA算法实现敏感词过滤

09-27

已在项目中使用,绝对是你想要的,高效的DFA算法实现的敏感词过滤功能。

邵鹏元23354133.pdf

03-06

邵鹏元23354133.pdf

Swift 5.0中实现的设计模式.zip

最新发布

03-06

Swift 5.0中实现的设计模式.zip

人工智能-项目实践-信息管理系统-亿级别域名whois信息统计管理系统

03-06

亿级别域名whois信息统计管理系统

该系统主要用来统计分析域名WHOIS信息,后台使用Python的Tornado框架,前台使用Bootstrap/Ajax/JQuery/Highchars等框架来搭建。 通过使用MVC框架,使程序能够更清晰明了,同时方便编写代码.

前端使用以下内容

dataTables

font-awesome

layers

bootstrap

highcharts

highmaps

基于Spring Boot在线远程考试系统的设计与实现(毕业论文)

03-06

Java基于springboot的在线远程考试系统设计与实现

本次开发的在线远程考试系统实现了字典管理、试卷表管理、试题表管理、考试记录表管理、答题详情表管理、错题表管理、公告管理、用户管理、老师管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。

dfa敏感词过滤算法怎么实现

04-23

敏感词过滤算法可以分为基于规则的过滤算法和基于机器学习的过滤算法两种。

1. 基于规则的敏感词过滤算法

这种算法适合于敏感词列表较小的场景,它的实现步骤如下:

(1)将敏感词列表载入程序中,并按长度排序。

(2)遍历处理待检测的文本。

(3)对于每个字符作为开头的子串,从大到小遍历敏感词列表,查找对应的敏感词。

(4)如检测到敏感词,则进行敏感词替换或者标记等处理。

2. 基于机器学习的敏感词过滤算法

这种算法需要先进行模型训练,适用于敏感词列表较长且复杂的场景,实现步骤如下:

(1)收集大量的带有敏感词的文本数据,并进行标注。

(2)利用标注数据训练模型,得到敏感词分类器。

(3)读入待检测文本数据,利用分类器进行预测和处理。

以上是两种常用的敏感词过滤算法,具体应根据不同的场景和需求选择合适的算法实现。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

小小华bk

CSDN认证博客专家

CSDN认证企业博客

码龄7年

暂无认证

60

原创

6万+

周排名

143万+

总排名

44万+

访问

等级

4108

积分

81

粉丝

158

获赞

67

评论

516

收藏

私信

关注

热门文章

DFA算法的简单说明与案例实现

34578

MVC框架模式与SpringMVC框架

34568

jquery操作select(取值,设置选中)

24478

org.hibernate.ObjectNotFoundException: No row with the given identifier exists解决办法

24274

easyUI前端分页与后台分页总结

22511

分类专栏

MySQL

11篇

Java ee

8篇

Java SE

13篇

Drools

2篇

Tomcat问题

设计模式

json

jstl

javascript

6篇

nexus私服

SSM框架开发

3篇

网页安全

1篇

阿里云服务

eclipse基本配置问题

1篇

JAVA基础知识点

3篇

struts2

2篇

ueditor

GIT

1篇

Jquery

1篇

mybatis

2篇

Oracle

SWT设计

1篇

Hadoop

1篇

算法

1篇

SSH框架开发

2篇

Hibernate

3篇

Spring

5篇

Excel技术

EasyUI

4篇

EasyUI

1篇

poi

1篇

Linux

7篇

maven

1篇

微信开发

2篇

Redis

1篇

网络线程

1篇

优化

1篇

python

1篇

Spring Boot

9篇

微服务

3篇

SpringMVC

1篇

Dubbo

最新评论

The program ‘mysql’ can be found in the following packages:

姓柳:

https://blog.csdn.net/qq_24472235/article/details/100033837可以试试这个

Base64的编码原理

敲码使我快乐:

cn.hutool

hutool-all

foreach 循环里进行元素的 remove/add 操作注意点

Kumigami Kou:

讲的很好,很受用

org.hibernate.ObjectNotFoundException: No row with the given identifier exists解决办法

langhing on:

可是我这关联表里边确实存在对应的数据,为什么也报找不到的错呢

foreach 循环里进行元素的 remove/add 操作注意点

Wlong~:

感谢,十分有用

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

SpringBoot中异步注解@Async的使用以及注意事项

Spring Boot 集成Seata(fescar)实现分布式事务处理以及实现机制

Java中List,String,String[]之间进行转换

2020年1篇

2019年20篇

2018年36篇

2017年45篇

目录

目录

分类专栏

MySQL

11篇

Java ee

8篇

Java SE

13篇

Drools

2篇

Tomcat问题

设计模式

json

jstl

javascript

6篇

nexus私服

SSM框架开发

3篇

网页安全

1篇

阿里云服务

eclipse基本配置问题

1篇

JAVA基础知识点

3篇

struts2

2篇

ueditor

GIT

1篇

Jquery

1篇

mybatis

2篇

Oracle

SWT设计

1篇

Hadoop

1篇

算法

1篇

SSH框架开发

2篇

Hibernate

3篇

Spring

5篇

Excel技术

EasyUI

4篇

EasyUI

1篇

poi

1篇

Linux

7篇

maven

1篇

微信开发

2篇

Redis

1篇

网络线程

1篇

优化

1篇

python

1篇

Spring Boot

9篇

微服务

3篇

SpringMVC

1篇

Dubbo

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

DFA算法简单理解实现_dfa的特点-CSDN博客

>

DFA算法简单理解实现_dfa的特点-CSDN博客

DFA算法简单理解实现

最新推荐文章于 2024-03-04 18:10:26 发布

Pluto_/

最新推荐文章于 2024-03-04 18:10:26 发布

阅读量1.7k

收藏

3

点赞数

1

文章标签:

算法

java

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_44059948/article/details/119679581

版权

背景:因为最近项目要使用到敏感词过滤服务,在网上了解到dfa实现这个功能性能还不错,特此学习了一下

1. 什么是DFA算法

引用 简书作者:浪人与酒丶的解释 原文链接:https://www.jianshu.com/p/c67f917c9363

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。 确定:状态以及引起状态转换的事件都是可确定的,不存在“意外”。 有穷:状态以及事件的数量都是可穷举的。

2. DFA算法模型

state_event_dict = {

"匹": {

"配": {

"算": {

"法": {

"is_end": True

},

"is_end": False

},

"关": {

"键": {

"词": {

"is_end": True

},

"is_end": False

},

"is_end": False

},

"is_end": False

},

"is_end": False

},

"信": {

"息": {

"抽": {

"取": {

"is_end": True

},

"is_end": False

},

"is_end": False

},

"is_end": False

}

}

3. 通过java程序加载敏感词库,构建一个DFA算法模型

private static void addSensitiveWordToHashMap(Set keyWordSet) {

// 初始化HashMap对象并控制容器的大小

sensitiveWordMap = new HashMap(keyWordSet.size());

// 敏感词

String key = null;

// 用来按照相应的格式保存敏感词库数据

Map nowMap = null;

// 用来辅助构建敏感词库

Map newWorMap = null;

// 使用一个迭代器来循环敏感词集合

Iterator iterator = keyWordSet.iterator();

while (iterator.hasNext()) {

key = iterator.next();

nowMap = sensitiveWordMap;

for (int i = 0; i < key.length(); i++) {

// 截取敏感词当中的字,在敏感词库中字为HashMap对象的Key键值

char keyChar = key.charAt(i);

// 判断这个字是否存在于敏感词库中

Object wordMap = nowMap.get(keyChar);

if (wordMap != null) {

nowMap = (Map) wordMap;

} else {

newWorMap = new HashMap<>();

newWorMap.put("isEnd", "0");

nowMap.put(keyChar, newWorMap);

nowMap = newWorMap;

}

// 如果该字是当前敏感词的最后一个字,则标识为结尾字

if (i == key.length() - 1) {

nowMap.put("isEnd", "1");

}

}

}

}

至此我们的DFA算法已经实现,可继续开发我们的业务代码

优惠劵

Pluto_/

关注

关注

1

点赞

3

收藏

觉得还不错?

一键收藏

知道了

0

评论

DFA算法简单理解实现

背景:因为最近项目要使用到敏感词过滤服务,在网上了解到dfa实现这个功能性能还不错,特此学习了一下1. 什么是DFA算法引用 简书作者:浪人与酒丶的解释原文链接:https://www.jianshu.com/p/c67f917c9363DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不.

复制链接

扫一扫

基于DFA算法实现的敏感词屏蔽

06-13

dfa.py为源码 TestDFA.py为使用pytest进行运行性能测试 sensitive_words.txt为默认敏感词库 DfaApi.py为建立运行于web上的API接口 text_filter/string命令返回是否存在敏感词以及屏蔽后的字符串 add_new_words/...

dfa转正则表达式_正则表达式, NFA, DFA, AC多模匹配算法(转) | 果子DO IT

weixin_39826971的博客

12-21

534

正则表达式引擎所使用的两种基本技术:非确定型有穷自动机(NFA)和确定型有穷自动机(DFA)。NFA是基于表达式的(Regex-Directed),去匹对相配文档(文档作为有穷字母表Σ),而DFA是基于文本的(Text-Directed),去匹对相配正则表达式。目前的主流正则引擎又分为3类:一、DFA,二、传统型NFA,三、POSIX NFA。DFA:DFA 引擎在线性时状态下执行,因为它们不要求...

参与评论

您还未登录,请先

登录

后发表或查看评论

编译原理关于NFA到DFA的转换

yongqian的博客

09-26

1882

有穷自动机(FA)

特点:具有一系列离散的输入输出信息和有穷数目的内部状态。

FA的典型例子:–》电梯控制装置

输入:顾客的乘梯需求

状态:向上上下去几楼

转换图:

FA的最长匹配原则(贪婪匹配):

FA的分类:

确定有限自动机 (DFA)

非确定有限自动机(NFA)

DFA:

节点和边 类似于图 和矩阵

构造一个DFA

转换表

NFA

特点:

1.主要在于后继状态可有多个

2.DFA是NFA的子集

两自动机等价

对于一个不确定的有限自动机,就存在一个确定的有限自动机与之对应。或者有一个

有穷自动机 DFA(确定)和NFA(不确定)

m0_53345417的博客

09-11

4035

在状态转换图中开始的状态是需要有一个箭头指向的,终止的状态是一个双圈的。有穷自动机分为DFA和NFA两种。分别位确定的和不确定的两种形式。一个确定的有穷自动机是一个五元组 M=(K,中一 个不同的输入字符做标记。个输入字符,则状态转换 图有。个结点,每个结点至多有。条箭弧射出,每条箭弧用。

DFA 算法

热门推荐

温染的笔记

05-03

5万+

DFA算法的简单介绍以及DFA算法在关键词匹配中的应用,如何简单地使用 Python 3.X 去实现 DFA 算法,来帮助我们从文本中抽取关键词,以及对敏感词进行识别。

算法总结:DFA(自动机)算法是什么,怎么用

dauiwsbd的博客

07-31

5319

算法总结:高手们常说的DFA(自动机)算法是什么简介一:从一个C++语言程序开始1.基础C语言解法2.DFA(自动机)算法思想3.自动机编程题解二:Leetcode实战注

简介

自动机编程(英语:Automata-based programming)

是编程典范中的一种,是指程式或其中的部份是以有限状态机(FSM)为模型的程式,有些程式则会用其他型式(也更复杂)的自动机为其模型。自动机程序在每个时刻有一个状态 s,每次经过一个行动 f,转移到下一个状态 s’。这样,只需要建立一个覆盖所有情况的从 s 与 f

争取能让大家都能看懂的 DFA 算法

写代码的大胖

03-30

9582

为什么要学习这个算法

我们公司一直都有的一个敏感词检测服务,前一段时间遇到了瓶颈,因为词库太多了导致会有一些速度过慢,而且一个正则表达式已经放不下了,需要进行拆分正则才可以。

正好我以前看过有关 dfa 的介绍,但是并没有深入的进行研究,所以就趁着周末好好的了解一下这个东西。跟 php 的正则进行一下对比,看看速度如何,如果表现较好,说不定还能用得上。

什么是 dfa

通过百度可以知道 dfa 是...

基于DFA敏感词查询的算法简析

weixin_33743248的博客

10-14

853

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

项目中需要对敏感词做一个过滤,首先有几个方案可以选择:

a.直接将敏感词组织成String后,利用indexOf方法来查询。

b.传统的敏感词入库后SQL查询。

c.利用Lucene建立分词索引来查询。

d.利用DFA算法来进行。

首先,项目收集到的敏感词有几千...

java利用DFA算法实现敏感词过滤功能

08-30

在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和...下面这篇文章主要给大家介绍了关于java利用DFA算法实现敏感词过滤功能的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。

基于java实现DFA算法代码实例

09-07

主要介绍了基于java实现DFA算法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

DFA算法实现敏感词过滤

09-27

已在项目中使用,绝对是你想要的,高效的DFA算法实现的敏感词过滤功能。

DFA算法敏感庞屏蔽java实现

01-06

DFA算法敏感庞屏蔽java实现DFA算法敏感庞屏蔽java实现

java配置多个过滤器优先级以及几个常用过滤器

WoddenFish的博客

12-05

6241

        一个项目中不出意外的话会有两个以上的过滤器,但是直接不配置的话他会按照你的过滤器名字排序执行,这样的话可能会导致一些性能上或者逻辑上的问题。那么,控制一下执行顺序是我们所必须要做的。

        java封装了一个FilterRegistrationBean对象,可以把他比作一个容器,将过滤器套入这个对象中,可以对这个对象进行优先级设置、过滤规则设置等属性,下面是几个常用的过...

[转*摘要*总结]敏感词过滤的算法原理之DFA算法

doctorvian的博客

06-12

1203

敏感词、文字过滤是一个网站必不可少的功能,过滤的关键是用户输入内容与敏感字库的匹配。

对于字符串匹配,一般的方法是字符串子串包含判断、正则表达式判断,但对于用户输入的大量内容,它们的效率是非常低的。Google和百度搜索文字过滤算法时我找到了一个比较好的算法DFA算法。

实际项目中,对于整句的匹配我们采用的仍是正则表达式,因为整句词库比较少;对于单词屏蔽,我们采用的是DFA算法来处理,因为单词字库是万级以上的,DFA算法简单高效。

编译原理——DFA的编程实现

blackier的博客

03-19

3万+

前言:这是我学习编译原理,课程实验的内容,课程早已结束,现整理发表。

一、实验任务

编写一个C语言程序,模拟实现DFA识别字符串的过程。

二、实验内容

DFA的输入;

DFA的存储与读写;

DFA的正确性检查;

DFA的语言集列表显示;

DFA的规则字符串判定;

三、内容说明

DFA的输入:

分别输入DFA的“字符集”、“状态集”、“开始状态”、“接...

敏感词管理(DFA算法实现)

xn_xy19的博客

09-25

1009

我们在完成一些文章发布的功能是,可以使用第三方工具如阿里云的内容安全来进行文章的审核,但是这个第三方接口并不能过滤一些敏感词,因此我们需要自己维护一套关键词

DFA的实现

whinah的专栏

09-05

8495

DFA的实现

在工业界,DFA的有效实现一直是一个问题,龙书中提到了一种使用四个数组的通用DFA实现,在汉字分词算法中经常用到double array作为Trie的一种实现。四数组的是通用DFA的实现,双数组的仅能用于实现Trie。并且它们的创建速度慢,难以理解,内存占用也比较多,状态id的值域范围稀疏。

我的实现

我实现了一种很紧凑的DFA,这在某种程度上源于popcount带来的灵感。当

dfa算法(dfa算法)

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。

02-25

1830

dfa和nfa的基本概念及其区别?

基本概念:

1. 确定有限自动机(Deterministic Finite Automaton) 简称DFA。dfa是匹配速度,是确定的。

2. 非确定有限自动机(Nondeterministic Finite Automaton) 简称NFA,nfa是匹配结果,是不确定的。

1...

代码随想录算法训练营(动态规划10,11 ,12 股票问题)| 121. 买卖股票的最佳时机 & 122.买卖股票的最佳时机II

最新发布

he979731102的博客

03-04

473

动态规划10,11, 12 股票问题)| 121. 买卖股票的最佳时机 & 122.买卖股票的最佳时机II

dfa敏感词过滤算法怎么实现

04-23

敏感词过滤算法可以分为基于规则的过滤算法和基于机器学习的过滤算法两种。

1. 基于规则的敏感词过滤算法

这种算法适合于敏感词列表较小的场景,它的实现步骤如下:

(1)将敏感词列表载入程序中,并按长度排序。

(2)遍历处理待检测的文本。

(3)对于每个字符作为开头的子串,从大到小遍历敏感词列表,查找对应的敏感词。

(4)如检测到敏感词,则进行敏感词替换或者标记等处理。

2. 基于机器学习的敏感词过滤算法

这种算法需要先进行模型训练,适用于敏感词列表较长且复杂的场景,实现步骤如下:

(1)收集大量的带有敏感词的文本数据,并进行标注。

(2)利用标注数据训练模型,得到敏感词分类器。

(3)读入待检测文本数据,利用分类器进行预测和处理。

以上是两种常用的敏感词过滤算法,具体应根据不同的场景和需求选择合适的算法实现。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

Pluto_/

CSDN认证博客专家

CSDN认证企业博客

码龄5年

暂无认证

17

原创

24万+

周排名

165万+

总排名

3万+

访问

等级

257

积分

16

粉丝

26

获赞

37

评论

84

收藏

私信

关注

热门文章

中国移动云mas短信对接(http)

13022

中国移动云mas短信对接(webservice)

4055

java基于easypoi实现对导出的excel文档加密

4038

c基于easyx做的一个简易五子棋

2469

mysql配合java代码按每两小时为一个时间区间统计数据

2131

分类专栏

java

5篇

mysql

2篇

linux

2篇

算法

1篇

最新评论

java基于easypoi实现对导出的excel文档加密

抄抄狗全家升天:

MapExcelConstants.PASSWORD这个没有呀

java基于easypoi实现对导出的excel文档加密

范亚明:

workbook是怎么来的

中国移动云mas短信对接(http)

离开浪浪山i:

找到问题了,协议没选对

中国移动云mas短信对接(http)

离开浪浪山i:

集团名称,账号密码写对了但还是报{"msgGroup":"","rspcod":"InvalidUsrOrPwd","success":false}

mysql配合java代码按每两小时为一个时间区间统计数据

小小码农>>>>:

24时不是00时吗 统计的时候就有问题了

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

mysql执行计划

java基于easypoi实现对导出的excel文档加密

java bdo9ll坐标系转gc102坐标系,及高德根据经纬度逆向物理地址

2022年3篇

2021年11篇

2020年2篇

2019年1篇

目录

目录

分类专栏

java

5篇

mysql

2篇

linux

2篇

算法

1篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简-CSDN博客

>

一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简-CSDN博客

一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简

最新推荐文章于 2023-06-12 20:41:04 发布

花无凋零之时

最新推荐文章于 2023-06-12 20:41:04 发布

阅读量3.3w

收藏

286

点赞数

47

分类专栏:

编译原理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_55267022/article/details/118082886

版权

编译原理

专栏收录该内容

14 篇文章

25 订阅

订阅专栏

有穷状态自动机(Finite Automata, FA)分为确定的和不确定的,简称为DFA和NFA。

确定有穷自动机(DFA)

形式定义: 表示形式为:

注意:终态是用两个圆圈表示的,图中的3号即为DFA的终态。

不确定的有穷自动机(NFA)

形式定义:

DFA与NFA的区别

DFA与NFA的区别在于,NFA的状态转换过程中可以有空串,如下图即为NFA。

这就导致了一个问题:开始之后,在给出字符a或b之前,我们能够确定当前是处于1状态还是2状态吗?很显然,我们是无法确定的,因此才被称为不确定的有穷自动机,因为空串的存在,我们无法确定当前的具体状态是什么。

所以NFA的不确定表现我们可以概括为:

多值映射带空转移

因此在很多时候,我们都需要将NFA转换为DFA。

NFA转换为DFA

理论准备:

定义1的意思便是,在当前状态下,我们首先将当前状态以及经过空串能够到达的状态放到一起组成一个闭包。

定义2的意思便是,将该闭包中的每个状态,都加上一个确定的输入,如外界输入一个a,从而进入到新的状态,再将这些新的状态以及这些新的状态加上空串能够到达的状态放到一起组成一个新的闭包。

对于正规式 : 其对应的NFA为:

则经过确定化可以得到如下表格: 以第一行为例,一开始的起始状态为X,经过空串能够到达的状态有5和1,因此第一个闭包为{X, 5, 1},然后输入一个a,则X输入a,没有任何新的状态,5输入a还是5,1输入a进入到3,又因为5经过空串可以到达1,因此输入一个a得到的新的闭包为{5, 3, 1},同理可得输入一个b得到的新的闭包。然后后面再将得到的新的闭包作为一个状态,根据输入a或b又得到新的闭包,以此往复,直至再没有新的闭包产生为止。

经过确定化处理之后,我们可以发现,已经没有空串了,每个状态都是确定的。

然后对表格进行重新编号: 最后便是画出状态转换图:

到这里,转换过程便是结束了,可以发现的是,对于原来的正规式,转换成NFA之后,我们还是能够马上看出其要表达的意思,但是转换成DFA之后,整个问题就变的很抽象了,完全就不知道其对应的正规式是什么了,因此这也是DFA的一个缺点吧。

DFA的化简

等价状态:若分别从状态 s 和 t 出发而停于终态能读出同一个串α,则称s, t 为等价状态;反之则称为可区别状态。

其中,终态与非终态一定是可区别的。

以下图DFA为例:

则首先状态集S={0, 1, 2, 3, 4, 5, 6}可以分为S1={0, 1, 2}和S2={3, 4, 5, 6}

那么对于S1,0,1,2是可区别的吗?

由于0状态下输入a进入状态1,输入b进入状态2;1状态输入a进入终态3,输入b进入状态2;2状态输入a进入状态1,输入b进入终态4。

可以发现,0,1,2状态进入终态的路径集合都不相同,因此相互之间都是可区别的。

对于S2,由于3,4,5,6状态输入a,b都能够直接进入到终态,即进入终态的路径集合都是一样的,因此是等价状态。

综上所述,S最终可以被分割为(0)S11={0},(1)S12={1},(2)S13={2}以及(3)S2={3, 4, 5, 6},DFA简化为:

优惠劵

花无凋零之时

关注

关注

47

点赞

286

收藏

觉得还不错?

一键收藏

打赏

知道了

4

评论

一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简

有穷状态自动机(Finite Automata, FA)分为确定的和不确定的,简称为DFA和NFA。确定有穷自动机(DFA)形式定义:表示形式为:注意:终态是用两个圆圈表示的,图中的3号即为DFA的终态。不确定的有穷自动机(NFA)形式定义:DFA与NFA的区别DFA与NFA的区别在于,NFA的状态转换过程中可以有空串,如下图即为NFA。这就导致了一个问题:开始之后,在给出字符a或b之前,我们能够确定当前是处于1状态还是2状态吗?很显然,我们是无法确定的,因此才被称为不确定的有穷自

复制链接

扫一扫

专栏目录

自动机DFA与NFA转化和最下化的代码实现软件

12-07

自动机DFA与NFA转化和最下化的代码实现软件,相信对大家研究自动机有好处。

编译原理阅读笔记

zzz_781111的专栏

02-15

1692

1.用于我们常常要编写 命令行解释程序,编译器的工作原理有点类似于此,因此掌握编译原理很有意义

2.基础:自动机原理

3.汇编语言的编写依赖于特定的机器。所以需要编译程序,来分离物理设备,和编程语言。

4.硬件-fortran编译器-fortran语言

5.上下文无关文法

【在机器翻译系统中

P=“capital of China” 如何翻译?

中国的首都(北京) 或 瓷都(景德镇)

4 条评论

您还未登录,请先

登录

后发表或查看评论

【编译原理实验】NFA确定化与DFA最小化

10-12

本资源为一个src文件夹,有四个package:

1. Beans:NFA的DFA类

2.Utils:用于输入和输出的工具类

3.Service:核心代码。提供了确定化和最小化的代码实现

4.Test:可直接运行、测试(并且提供测试样例)

编译原理中有穷自动机DFA是什么?

最新发布

公众号:风景邮递Yuan的博客

06-12

1605

DFA(Deterministic Finite Automaton,确定有限状态自动机)是一个五元组,包括:1. 状态集合(Q):有限个状态的集合。2. 输入字母表(Σ):有限个输入符号的集合。3. 状态转移函数(δ):从一个状态经过一个输入符号到达另一个状态的函数。4. 初始状态(q0):一个初始状态,它是Q中的一个元素。5. 终止状态集合(F):一个终止状态集合,它是Q中的一个子集。其中,状态转移函数δ的定义为:δ: Q × Σ → Q,即从一个状态和一个输入符号映射到另一个状态。

对NFA和DFA的认识

weixin_44863759的博客

12-31

6694

构造下列正规式相应的DFA

NFA与DFA的区别:

区别: 在某种状态下,当面临同一个输入符时存在不止一个状态转换,即允许进入多于一个的状态集合

格式: , 其中

S表示非空的有限状态集

Σ是非空的输入字母表

T是转移函数(在NFA中结果是一个状态的集合,在DFA中是多个状态的集合)

s0是唯一的起始状态

F∈S,是非空的终结状态

例题P64 1

(1) 1(0|1) *101

(2) 1(1010*|1(010)*1) *0

(3) a((a|b)|aba)*

编译原理(第二章3--DFA最小化&双层case和表驱动法)

柳牧文的博客

05-14

2033

通过第二章2小节的介绍,我们已经实现了由正则表达式到NFA,NFA到DFA的转化。现在我们手里拿着DFA,下一步应该是构建程序了。确实如此,但是这里为什么要引入DFA最小化呢?这是因为前面我们通过子集法构建的DFA存在冗余的状态。举个例子,对于a* 来说,我们可以构建如下两个DFA:显然,我们更倾向于第二个状态更少的DFA,因为这样我们可以简化我们的程序(状态越多,程序就越会复杂)。因此我们给出最小化的定义如下:寻找一个状态数比M少的DFA M’,使得L(M)=L(M’)

DFA 算法

热门推荐

温染的笔记

05-03

5万+

DFA算法的简单介绍以及DFA算法在关键词匹配中的应用,如何简单地使用 Python 3.X 去实现 DFA 算法,来帮助我们从文本中抽取关键词,以及对敏感词进行识别。

NFA 和 DFA

小菜吉的博客

03-26

5402

作为前端大佬的你,想必对于 JavaScript 的正则表达式非常熟悉了,甚至随手就能利用正则表达式写出一些惊世骇俗的代码。只是不知道你是否有和我一样的疑惑:正则表达式是怎么执行的呢?

我们写下这样的正则表达式 (a+|b)c,然后用它来匹配字符串 aacde、abcde,这是怎样的一个过程呢?

前段时间,我试着去查找、学习相关的资料,然后知道了以下的内容:

目前正则表达式引擎主要有两种:NFA 和 DFA

JavaScript 采用的是 NFA 引擎

那么 NFA 又是啥,跟 DFA 有什么不同?

敏感词过滤-DFA算法

许诗宇的博客

04-15

1万+

目录

DFA算法简介

Java实现DFA算法实现敏感词过滤

测试方法

创建DFAMap

根据DFAMap进行检验

完整代码

DFA算法简介

在实现文字过滤的算法中,DFA是唯一比较好的实现算法。DFA即Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过event和当前的state得到下一个state,即event+state=nextst...

算法总结:DFA(自动机)算法是什么,怎么用

dauiwsbd的博客

07-31

5319

算法总结:高手们常说的DFA(自动机)算法是什么简介一:从一个C++语言程序开始1.基础C语言解法2.DFA(自动机)算法思想3.自动机编程题解二:Leetcode实战注

简介

自动机编程(英语:Automata-based programming)

是编程典范中的一种,是指程式或其中的部份是以有限状态机(FSM)为模型的程式,有些程式则会用其他型式(也更复杂)的自动机为其模型。自动机程序在每个时刻有一个状态 s,每次经过一个行动 f,转移到下一个状态 s’。这样,只需要建立一个覆盖所有情况的从 s 与 f

NFA和DFA的区别

Kagamigawa Noelle

05-09

3万+

整理自课本1。

DFA例子

使用JFLAP软件画图。

NFA例子

区别

对于字母表中的每个符号,DFA中的每个状态都有且只有一条关于这个符号的出边(exiting transition)。NFA则未必,可能有零条、一条甚至多条。

DFA的转换箭头上的标签必须是字母表中的,但NFA可以有标识为ϵ\epsilonϵ的边,NFA的状态可能有零条、一条甚至多条ϵ\epsilonϵ边。

Int...

词法程序设计——DFA模拟程序

05-11

1. 实验内容

1、定义一个右线性正规文法,示例如(仅供参考)

G[S]:S→aU|bV| U→bV|aQ

V→aU|bQ Q→aQ|bQ|e

实验前要考虑清楚用哪种数据结构存储上述文法。

2、构造其有穷确定自动机,如

3、利用有穷确定自动机M=(K,Σ,f, S,Z)行为模拟程序算法,来对于任意给定的串,若属于该语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”。

K:=S;

c:=getchar;

while ceof do

{K:=f(K,c);

c:=getchar; };

if K is in Z then return (‘yes’)

else return (‘no’)

2. 实验设计分析

2.1 实验设计思路

根据实验指导书和书本上的相关知识,实现算法。

2.2 实验算法

(1)输入正规文法。RG到FA

(2)将NFA化为DFA

(3)输入一个字符串判断是否符合文法。

①最开始记A为开始状态a为第一个字符。

②然后A经过字符a到达下一个状态记为B,A状态指向B状态,a指向字符串的下一个字符。

③循环②步直到B状态为终态时停止则该字符串符合该文法或a指向最后一个字符时都没到终态停止则该字符窜不符合该文法。

2.3 实验流程

①预习实验,实验前阅读实验指导书和阅读书本。

②通过书本了解判断文法的原理。首先在纸上模拟文法的判断过程。

③上机实现模拟过程。

④调试程序,知道能得到预期的结果。

2.4 实验的基本技术设计方案

(用到哪些技术,包括编译原理中,程序设计中,离散数学中等的哪些技术)

①java的基础语法。

②数据结构里的结构体及简单算法。

③编译原理的理论知识。

④运用了java里的一些集合类。

2.5 数据结构

class edge {

char PriorityState;

char ch;

char NextState;

edge(char p,char c, char n){

PriorityState = p;

ch = c;

NextState = n;

}

@Override

public String toString() {

return "edge [PriorityState=" + PriorityState + ", ch=" + ch + ", NextState=" + NextState + "]";

}

}

2.6 实验输入输出

2.7 实验设计语言

Java语言。

3. 实验主要源代码及分析说明

nfa-to-dfa.rar_DFA_DFA NFA_nfa-dfa_visual c_有穷自动机

09-21

编译实验,实线有穷自动机,nfa到dfa

BUPT 自动机实验,NFA转化DFA

05-15

BUPT 自动机实验,NFA转化DFA,java代码加实验报告

编译原理实验-不确定有穷状态自动机的确定化(NFA到DFA)

06-22

输入:非确定有穷状态自动机NFA 输出:确定化的有穷状态自动机DFA

NFA-DFA.rar_DFA自动转换机_NFA DFA

09-22

不确定的有穷自动机转化为确定的有穷自动机的转换算法及实现

自动机:用于模拟有限自动机(DFA,NFA和ε-NFA)和正则表达式的库和Web应用程序

02-24

一个用于模拟有限自动机(DFA,NFA和ε-NFA)和正则表达式的库和Web应用程序。 该项目是旨在帮助学生的工具解决了解CTH的 / 课程的测验和作业。 但是任何对自动机感兴趣的人都可以使用。 欢迎捐款! 如果发现错误...

nfa_dfa.rar_DFA_NFA DFA _NFA DFA_automata_nfa

09-23

求正规表达式到NFA(不确定的有限自动机),NFA到DFA及DFA(有限自动机)的最小化 有注释。

NFAtoDFA.rar_DFA_NFA DFA_NFA to DFA_nfa

09-20

内容:自动机编程,NFA转换DFA程序,将输入的NFA转换为DFA

子集构造法nfa转换成dfa

04-18

好的,关于子集构造法,这是一种将非确定有限状态自动机(NFA)转换为确定有限状态自动机(DFA)的方法。它将NFA中的每个可能状态集合转换为DFA中的唯一状态。通过这种转换,可以将NFA转换为等效但更快速的DFA。具体实现可以考虑将每个NFA状态对应的DFA状态定义为NFA状态的ε闭包,也可以使用算法来计算子集构造。希望这个回答能够对您有所帮助。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

花无凋零之时

CSDN认证博客专家

CSDN认证企业博客

码龄3年

暂无认证

226

原创

4万+

周排名

62万+

总排名

78万+

访问

等级

3461

积分

160

粉丝

664

获赞

88

评论

3397

收藏

私信

关注

热门文章

Python中KeyError: 的解决方法

109308

Python中出现TypeError: ‘int‘ object is not iterable的解决方法

60243

一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简

33783

8254芯片详解——6种工作方式、命令字、计数初值的计算

22355

Python中对字典根据value进行排序

21806

分类专栏

wsl

2篇

刷题笔记

86篇

C/C++

12篇

算法和数据结构

20篇

pytorch

1篇

LaTeX

1篇

最短路径

6篇

贪心算法

7篇

动态规划

24篇

GNN学习笔记

1篇

Python

33篇

人工智能

6篇

Pygame

15篇

计算机网络

12篇

编译原理

14篇

Java

3篇

数据库

15篇

软件工程

11篇

硬件知识

3篇

IDE相关

11篇

其他

1篇

Linux

7篇

Typora

2篇

最新评论

Python中scipy库对mat文件进行读写操作

牛奶浴花生:

大佬,如果我们要处理的数据集非常大,print打印出来的数据会有省略,然而我们需要其非省略状态下的数据,请问这个问题如何解决。

编译原理实验十:语义分析构造能处理完整程序的递归下降翻译器

孤寒_imbzz:

就测试用例能跑,随便加个变量都跑不了

C++常用STL库详细总结

qq_201558749:

lower_bound那里是不是误写了

Anaconda中安装指定版本的tensorflow1.14.0

️之!:

ERROR: tensorflow-1.14.0-cp37-cp37m-win_amd64.whl is not a supported wheel on this platform

出现这个问题怎么解决

DFS(深度优先搜索)的递归与非递归

花无凋零之时:

没问题,你在while之前的输出,其实就是对应的while里面的那段输出逻辑,我这里应该是之前写错了

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

wsl的图像化实现,在wsl中启动浏览器

Windows下WSL Ubuntu中登录root账号的密码

在PyCharm中分别实现在run窗口运行和在Python with Console窗口运行

2023年3篇

2022年153篇

2021年82篇

目录

目录

分类专栏

wsl

2篇

刷题笔记

86篇

C/C++

12篇

算法和数据结构

20篇

pytorch

1篇

LaTeX

1篇

最短路径

6篇

贪心算法

7篇

动态规划

24篇

GNN学习笔记

1篇

Python

33篇

人工智能

6篇

Pygame

15篇

计算机网络

12篇

编译原理

14篇

Java

3篇

数据库

15篇

软件工程

11篇

硬件知识

3篇

IDE相关

11篇

其他

1篇

Linux

7篇

Typora

2篇

目录

评论 4

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

打赏作者

花无凋零之时

你的鼓励将是我创作的最大动力

¥1

¥2

¥4

¥6

¥10

¥20

扫码支付:¥1

获取中

扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

会员登录 - 企查查

会员登录 - 企查查