我的Word Puzzle解决方案的时间复杂性?改善方案?

时间:2015-01-14 05:43:54

标签: c# algorithm time-complexity

char[][] puzzle = new char[][] {
           // 0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
    new [] { 'T', 'S', 'T', 'N', 'E', 'S', 'E', 'R', 'P', 'D', 'N', 'L', 'L', 'A', 'M', 'S', 'G' },
    new [] { 'T', 'O', 'P', 'P', 'E', 'R', 'P', 'I', 'N', 'E', 'W', 'I', 'H', 'R', 'E', 'D', 'R' },
    new [] { 'O', 'T', 'E', 'V', 'I', 'T', 'S', 'E', 'F', 'C', 'O', 'G', 'R', 'E', 'R', 'N', 'E' },
    new [] { 'F', 'R', 'E', 'S', 'H', 'C', 'U', 'T', 'E', 'O', 'D', 'H', 'A', 'T', 'A', 'A', 'E' },
    new [] { 'D', 'D', 'N', 'A', 'T', 'S', 'I', 'G', 'T', 'R', 'G', 'T', 'T', 'A', 'I', 'L', 'N' },
    new [] { 'O', 'S', 'N', 'A', 'O', 'F', 'R', 'H', 'A', 'A', 'N', 'S', 'S', 'W', 'V', 'R', 'I' },
    new [] { 'E', 'S', 'N', 'N', 'M', 'A', 'G', 'A', 'R', 'T', 'I', 'F', 'I', 'C', 'I', 'A', 'L' },
    new [] { 'S', 'E', 'A', 'O', 'L', 'E', 'G', 'N', 'A', 'E', 'K', 'C', 'H', 'R', 'Y', 'G', 'S' },
    new [] { 'A', 'T', 'M', 'S', 'I', 'I', 'N', 'O', 'I', 'T', 'A', 'R', 'B', 'E', 'L', 'E', 'C' },
    new [] { 'H', 'T', 'S', 'R', 'E', 'T', 'T', 'T', 'R', 'D', 'T', 'M', 'A', 'A', 'N', 'S', 'S' },
    new [] { 'C', 'I', 'S', 'T', 'A', 'L', 'A', 'A', 'S', 'R', 'E', 'R', 'G', 'A', 'R', 'E', 'E' },
    new [] { 'R', 'N', 'E', 'P', 'O', 'F', 'D', 'R', 'E', 'T', 'L', 'C', 'C', 'I', 'H', 'R', 'L' },
    new [] { 'U', 'G', 'K', 'I', 'R', 'I', 'E', 'E', 'O', 'Y', 'R', 'Y', 'E', 'C', 'F', 'E', 'G' },
    new [] { 'P', 'U', 'I', 'N', 'T', 'U', 'L', 'E', 'E', 'C', 'D', 'I', 'N', 'M', 'S', 'T', 'L' },
    new [] { 'N', 'P', 'A', 'I', 'U', 'O', 'C', 'T', 'R', 'N', 'E', 'A', 'K', 'N', 'B', 'A', 'S' },
    new [] { 'E', 'D', 'O', 'I', 'T', 'R', 'N', 'E', 'A', 'T', 'R', 'D', 'I', 'S', 'E', 'E', 'G' },
    new [] { 'E', 'N', 'S', 'C', 'E', 'N', 'T', 'C', 'R', 'B', 'M', 'T', 'A', 'R', 'N', 'Y', 'R' } };

    String[] words = new String[] {
"ANGEL", "ARTIFICIAL", "BRANCHES", "CANDY CANES", "CELEBRATION", "DECEMBER", "DECORATE", "DECORATIONS", 
"FESTIVE", "FRESHCUT", "GARLAND", "GIFTS", "GREEN", "LARGE", "LIGHTS", "NEEDLES", "ORNAMENTS",
"PINE", "PRESENTS", "PURCHASE", "REAL", "SCENT", "SETTING UP", "SKIRT", "SMALL", "SPRUCE", "STAND", "STAR", "TAKING DOWN",
"TINSEL", "TOPPER", "TRADITION", "TREE FARM", "TREE LOT", "TRUNK", "WATER", "YEARLY", "HELLO WORLD"
};

拼图存储在2d数组中,单词在数组中。确定拼图中有多少单词。单词可以是垂直,水平或对角线。

可以从char []创建字符串,因此一行是一个字符串。然后我可以使用string.IndexOf方法来查找该行是否包含给定的单词。

因此,我需要改造拼图,以便在各个方向找到单词。

  • Horizo​​ntalTransform():
AB => BA
CD    DC
  • VerticalTransform():
    AB => AC
    CD    BD
  • DiagonalTransform():
    AB => C
    CD    AD
          B

Here is the C# code包含测试用例和精彩输出

现在我计算时间复杂度。假设拼图的大小是n * n,单词的计数是m,单词的平均长度是a。

string.IndexOf取O(a + n)。 在每个单词和每一行上调用string.IndexOf:O(mn(a + n))。

所以我的解决方案的时间复杂度是O(mn(a + n))。我对么?你有更快的解决方案吗?

1 个答案:

答案 0 :(得分:1)

很可能你是对的。原因a是一个const,然后IndexOf可以取O(a + n)或O(a×n),但这两个估计等价O(n)。如果简化big-O表达式则需要O(m×n 2 )。

似乎无法开发更快的算法。考虑一个简单的情况:我们需要找到该单词的第一个字母的所有出现。矩阵中的字母数量与n 2 成比例增加。对于m个字,无论如何都需要O(m×n 2 )。