先读我,一分钟了解算法原理

这是一个文本中同时查找多个字符串的项目

讨论代码在第340行(文件StringSet.cpp中)

帖子Normangen » 2015-05-13 14:28

前面说了,状态86相当于告诉状态机:找以字符w开头的单词……
现在又输入一个字符h,那就等于告诉状态机:找以wh开头的单词……
因为单词表中存在单词what,所以也会进入新状态,在这个状态下,状态机期待接收的是字符 a 。
进入的新状态的值是87。
GTalkabout 写道:Click to open by GTalkabout: 4d55d3c0-f939-11e4-ab2b-1aee658114e8
图片
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

讨论代码在第323行(文件StringSet.cpp中)

帖子Normangen » 2015-05-13 14:30

在有限状态机中找当前状态下(87),输入字符 i 的entry
GTalkabout 写道:Click to open by GTalkabout: 9364179e-f939-11e4-8e66-1aee658114e8
图片
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

讨论代码在第340行(文件StringSet.cpp中)

帖子Normangen » 2015-05-13 14:33

状态87下只有输入字符 a 才会进入新状态。因为单词表中以wh开头的只有what。
那么输入字符 i 会使当前状态重置为 0。
GTalkabout 写道:Click to open by GTalkabout: 044f4200-f93a-11e4-ba38-1aee658114e8
图片
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

讨论代码在第345行(文件StringSet.cpp中)

帖子Normangen » 2015-05-13 14:42

跳过单词white剩余部分,因为已经没必要再找了。
GTalkabout 写道:Click to open by GTalkabout: 2d2c1d4f-f93b-11e4-b49c-b8ee658114e8
图片
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

用极客讨论器讨论代码

帖子Normangen » 2015-05-13 14:44

上面找了两个单词,a和white,都以失败告终。接下来我们看一单词fox的查找过程。
GTalkabout 写道:Click to open by GTalkabout: 8bc66821-f93b-11e4-9ba0-b8ee658114e8
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

讨论代码在第340行(文件StringSet.cpp中)

帖子Normangen » 2015-05-13 15:17

省略中间的若干步骤:
状态 0 下输入字符 f 进入状态 12
状态 12 下输入字符 o 进入状态 13……
GTalkabout 写道:Click to open by GTalkabout: 1aede921-f940-11e4-98bb-b8ee658114e8
图片
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

讨论代码在第323行(文件StringSet.cpp中)

帖子Normangen » 2015-05-13 15:18

在有限状态机中找当前状态下(13),输入字符 x 的entry
GTalkabout 写道:Click to open by GTalkabout: 477ac98f-f940-11e4-b24f-b8ee658114e8
图片
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

讨论代码在第327行(文件StringSet.cpp中)

帖子Normangen » 2015-05-13 15:23

找到的这个entry,它的状态值是14,但是此时它的状态值已经不重要了,因为它的另一个成员m_dwIndex不再是0,而是4。
GTalkabout 写道:Click to open by GTalkabout: 025df51e-f941-11e4-a8d4-b8ee658114e8
图片
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

讨论代码在第333行(文件StringSet.cpp中)

帖子Normangen » 2015-05-13 15:27

这个4表示它是单词表中第四个单词,也就是fox。
它是 1 序而不是 0 序的,因为 0 表示没有找到单词。所以将它从entry中提取出来要减去一。
GTalkabout 写道:Click to open by GTalkabout: 91d14900-f941-11e4-831d-b8ee658114e8
图片
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

讨论代码在第337行(文件StringSet.cpp中)

帖子Normangen » 2015-05-13 16:01

找到单词fox,退出循环。
GTalkabout 写道:Click to open by GTalkabout: 3638b32e-f946-11e4-8de9-b8ee658114e8
图片
头像
Normangen
 
帖子: 20
注册: 2015-04-05 20:49

上一页

回到 Normangen 的项目

在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客

cron