2017-12-20 23 views
2

私はサイズの数字の垂直配列のパリティを決定する必要があるExcelシートで作業していますN。この配列には、〜Nの各数値がそれぞれ1回ずつ含まれています。Excel - 並べ替えのパリティを決定する

この場合、パリティは、スクランブルされた配列をソートされた配列に最小から最大に変換するために必要なスワップの数として定義されます。

たとえば、配列{3;1;2;4}は、偶数パリティを持ちます。これは、少なくとも2回のスワップが{1;2;3;4}に変換する必要がありますが、常に偶数回のスワップが必要となるためです。下記参照。

3 --> 1   1 
1 --> 3 --> 2 
2   2 --> 3 
4   4   4 

別の例:{2;1;4;5;3}は、それが{1;2;3;4;5}に変換するには(少なくとも)3つのスワップを必要とするので、奇数パリティを持っていますが、常にスワップの奇数を必要とします。下記参照。

2 --> 1   1   1 
1 --> 2   2   2 
4   4 --> 3   3 
5   5   5 --> 4 
3   3 --> 4 --> 5 

私は偶数パリティと奇数パリティを持つ配列の場合FALSEと配列のためTRUEを返します解決策を探しています。 (そして、私は、私はこれらのケースを処理するために、スプレッドシート内の他のチェックを持っているので、結果がNにからすべての数字が含まれていない配列のために何であるか気にしない。)

を、私は考え出しましたいくつかのヘルパーカラムを使用するソリューションですが、計算が遅いようです。

アレイの個々の番号が正しいインデックスにあるかどうかをチェックし、スワップを実行しない場合はチェックします。私は発生したスワップの金額を合計し、それが偶数であるかどうかを判断するためにMOD(<swaps>,2)=0を使用します。

配列{8;5;3;2;4;1;7;6}を使用した計算例については以下を参照してください。

ホワイト=参照配列{1;2;3;4;5;6;7;8}

ブルー=入力配列

グレー= "ヘルパー" の配列を:私は色簡単に何が起こっているかを伝えるために、細胞をコード化しました

enter image description here

各連続した列は必要に応じてスワップを実行します。

赤=スワップが効果的に多くのスワップが発生したどのように言って、すべての緑の細胞の

黄=合計を発生しなかった場合、スワップはその列、および0で発生した場合、WAPは、グリーン= 1前回のコラムから

を発生しました。

この例では、黄色のセルが偶数である4であるため、入力配列は偶数パリティです。

問題は次のとおりです。この計算は、VBAなしでExcelで効率的に行うことができますか?私はヘルパーの列に必ずしも当てはまるわけではありませんが、私の解決策は低迷しているようですが、より良い方法があるかどうかは疑問です。

+0

問題がありますその数式には変更が保存されていないので、あなたが持っているヘルパー列のメソッドがない方法があるとは思えません。 –

+0

@ScottCranerこのメソッドを使用すると、私は同意します。私の質問は、私が気づいていなかったこれを計算するための数学的な "トリック"があるかどうかでした。 – ImaginaryHuman072889

+0

それから、これはhttps://math.stackexchange.com/の方が良いでしょう。 –

答えて

3

私はヘルパー列なしでこれを行う方法があると思います!

最初に、Nヘルパー列を使って方法を説明します。次に、代わりに配列式を使用する方法を示します。下の行列のショーを考えてみましょう:

Matrix

緑色の範囲の指標であり、青色の範囲は、あなたの順列です。黄色の行列は、式ボックスに表示されるように定義されたpermutation matrixです。

あなたの順列のパリティは、この行列の行列式の値と同じです!

幸いにも、Excelには組み込み式の決定関数MDETERM()があります。でも順列は、パリティ1を持っており、奇順列はパリティ-1を持っている、あなたは、単に式

=MDETERM(C2:J9) 

で決定を得ることができるので、さて、これはかなりクールですが、本当のキッカーは私たちも必要としないということですその行列を作る。

{=MDETERM(IF(B2:B9=TRANSPOSE(A2:A9),1,0))} 

ここでは、列AとBのみを使用しています。列C:Jはこのバージョンでは使用されていません。

(あなたがそれを検証するには、Enter + Shiftキー+ Ctrlキーを使用する必要がありますので、これは、式の周りにカッコをラップします。手動でしないでください。これは、配列数式であることに注意してください。)

+1

私が言うことができるのは、次のとおりです。*まあまあ!*行列の行列式がパリティを決定することはわかりませんでした。副次的に、この場合、 'A'行はまったく必要ないので、この式はヘルパー列なしでは完全に実行可能です。 A2:A9'を 'ROW(B2:B9)-ROW(B2)+ 1'に置き換えるか、ROW(B2:B9)-MIN(ROW(B2:B9))+ 1に置き換えてください。あなたの助けをもう一度ありがとう。私は仕事を少なくするために数学的なやり方があると思った。 – ImaginaryHuman072889

+0

@ ImaginaryHuman072889これが当てはまる理由は、行列に適用されるすべての行または列のスワップを単位行列(恒等置換)から開始すると、行列式の符号が変わるからです。 https://math.stackexchange.com/questions/221668/determinant-of-permutation-matrix –

+0

もう一度ありがとうございます。これは有益な情報であり、この問題に対する洗練された解決策が見つかりました。 – ImaginaryHuman072889

関連する問題