私は最近、自分のアルゴリズム クラスの 1 つで、Knuth のアルゴリズムを使用して、malloc された配列に格納された順列を作成するように指示されました。
セットアップは次のとおりです。
array は、順列を保持する malloced 配列へのポインタです。最初は n 個の値を格納しており、各位置はインデックス + 1 を保持しています。
したがって、n が 10 の場合、配列は最初は次のようになります。
[1、2、3、4、5、6、7、8、9、10]
「rand」変数は、1 から n までの変数を保持します。(この例では、1 ~ 10)。
Swap は、ビット排他的 OR スワップ (XOR) を行う関数であると想定されています。
最終結果は、1-n の順列になるはずです。
[5, 6, 2, 8, 7, 4, 1, 3, 10, 9] は、可能な順列の 1 つとして有効です。
ただし、[1, 1, 5, 7, 8, 2, 3, 5, 5, 6] は順列ではないため無効です。重複があります。
しかし、私たちが使用するように言われたこのコードの表と裏を作ることはできません:
for(i = 1; i < n; i++) {
swap(&array[i], &a[rand]);
}
したがって、配列の 2 番目の要素から始めます。(i = 1)
次に、2 つのパラメーターの XOR を試みます。
最初: &array[i]
これは、malloced 配列へのポインターのアドレスです。(ダブルポインタですよね?)
そして、2 番目のパラメーターはまったく同じものです。malloc された配列へのポインターのアドレス。
アドレスに対して XOR を実行する方法と理由を教えてください。
私は何を理解していませんか?
助けてくれてありがとう!