我正在寻找一种有效的单词搜索算法。如果你能帮助我提出它会更好
a h c k
x r j i
b v t l
c y q s
我希望找到'艺术'。如果'stra'也是一个有效的单词,我也希望找到它。 (垂直,水平,对角线和反向)。我提出了一些算法,但你的效率似乎并不高,而且编码很长。第一个包括使用find()来获取第一个字母并查看该列。
答案 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
strfind
,但target
倒置但除了这些相对较小的优化之外,我认为你在MATLAB 实践中可以做得更好。
理论上更有效的递归,分支绑定类型搜索大致如下:
target
长度的事件(不要忘记在第二个字母后面的方向上过滤,因为第二个字母的点击会修复搜索方向)
据我所知,与我的版本相比,这需要更少的读取和比较。但是,我的猜测是使用固定例程(就像我做的那样)比使用(嵌套)循环更快,更简单。但我可能是错的。
尝试。轮廓。学习。微笑。纠正我:)