单词搜索算法matlab

时间:2013-12-13 12:28:25

标签: string algorithm matlab word

我正在寻找一种有效的单词搜索算法。如果你能帮助我提出它会更好

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

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

1 个答案:

答案 0 :(得分:4)

这是一种方式:

%// 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长度的事件
  • 搜索所有匹配的邻域以查找第二个字母的出现次数
  • 根据长度等消除事件

(不要忘记在第二个字母后面的方向上过滤,因为第二个字母的点击会修复搜索方向)

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

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