String 词搜索算法matlab

String 词搜索算法matlab,string,algorithm,matlab,word,String,Algorithm,Matlab,Word,我正在寻找一个有效的单词搜索算法。如果你能帮我想出来,那就更好了 a h c k x r j i b v t l c y q s 我想找到“艺术”。如果‘stra’也是一个有效的词,我希望也能找到它。(垂直、水平、对角和反向)。我提出了一些算法,但它们似乎效率不高,而且需要花费很长的代码。第一个包括使用find()获取第一个字母并查看该列或行 这里有一种方法: %// Example word grid C = [ 'a' 'h' 'c' 'k' 'r' 'x' 'r' 'j

我正在寻找一个有效的单词搜索算法。如果你能帮我想出来,那就更好了

a h c k 
x r j i
b v t l
c y q s
我想找到“艺术”。如果‘stra’也是一个有效的词,我希望也能找到它。(垂直、水平、对角和反向)。我提出了一些算法,但它们似乎效率不高,而且需要花费很长的代码。第一个包括使用find()获取第一个字母并查看该列或行

这里有一种方法:

%// Example word grid
C = [
    'a' 'h' 'c' 'k' 'r'
    'x' 'r' 'j' 'i' 'p'
    'b' 'v' 't' 'l' 'q'
    'a' 'y' 'q' 's' 'o'];

%// Your search term
target = 'arts';

%// Optionally, do some obvious checks here. 
%//  - length of the search string may exceeds the grid's dimensions
%//  - there are no matches for the first letter
%//  - and similar

%// Form single cellstring containing all search directions
allDirections = [
    %{
    // horizontal, horizontal-reversed
    %}
    cellstr([C ; C(:,end:-1:1)])
    %{
    // vertical, vertical-reversed
    %}
    cellstr([C'; C(:,end:-1:1)']) 
    %{
    // Diagonal, top-left to bottom-right, and reversed
    %}
    arrayfun(@(ii){diag(C,ii)'}, -size(C,1)+2:size(C,2)-2)';
    arrayfun(@(ii){diag(C(end:-1:1,end:-1:1),ii)'}, -size(C,1)+2:size(C,2)-2)';
    %{
    // Diagonal, top-right to bottom-left, and reversed
    %}
    arrayfun(@(ii){diag(C(:,end:-1:1),ii)'}, -size(C,1)+2:size(C,2)-2)';
    arrayfun(@(ii){diag(C(end:-1:1,:),ii)'}, -size(C,1)+2:size(C,2)-2)';
];

%// And now just find the string
strfind(allDirections , target)
当然,你可以通过以下方法来提高(记忆)效率

  • 在所有方向上分别执行
    strfind
  • 在同一方向上执行2×
    strfind
    ,但将
    目标
    倒置
  • 等等
但是,除了这些相对较小的优化之外,我认为在实践中,您在MATLAB中做得不会更好

理论上更有效的递归、分支和绑定类型搜索大致如下所示:

  • 查找所有出现的第一个字母
  • 根据网格的尺寸,消除所有不能满足
    目标长度的引用
  • 搜索所有命中的邻域以查找第二个字母
  • 消除基于长度等的引用
(别忘了在第二个字母后过滤方向,因为第二个字母的点击会确定搜索方向)

据我所知,这将需要比我的版本少得多的阅读和比较。然而,我的猜测是,使用固定例程(正如我所做的)将比使用(嵌套)循环更快、更简单。但我可能错了


试试看。轮廓学习。微笑。纠正我:)

展示你迄今为止所做的尝试。这是一项大学作业,对吗?你的两位同事以前来过这里。先读,然后读,最后读。如果你还有问题,告诉我们你到底在哪里被卡住了。我不会被水平或垂直搜索卡住。正如我在问题示例中所说的那样,我被困在对角线上。我想知道我是否必须提取整个对角线并使用strfind,或者有没有更有效的方法。首先展示一下你拥有的那几个算法以及它们花费了多少时间,否则很难指出改进的地方。请记住,只有(N+M-1)*2条对角线需要在两个方向上进行计算。我无法想象它们有那么难提取。可能是尼斯方法的复制品!但是很难说这个词在最初的矩阵中是从哪里开始的,不是吗?据我所知,从类似的问题来看,一个词可能会出现好几次。而且,当你把所有的东西连接起来时,如果在两行上有一个“无效”字,会发生什么,比如:C=[ar;ts];它将被您的算法检测到,但不正确。我说得对吗?@thewaywewalk:(a)这是真的,尽管很容易推断出命中的位置,因为你知道
所有方向中的哪个行与哪个行/列/方向相对应。(b) 不,我连接的是整行字符,而不是单个字符。只需打印
allDirections
即可了解我的意思。该
单元格中的每个条目都是符合OP规则的有效字符串。