1

頂点の配列に対して収縮アルゴリズムを n^2 回実行して、グラフの最小カットを計算したいと思います。最初の for ループの反復の後、配列が変更され、残りの反復では変更された配列が使用されますが、これは私が望んでいるものではありません。各 for ループ反復中に元の入力配列を持つようにポインターをシミュレートするにはどうすればよいですか?

  def n_squared_runs(array):
        min_cut, length = 9999, len(array) ** 2
        for i in range(0, length):
            # perform operation on original input array
            array = contraction(array)
            if len(array) < min_cut:
                min_cut = len(array)
        return min_cut
4

2 に答える 2

1

次に、contraction()操作は新しい配列を作成して返す必要があり、パラメーターとして受け取る配列をその場で変更しないでください。また、パラメーターとローカルの両方に名前を付ける場合は、返される配列に別の変数名を使用する必要があります。array変数の場合、パラメーターは関数内で上書きされます。

これはポインタとは関係ありませんが、使用中の関数のコントラクトとは関係ありません。オリジナルarrayを保持する必要がある場合、ヘルパー関数はこの制限が適用されていることを確認する必要があります。これを行う場合、Python で次のことに注意してください。

array = [1, 2, 3]
f(array)

array関数が受け取ったものは、関数のf「外側」で宣言されたものと同じです。実際、f受け取るものは配列のコピーではなく、配列への参照fです。したがって、内部で行った配列への変更は当然、外部に反映されます。 . また、Python のすべてのパラメーターは値渡しであることに注意してください。この言語には、ポインターや参照渡しなどはありません。

于 2013-07-27T18:39:33.510 に答える
1

元の配列を上書きしないでください。

  def n_squared_runs(array):
        min_cut, length = 9999, len(array) ** 2
        for i in range(0, length):
            # perform operation on original input array
            new_array = contraction(array)
            if len(new_array) < min_cut:
                min_cut = len(new_array)
        return min_cut
于 2013-07-27T18:41:02.613 に答える