Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 完全测试算法输出(动态规划最长子序列)_Java_Algorithm_Dynamic Programming - Fatal编程技术网

Java 完全测试算法输出(动态规划最长子序列)

Java 完全测试算法输出(动态规划最长子序列),java,algorithm,dynamic-programming,Java,Algorithm,Dynamic Programming,在我开始之前,我只想说这是一个家庭作业。我最近在这门课上遇到的一个问题是如何有效地测试我的代码,这样当我提交解决方案时,我可以确信所有的输入组合都将被涵盖。有人告诉我,很多测试都是主观的,需要对实现有实际的了解。。一刀切不可能适合所有人。也就是说,是否有关于如何有效测试的指导方针 我目前正在努力解决的一个例子是最长子序列if元素的动态编程实现。我所有的测试都有效,但当我提交给评分员时,我陷入了我认为是edgecase的困境(我们不允许在某个测试之后看到失败测试用例的输入或输出) 在这里发布之前,

在我开始之前,我只想说这是一个家庭作业。我最近在这门课上遇到的一个问题是如何有效地测试我的代码,这样当我提交解决方案时,我可以确信所有的输入组合都将被涵盖。有人告诉我,很多测试都是主观的,需要对实现有实际的了解。。一刀切不可能适合所有人。也就是说,是否有关于如何有效测试的指导方针

我目前正在努力解决的一个例子是最长子序列if元素的动态编程实现。我所有的测试都有效,但当我提交给评分员时,我陷入了我认为是edgecase的困境(我们不允许在某个测试之后看到失败测试用例的输入或输出)


在这里发布之前,您应该已经做了研究,以回答您提出的问题:“是否有关于如何有效测试的指导原则?”很容易找到关于令人麻木的长度的概述,例如非常好的一个

在您的情况下,我建议概述“等价类”。由于穷举测试在大多数情况下是不切实际的,并且当输入具有任意长度时是不可能的,因此您开发了代表性的案例——每个类一个,代表该类的所有成员。例如,没有公共成员的列表可能会形成一个这样的类

我不能很好地评论您给定的测试,部分原因是您没有解释为什么要测试这些特定的输入,或者为什么您认为这些已经足够了。等价类要求您分析问题,以确定(或估计)各种输入之间可能存在的处理差异


写下你的理由,也许找个朋友和你一起集思广益。您是否已经介绍了算法的第一次迭代可能会走上错误的道路并不得不回溯的各种方式?

因此,结合您的所有回答,我最后做了以下工作,谢谢您的帮助

  • bruce force算法比较
  • 在我的底层算法中发现了错误
  • 通过从main或junit调用一个方法简化了整个过程

    int [][] solutionMatrix;
    public int lcs2(int[] a, int[] b) {
      final int aARRAY_LENGTH = a.length + 1;
      final int bARRAY_LENGTH = b.length + 1;
      solutionMatrix = new int[aARRAY_LENGTH][bARRAY_LENGTH];
    
    
      //fill in matrix to determine if each element is a insert, delete, match or mismatch
    
      for (int i=0; i<=a.length; i++) {
          for (int j=0; j<=b.length; j++) {
              if (i == 0 || j == 0)
                  solutionMatrix[i][j] = 0;
              else if (a[i-1] == b[j-1])
                  solutionMatrix[i][j] = solutionMatrix[i-1][j-1] + 1;
              else
                  solutionMatrix[i][j] = Math.max(solutionMatrix[i-1][j], solutionMatrix[i][j-1]);
          }
      }
    
      return solutionMatrix[a.length][b.length];
    
    int[][]解矩阵;
    公共内部lcs2(内部[]a,内部[]b){
    最终长度=a.LENGTH+1;
    最终整流罩长度=b.长度+1;
    solutionMatrix=新整数[aARRAY_长度][bARRAY_长度];
    //填写矩阵以确定每个元素是插入、删除、匹配还是不匹配
    
    对于(int i=0;i)你说我们不被允许看到失败测试用例的输入或输出是什么意思?如果评分员不提供有用的反馈来帮助你学习,请与教授谈谈。是的,关键是我们看不到评分员的输出。这是为了让我们“思考”我们自己调试。我认为评分员是个蠢货。在现实世界中,你要做的第一件事是获取导致错误的输入,这样你就可以重新创建错误,以便进行调试。与教授交谈。制作一个随机生成小子序列的函数,制作一个蛮力解算器,并针对蛮力测试你的解决方案lver。如果它给了你正确的答案,那么你的解决方案很可能是正确的。现在想想大序列的错误->内存不足、整数溢出、太多递归导致的堆栈溢出、超时等。制作一些超大序列来测试它,直到它爆炸。玩得开心。
      @Test
    public void testLCS2(){
        LCS2 lcs = new LCS2();
        int[] a = {2,7,5};
        int[] b = {2,5};
        assertEquals("Testing Longest Common SubSequence for [2,7,5] --> [2,5]", 2,lcs.lcs2(a,b));
    
        a = new int[] {2,3,9};
        b = new int[] {2,9,7,8};
        assertEquals("Testing Longest Common SubSequence for [2,3,9] --> [2,9,7,8]", 2,lcs.lcs2(a,b));
    
        a = new int[] {1,2,3,4};
        b = new int[] {1,2,3,4};
        assertEquals("Testing Longest Common SubSequence for [1,2,3,4] --> [1,2,3,4]", 4,lcs.lcs2(a,b));
    
        a = new int[] {7};
        b = new int[] {1,2,3,4};
        assertEquals("Testing Longest Common SubSequence for [7] --> [1,2,3,4]", 0,lcs.lcs2(a,b));
    
        a = new int[] {2,7,8,3};
        b = new int[] {5,2,8,7};
        assertEquals("Testing Longest Common SubSequence for [2,7,8,3] --> [5,2,8,7]", 2,lcs.lcs2(a,b));
    
        a = new int[] {1,1,1,1};
        b = new int[] {1,2,3,4};
        assertEquals("Testing Longest Common SubSequence for [2,7,8,3] --> [5,2,8,7]", 1,lcs.lcs2(a,b));
    
        a = new int[] {1,1,1,1};
        b = new int[] {1,2,3,4,1};
        assertEquals("Testing Longest Common SubSequence for [2,7,8,3] --> [5,2,8,7]", 2,lcs.lcs2(a,b));
    }
    
    int [][] solutionMatrix;
    public int lcs2(int[] a, int[] b) {
      final int aARRAY_LENGTH = a.length + 1;
      final int bARRAY_LENGTH = b.length + 1;
      solutionMatrix = new int[aARRAY_LENGTH][bARRAY_LENGTH];
    
    
      //fill in matrix to determine if each element is a insert, delete, match or mismatch
    
      for (int i=0; i<=a.length; i++) {
          for (int j=0; j<=b.length; j++) {
              if (i == 0 || j == 0)
                  solutionMatrix[i][j] = 0;
              else if (a[i-1] == b[j-1])
                  solutionMatrix[i][j] = solutionMatrix[i-1][j-1] + 1;
              else
                  solutionMatrix[i][j] = Math.max(solutionMatrix[i-1][j], solutionMatrix[i][j-1]);
          }
      }
    
      return solutionMatrix[a.length][b.length];