前のページ|次のページ

LEXPERK関数

n個の変数から一度にk個を取り出した非欠損値の重複しないすべての順列を辞書式順序で生成します。

カテゴリ: 組み合わせ
制限事項: LEXPERK関数は、%SYSFUNCマクロを使用するときには実行できません。

構文

LEXPERK(count, k, variable-1, …, variable-n)

必須引数

count

1から順列数までの範囲の整数の変数を指定します。

k

1からn(1とnを含む)までの整数値を指定する数値定数、変数または式です。

variable

すべての数値変数または同じ長さのすべての文字変数を指定します。これらの変数の値は置換されます。

要件 LEXPERK関数を実行する前にこれらの変数を初期化します。
ヒント LEXPERKを実行すると、最初のk個の変数には1つの順列の値が含まれます。

詳細

基本

LEXPERK関数はループで使用します。LEXPERK関数の第1引数は、1から、変数の非欠損値の重複しないk個の順列数までの各整数値を取ります。このループ内でのLEXPERKの各実行では、kは同じ値になります。

順列数

すべての変数に、値の等しくない非欠損値が含まれる場合、順列数はPERM(n,k)になります。欠損値を含む変数の数がm個ですべての非欠損値が等しくない場合、欠損値は順列から除外されるため、LEXPERK関数ではPERM(n-m,k)個の順列を生成します。一部の変数の値が等しい場合、正確な順列数を計算するのは難しくなりますが、PERM(n,k)が上限となります。LEXPERK関数がゼロ未満の値を返すときにループが終了するのであれば、正確な順列数を計算する必要はありません。

LEXPERK処理

LEXPERK関数を初めて実行すると、次のアクションが実行されます。
  • 引数の種類と長さに不整合がないか確認が行われます。
  • m個の欠損値が最後のm個の引数に割り当てられます。
  • n-mの非欠損値がcountに続く最初のn-m引数に昇順で割り当てられます。
  • LEXPERKは1を返します。
後続の実行では、最後の順列に達するまで、次のアクションが実行されます。
  • k個の非欠損値の重複しない次の組み合わせが辞書式順序で生成されます。
  • variable-1からvariable-iは変更されず、variable-jが変更された場合(j=i+1)、LEXPERKはjを返します。
すべての重複しない順列を生成した後にLEXPERK関数を実行すると、LEXPERKは–1を返します。
LEXPERK関数を実行する場合に第1引数の順序が違っていると、その結果は役に立ちません。特に、変数を初期化した直後に第1引数jでLEXPERK関数を実行すると、j番目の順列は取得されません(jが1の場合を除く)。j番目の順列を取得するには、LEXPERK関数をj回実行する必要があります。第1引数には、1からjまで正しい順序で値が取られます。

比較

LEXPERK関数は、n個の変数から一度にk個を取り出した非欠損値の、重複しない順列すべてを辞書式順序で生成します。LEXPERM関数は、n個の変数の非欠損値の重複しない順列すべてを辞書式順序で生成します。ALLPERM関数は、複数の変数の値のすべての順列を変化量の小さい順に生成します。

LEXPERK関数の例を次に示します。
data _null_;
   array x[5] $3 ('X' 'Y' 'Z' 'Z' 'Y');
   n=dim(x);
   k=3;
   nperm=perm(n, k);
   do j=1 to nperm+1;
      rc=lexperk(j, k, of x[*]);
      put j 5. +3 x1-x3 +3 rc=;
      if rc<0 then leave;
   end;
run;
次の出力がログに書き込まれます。
    1 X Y Y rc=1 2 X Y Z rc=3 3 X Z Y rc=2 4 X Z Z rc=3 5 Y X Y rc=1 6 Y X Z rc=3 7 Y Y X rc=2 8 Y Y Z rc=3 9 Y Z X rc=2 10 Y Z Y rc=3 11 Y Z Z rc=3 12 Z X Y rc=1 13 Z X Z rc=3 14 Z Y X rc=2 15 Z Y Y rc=3 16 Z Y Z rc=3 17 Z Z X rc=2 18 Z Z Y rc=3 19 Z Z Y rc=-1

関連項目:

前のページ|次のページ|ページの先頭へ