【问题标题】:word search algorithm matlab [closed]单词搜索算法matlab [关闭]
【发布时间】:2013-12-13 12:28:25
【问题描述】:

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

a h c k 
x r j i
b v t l
c y q s

我想找到“艺术”。如果“stra”也是一个有效的词,我也希望能找到它。 (垂直、水平、对角线和反向)。我想出了一些算法,但你似乎效率不高,而且编码时间很长。第一个包括使用 find() 获取第一个字母并查看该列或行。

【问题讨论】:

  • 显示你迄今为止尝试过的内容。
  • 这是大学作业,对吧?你的两个同事以前来过这里。首先阅读here,然后阅读here,最后阅读here。如果您仍有疑问,请告诉我们您遇到的具体问题。
  • 我没有卡在水平或垂直搜索上。正如我在问题示例中所说,我被困在对角线上。我想知道是否必须提取整个对角线并使用 strfind 或者是否有更有效的方法。
  • 先展示你拥有的那几个算法以及它们消耗了多少时间,否则很难指出改进。请记住,只有 (N+M-1)*2 个对角线需要在两个方向上进行评估。我无法想象它们如此难以提取。

标签: string algorithm matlab word


【解决方案1】:

这是一种方法:

%// 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,但 target 倒置
  • 等。

但除了这些相对较小的优化之外,我认为您在 MATLAB在实践中可以做得更好

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

  • 查找第一个字母的所有匹配项
  • 根据网格的尺寸消除所有不能满足target 长度的匹配项
  • 在所有匹配项的邻域中搜索第二个字母的出现次数
  • 根据长度等消除出现次数。

(不要忘记在第二个字母之后过滤 direction,因为第二个字母的命中会确定搜索方向)

据我所知,与我的版本相比,这需要更少的读取和比较。但是,我的猜测是使用固定例程(就像我所做的那样)会比使用(嵌套)循环更快且更简单。但我可能是错的。

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

【讨论】:

  • 不错的方法!但可能很难说出这个词在初始矩阵中的确切位置,不是吗?据我从类似的问题中了解到,一个词可能出现多次。而且,当您将所有内容连接起来时,如果两行中有一个“无效”单词会发生什么,例如: C = [ a r ;吨];它会被您的算法检测到,但不正确。我说的对吗?
  • @thewaywewalk: (a) 没错,尽管很容易推导出命中发生的位置,因为您知道allDirections 中的哪一行对应于哪一行/列/方向. (b) 不。我连接的是整行字符,而不是单个字符。只需打印allDirections 即可了解我的意思。 cell 中的每个条目都是遵守 OP 规则的有效字符串。
猜你喜欢
  • 2020-01-22
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多