0

私は最近、自分のアルゴリズム クラスの 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 を実行する方法と理由を教えてください。

私は何を理解していませんか?

助けてくれてありがとう!

4

1 に答える 1