[JAVA]実装シーケンス、繰り返しシーケンス、組合せおよび繰り返し組合せ


シーケンス(Permutation)

  • ひとつながり

  • 異なるnでr個のシーケンスを選択=npr

  • nPn == n!

  • n>12では時間的複雑度が急激に増加する

  • シーケンスJavaの実装
  • import java.util.Arrays;
    
    public class permutation {
    
    	static int arr[]; 
    	static boolean isSelected[];
    	static int numbers[];
    	static int n = 5;
    	static int r = 5;
    	
    	public static void main(String[] args) {
    		arr= new int[]{1,2,3,4,5};
    		isSelected = new boolean[r];
    		numbers = new int[r];
    		
    		per(0);
    	}
    	
    	public static void per(int cnt) {
    		if(cnt==r) {
    			System.out.println(Arrays.toString(numbers));
    			return;
    		}
    		
    		for(int i=0;i<n;i++) {
    			if(isSelected[i])continue;
    			numbers[cnt] = arr[i];
    			isSelected[i] = true;
    			per(cnt+1);
    			isSelected[i] = false;
    		}
    	}
    
    }
    繰り返しシーケンス

  • 異なるn個の要素で繰り返しを許可し、r個を1行に抽出する

  • n^r

  • 反復シーケンスJavaの実装
  • import java.util.Arrays;
    
    public class PermutationWithRepetition {
    
    	static int arr[];
    	static int numbers[];
    	static int n = 5;
    	static int r = 3;
    	public static void main(String[] args) {
    		
    		arr = new int[] {1,2,3,4,5};
    		numbers = new int[r];
    		
    		perRep(0);
    	}
    	
    	public static void perRep(int cnt) {
    		if(cnt == r) {
    			System.out.println(Arrays.toString(numbers));
    			return;
    		}
    		
    		for(int i=0;i<n;i++) {
    			numbers[cnt] = arr[i];
    			perRep(cnt+1);
    		}
    	}
    
    }
    コンポジット

  • 異なるn個の要素からr個をランダムに選択する

  • nCr = n!/((n-r)! * r!)

  • nCr = n-1Cr-1 + n-1Cr

  • nC0 = 1

  • コンビネーションJava実装
  • import java.util.Arrays;
    
    public class Combination {
    
    	static int arr[];
    	static int numbers[];
    	static int n = 5;
    	static int r = 3;
    	public static void main(String[] args) {
    		
    		arr = new int[] {1,2,3,4,5};
    		numbers = new int[r];
    		
    		combi(0,0);
    	}
    
    	
    	public static void combi(int start, int cnt) {
    		if(cnt == r) {
    			System.out.println(Arrays.toString(numbers));
    			return;
    		}
    		
    		for(int i=start;i<n;i++) {
    			numbers[cnt] = arr[i];
    			combi(i+1,cnt+1);
    		}
    	}
    }
    くりかえしくみたて

  • 異なるn個の要素からr個をランダムに選択する

  • nHr = n+r-1Cr

  • 重複コンビネーションJavaの実装
  • import java.util.Arrays;
    
    public class CombinationWithRepetition {
    
    	static int arr[];
    	static int numbers[];
    	static int n = 3;
    	static int r = 4;
    	public static void main(String[] args) {
    
    		arr = new int[] {1,2,3};
    		numbers = new int[r];
    		
    		comRep(0);
    	}
    	
    	public static void comRep(int cnt) {
    		if(cnt == r) {
    			System.out.println(Arrays.toString(numbers));
    			return;
    		}
    		
    		for(int i=0;i<n;i++) {
    			numbers[cnt] = arr[i];
    			comRep(cnt+1);
    		}
    	}
    
    }