当前位置 : 主页 > 编程语言 > java >

前缀条件全排列算法java实现

来源:互联网 收集:自由互联 发布时间:2021-06-28
前缀条件全排列算法java实现 package algrithm;import com.google.common.collect.Lists;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.function.BiFunction;import java.util.function.Consumer;/
前缀条件全排列算法java实现
package algrithm;

import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Consumer;

/**
 * @author daimao  Date: 2017/11/21 Time: 下午4:50
 * @version $Id$
 */
public class LexicographicPermutationWithRestrict1 {

    private static final int X2 = 2;
    private static final int X3 = 3;
    private static final int X4 = 4;
    private static final int X5 = 5;
    private static final int X6 = 6;

    public static 
 
   void perm(List
  
    list, BiFunction
   
     test, Consumer
    
      c) { if (list == null || list.isEmpty()) return; //X1: lk = k+1 for 0<
     
       void perm(int[] a, int[] l, int[] u, List
      
        list , BiFunction
       
         test, Consumer
        
          c) { int k = 0; int p = 0,q = 0; int n = list.size() - 1; int x = X2; while (true) { switch (x) { case X2: p = 0; q = l[0]; case X3: a[k] = q; //ak <- q if (!test.apply(a, k)) { //goto X5 x = X5; break; } else { if (k == n) { c.accept(a); //goto X6 x = X6; break; } } case X4: u[k] = p; l[p] = l[q]; k++; x = X2; break; case X5: p = q; q = l[p]; if (q != 0) { //goto X3 x = X3; break; } case X6: k--; if (k < 0) return; p = u[k]; q = a[k]; l[p] = q; //goto X5 x = X5; break; } } } private static boolean test(ArrayList
         
           a, int k) { System.out.println("test:" + a + ", k=" + k); return a.get(0) == 1; } public static void main(String[] args) { /** * 数组a[]是基于1开始的list的下标排序结果,即:list=[5,6,7] * 当 a[] = [1,3,2] 的时候对应 [list[1-1],list[3-1],list[2-1]] -> [5,7,6] * 因为算法的需要,a[]需要从1开始计数 */ ArrayList
          
            list = Lists.newArrayList( 5,6,7,8,9); perm(list,(a,k)-> list.get(a[0]-1).equals(5), a->{ for (int i = 0; i < a.length; i++) { System.out.print(list.get(a[i]-1)); } System.out.println(); }); } }
          
         
        
       
      
     
    
   
  
 
网友评论