Golang でバックトラッキング アルゴリズムを使用するときに配列を正しくコピーするにはどうすればよいですか?

WBOY
リリース: 2024-02-14 15:51:19
転載
796 人が閲覧しました

Golang でバックトラッキング アルゴリズムを使用するときに配列を正しくコピーするにはどうすればよいですか?

Golang でバックトラッキング アルゴリズムを使用する場合、配列を正しくコピーすることは重要な問題です。バックトラック アルゴリズムでは通常、再帰プロセス中に配列を変更する必要がありますが、場合によっては、前のステップにバックトラックするために元の配列の状態を保存する必要があります。この場合、同じメモリ空間を共有し、一方の配列を変更するともう一方の配列に影響を与えるため、元の配列を新しい変数に単純に直接割り当てることはできません。この問題の解決策は、新しい配列を作成し、元の配列の値を新しい配列に次々とコピーするディープ コピーを使用することです。 Golang では、この操作は copy() 関数を使用して実行できます。この関数は配列の内容をバイト レベルでコピーし、新しい配列が元の配列から完全に独立していることを保証します。配列を正しくコピーすることで、元のデータの状態に影響を与えることなく、バックトラッキング アルゴリズムで配列を安全に操作できます。

質問内容

値[1, 2, 3]を持つ単純な配列があり、すべての順列を見つけたいと思っています。ループがプログラムを中断する前にコードの「コピー」部分が移動される理由がわかりません。

リーリー

コピーがループの外にある場合、結果は次のようになります。 [[1 2 3] [1 3 2] [2 1 3] [2 3 1] [3 3 3] [3 3 3]]

コピーがループ内にある場合、結果は次のようになります。 [[1 2 3] [1 3 2] [2 1 3] [2 3 1] [3 1 2] [3 2 1]]

最初の出力には、[3,3,3] を含む 2 つの配列がありますが、これは間違っています

解決策

あなたは言っています両方とも "c" を変更していないか、 「r」を付けたり、 を追加したりしない場合、この部分は正しいです。

ループの最初の反復では、 スライス ccurr は異なるバッキング配列を指しているため、問題ありません。

しかし、それを行うと

リーリー

その後、実際に両方のスライスを同じバッキング配列を指すように割り当てます。

これは、2 回目の反復で、appendcurrcurr で変更できることを意味します (サイズ変更により変更されるため「変更可能」 curr がサポートする配列)。

これが、上記のような奇妙な動作を引き起こす原因です。

go でのスライスは少し難しいので、スライスを変更して渡すことがわかっている場合は、割り当てを避け、代わりにスライスを正確にコピーすることに固執するのが最善です (「動作」の場合のように)。

さらに詳しい情報については、素晴らしいリソースをご覧ください: https://go.dev/blog/slices-introduction

以上がGolang でバックトラッキング アルゴリズムを使用するときに配列を正しくコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート