“字符矩阵中搜索词/字符串”算法的复杂性

时间:2015-07-17 15:22:06

标签: c++ algorithm search time-complexity

我有一项任务是从列表中搜索字母网格(20×20 <= MxN <= 1000×1000)字(5 <= length <= 100)。隐藏在网格中的任何单词总是呈Z字形段的形式,其长度可能只有2或3.之字形段只能是从左到右或从下到上。

所需的复杂程度等于网格中字母数与列表中字母数的乘积。

对于网格:

••••••••••••••••••••
••••••••ate•••••x•••
•••••••er•••••••e•••
••••••it••••••••v•••
••••ell••••••a••f•••
•••at••••e••••••rbg•
•••s•••••••ga•••••••

和单词列表{"forward", "iterate", "phone", "satellite"} 输出将是

3,6,iterate
6,3,satellite

我在C++执行此操作:
我在unordered_map<string, int>中保存了所有前缀和单词,其中key是前缀/单词,value的前缀为1,单词为2。现在我做这样的事情(伪代码):

for (char c in grid)
    check(c + "");
}

其中:

check(string s) {
    if s is key in unsorted_map {
        if (value[s] == 2) //it's a word
            print s; //and position
        if (not up 3 time consecutive) //limit the segments <= 3
            check(s + next_up_char_from_grid);
        if (not right 3 time consecutive)
            check(s + next_right_char_from_grid);
    }
}

这种实现对于网格中的随机字符和来自字典的单词非常有用,但是复杂性C≃O(M * N * 2 K )&gt; O(M * N * R)
由于长度段的限制,更好的近似C≃O(M * N *(1,6) K

M * N = number of chars in grid
K = the maximum length of any word from list (5 <= K <= 100)
R = number of chars in list of words

最坏情况:网格和单词中的最大网格,最大字长和相同的单个字符 如何归档所需的复杂性?只有给定的限制才有可能吗?

1 个答案:

答案 0 :(得分:0)

您的check()函数将执行多次重复工作。

对于网格

•aa
ab•
aa•

和单词'aabaa'

'aabaa'

之后,有两种方法可以使'b'相同

(顶部,右侧,顶部,右侧)或(右侧,顶部,顶部,右侧)

从这个特性中,我们使用数组a[position][n][m]来记录特定单词是否可以在网格position获取其长度为[m, n]的前缀

对于前面的例子, 按照这样的顺序

a[0][2][0] = true
a[1][1][0] = a[1][2][1] = true
a[2][1][1] = true
a[3][0][1] = true
a[4][0][2] = true

'aabaa'可以在grind

中找到

因此复杂性为N*M*K*S

S是列表中的字数