首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CYK算法实现java

CYK算法实现java
EN

Stack Overflow用户
提问于 2014-04-06 14:03:02
回答 1查看 5.3K关注 0票数 1

我试图实现基于维基百科伪码的CYK算法。当我测试语法输入的字符串"a b“时:

S->A B

A->a

B->b

它给了我假的,我认为这应该是真的。我有一个名为AllGrammar的数组列表,它包含所有规则。对于上面的例子,它将包含:

:S->A B

对于示例S->hello和输入字符串hello,它给出了正确的结果。更复杂的测试(更多的产品)给了我假的:S。

代码语言:javascript
复制
public static boolean cyk(String entrada) {
    int n = entrada.length();
    int r = AllGrammar.size();
    //Vector<String> startingsymbols = getSymbols(AllGrammar);
    String[] ent = entrada.split("\\s");
    n = ent.length;
    System.out.println("length of entry" + n);
    //let P[n,n,r] be an array of booleans. Initialize all elements of P to false.
    boolean P[][][] = initialize3DVector(n, r);
    //n-> number of words of string entrada, 
    //r-> number of nonterminal symbols

    //This grammar contains the subset Rs which is the set of start symbols
    for (int i = 1; i < n; i++) {
        for(int j = 0; j < r; j++) {
            String[] rule = (String[]) AllGrammar.get(j);
            if (rule.length == 2) {
                if (rule[1].equals(ent[i])) {
                    System.out.println("entrou");
                    System.out.println(rule[1]);
                    P[i][1][j + 1] = true;
                }
            }
        }
    }
    for(int i = 2; i < n; i++) {
        System.out.println("FIRST:" + i);

        for(int j = 1; j < n - i + 1; j++) {
            System.out.println("SECOND:" + j);

            for(int k = 1; k < i - 1; k++) {
                System.out.println("THIRD:" + k);
                for(int g = 0; g < r; g++) {
                    String[] rule = (String[]) AllGrammar.get(g);
                    if (rule.length > 2) {
                        int A = returnPos(rule[0]);
                        int B = returnPos(rule[1]);
                        int C = returnPos(rule[2]);
                        System.out.println("A" + A);
                        System.out.println("B" + B);
                        System.out.println("C" + C);
                        if (A!=-1 && B!=-1 && C!=-1) {
                            if (P[j][k][B] && P[j + k][i - k][C]) {
                                System.out.println("entrou2");
                                P[j][i][A] = true;
                            }
                        }
                    }
                }
            }
        }
    }

    for(int x = 0; x < r; x++) {
        if(P[1][n][x]) return true;
    }

    return false;
}
EN

回答 1

Stack Overflow用户

发布于 2014-04-07 14:04:24

与CYK算法相比:

  • 索引从1开始,但是数组似乎从0开始。
  • 函数does ()没有定义,它所做的事情也不明显。

在使用索引时,问题似乎是相当基本的。如果你对这门语言不熟悉,你可能需要复习一下。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22895088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档