Java 在给定整数的叉积中生成行

Java 在给定整数的叉积中生成行,java,math,theory,Java,Math,Theory,我有一个问题,我正在努力解决。给定任意数量的数组和一个名为“specificity”的整数,我需要在数组的叉积中生成表示该点的行。数组的长度始终至少为2,并且每个数组的最后一个值始终为null。除了每个数组中的最后一个元素外,没有其他元素是空的。例如,给定数组{1,2,null}和{A,B,null},叉积实际上是: 0:1A 1:1b 2:1空值 3:2A 4:2b 5:2空值 6:空A 7:空B 8:null 因此,给定“specification”4,例如上面列出的两个数组,它应该返回数组

我有一个问题,我正在努力解决。给定任意数量的数组和一个名为“specificity”的整数,我需要在数组的叉积中生成表示该点的行。数组的长度始终至少为2,并且每个数组的最后一个值始终为null。除了每个数组中的最后一个元素外,没有其他元素是空的。例如,给定数组{1,2,null}和{A,B,null},叉积实际上是:

0:1A
1:1b
2:1空值
3:2A
4:2b
5:2空值
6:空A
7:空B
8:null

因此,给定“specification”4,例如上面列出的两个数组,它应该返回数组{2,B}。这是最简单的部分。我已经在下面的代码部分完成了这个特殊的案例。然而,考虑没有空缺的组合优先的情况。现在的订单是:

0:1A
1:1b
2:2A
3:2b
4:1空值
5:2空值
6:空A
7:空B
8:null

这是到目前为止我已经实现的算法。上面的第一个案子处理得很好,但我不知道第二个案子该怎么办。你对“其他”条款有什么想法吗


在寻找此类问题的解决方案时,归纳法是您的朋友

对于简单的情况,它看起来像

easy( a, i ) ≡ easyHelper( a, a.length, i )  
easyHelper( a, n, i ) ≡ easyInduction( easyHelper, 0 )( a, n, i )

easyInduction( f, b )( a, 0, 0 ) ≡ []  
easyInduction( f, b )( a, 0, i + 1 ) ≡ undefined
easyInduction( f, b )( a, n + 1, i ) ≡
   let t = a[n + 1].length - b
    in f( a, n, ⌊i / t⌋ ) ++ [ a[n + 1][i mod t] ]
对于困难的情况,我认为你需要一个更强的归纳假设。也就是说,您的助手递归方法需要返回偏移量和将特性映射到元组的函数。当应用于偏移量以下的索引时,该函数返回所有数组的叉积的成员,并移除空值;在偏移量以上,空案例开始。对于n个阵列的情况,您知道这一点,可以通过以下三种情况为n+1阵列构造新偏移量和新函数:

  • 小于新的偏移量,因此将其视为最后一个数组的非空成员的简单情况
  • 您位于新偏移量和新偏移量与旧偏移量之和之间,因此您应该返回递归结果,并在结尾处返回null
  • 您的值大于总和,因此您再次将其视为简单的情况,除非您确保其中的递归调用使用超出旧偏移量的索引
  • 这是我未经测试的psuedo代码

    hard( a, i ) ≡ hardHelper( a, a.length ).second( i )
    hardHelper( a, 0 ) ≡ ( 1, { case 0 => [] } )
    hardHelper( a, n + 1 ) ≡
      let t = a[n + 1].length
      and ( k, f ) = hardHelper( a, n )
      and k' = k * ( t - 1 )
      and f'( i ) =
            if ( i < k' )
            then easyInduction( f, 1 )( a, n + 1, i )
            else if ( k' <= i < k' + k )
            then easyInduction( f, 1 )( a[ 0..n ] ++ [ [ null ] ], n + 1, i - k' )
            else easyInduction( ( b, m, j ) => f( b, m, j + k ), 0 )( a, n + 1, i - k' - k )
       in ( k', f' )
    
    硬(a,i)≡ hardHelper(a,a.长度)。第二(i)
    hardHelper(a,0)≡ (1,{案例0=>[]})
    hardHelper(a,n+1)≡
    设t=a[n+1]。长度
    和(k,f)=硬助手(a,n)
    和k'=k*(t-1)
    和f'(i)=
    if(i
    在寻找此类问题的解决方案时,归纳法是你的朋友

    对于简单的情况,它看起来像

    easy( a, i ) ≡ easyHelper( a, a.length, i )  
    easyHelper( a, n, i ) ≡ easyInduction( easyHelper, 0 )( a, n, i )
    
    easyInduction( f, b )( a, 0, 0 ) ≡ []  
    easyInduction( f, b )( a, 0, i + 1 ) ≡ undefined
    easyInduction( f, b )( a, n + 1, i ) ≡
       let t = a[n + 1].length - b
        in f( a, n, ⌊i / t⌋ ) ++ [ a[n + 1][i mod t] ]
    
    对于困难的情况,我认为你需要一个更强的归纳假设。也就是说,您的助手递归方法需要返回偏移量和将特性映射到元组的函数。当应用于偏移量以下的索引时,该函数返回所有数组的叉积的成员,并移除空值;在偏移量以上,空案例开始。对于n个阵列的情况,您知道这一点,可以通过以下三种情况为n+1阵列构造新偏移量和新函数:

  • 小于新的偏移量,因此将其视为最后一个数组的非空成员的简单情况
  • 您位于新偏移量和新偏移量与旧偏移量之和之间,因此您应该返回递归结果,并在结尾处返回null
  • 您的值大于总和,因此您再次将其视为简单的情况,除非您确保其中的递归调用使用超出旧偏移量的索引
  • 这是我未经测试的psuedo代码

    hard( a, i ) ≡ hardHelper( a, a.length ).second( i )
    hardHelper( a, 0 ) ≡ ( 1, { case 0 => [] } )
    hardHelper( a, n + 1 ) ≡
      let t = a[n + 1].length
      and ( k, f ) = hardHelper( a, n )
      and k' = k * ( t - 1 )
      and f'( i ) =
            if ( i < k' )
            then easyInduction( f, 1 )( a, n + 1, i )
            else if ( k' <= i < k' + k )
            then easyInduction( f, 1 )( a[ 0..n ] ++ [ [ null ] ], n + 1, i - k' )
            else easyInduction( ( b, m, j ) => f( b, m, j + k ), 0 )( a, n + 1, i - k' - k )
       in ( k', f' )
    
    硬(a,i)≡ hardHelper(a,a.长度)。第二(i)
    hardHelper(a,0)≡ (1,{案例0=>[]})
    hardHelper(a,n+1)≡
    设t=a[n+1]。长度
    和(k,f)=硬助手(a,n)
    和k'=k*(t-1)
    和f'(i)=
    if(i
    感谢您的详细回复。我会在本周的某个时候做出回应,届时我会抽出一些空闲时间进一步分析这个问题并测试实现。我应该考虑使用归纳法;我现在很清楚,这是应该采取的方法。我已经好几年没用过它了:)对不起,我从来没有抽出时间来回答这个问题。不幸的是,与此问题相关的需求发生了变化,要求我改变订购方式。由于排序的复杂性,使用归纳法是相当具有挑战性的,我转而根据评分系统创建一个有序的定义列表,并定义用于给定“特异性”评分的索引。由于这是一个不可伸缩的问题,我对层次结构的数量和每个层次结构中的值的数量进行了限制。好的,但我相信我正确地回答了您发布的问题。感谢您的详细回答。我会在本周的某个时候做出回应,届时我会抽出一些空闲时间进一步分析这个问题并测试实现。我应该考虑使用归纳法;我现在很清楚,这是应该采取的方法。我已经好几年没用过它了:)对不起,我从来没有抽出时间来回答这个问题。不幸的是,与此问题相关的需求发生了变化,要求我改变订购方式。由于排序的复杂性,使用归纳法是相当具有挑战性的,我转而根据评分系统创建一个有序的定义列表,并定义用于给定“特异性”评分的索引。因为这是一个不可伸缩的问题,所以我对层次结构的数量进行了限制