ホームページ >バックエンド開発 >PHPの問題 >PHPで配列の回転を実装するにはどうすればよいですか?さまざまな手法の紹介

PHPで配列の回転を実装するにはどうすればよいですか?さまざまな手法の紹介

PHPz
PHPzオリジナル
2023-04-19 10:06:44605ブラウズ

PHP には多くの配列演算関数が用意されており、その 1 つに配列の回転演算があります。配列の回転とは、もともと一緒に配置されていた要素が、配置後に異なる位置に分散されるように、一定の規則に従って配列要素の位置を変換する操作を指します。配列の回転は、配列要素の順序をランダムにシャッフルする、ポーリングを実装する、配列を分割するなど、多くのシナリオで使用できます。

PHP では、配列の回転を実装するさまざまな方法が提供されています。ここでは、一般的に使用される 3 つの方法を紹介します。

1. array_splice 関数を使用する

array_splice 関数を使用すると、配列から指定した長さの部分配列を削除できます。この関数を複数回呼び出すことで配列を回転できます。配列 $a$ を $k$ ビットずつ右に回転することを検討してください。これは、次のアイデアに従って実現できます。

  1. 配列 $a$ の最後の $k$ 要素を取り出して、サブ配列 $P$;
  2. 配列 $a$ の最後の $k$ 要素を削除して、新しい配列 $a'$ を取得します;
  3. サブ配列 $P$ を先頭に挿入します新しい配列 $a'$ の位置を指定して、新しい配列 $a''$ を形成します。

コードは次のように実装されます:

function rotateArray1($arr, $k) {
    $n = count($arr);
    $k = $k % $n; // 取模,防止$k > $n的情况
   
    $p = array_splice($arr, $n - $k, $k);
    $arr = array_merge($p, $arr);
    return $arr;
}

2. array_shift 関数と array_push 関数を使用します

array_shift 関数は、配列の最初の要素を取り出して返すことができます。 、および array_push 関数を使用して、配列の末尾に要素を追加できます。これら 2 つの関数をループ内で呼び出すことで、配列を回転できます。この方法は実行可能ですが、array_shift を呼び出すたびに配列全体を 1 ビット前方に移動する必要があるため、時間の複雑さが高くなります。そのため、$k$ が比較的大きい場合、効率が非常に低くなります。

コードは次のように実装されます:

function rotateArray2($arr, $k) {
    $k = $k % count($arr); //防止$k > count($arr)的情况
    for ($i = 0; $i < $k; $i++) {
        $elem = array_shift($arr); // 取出第一个元素
        array_push($arr, $elem);  // 将元素放入数组末尾
    }
    return $arr;
}

3. 配列の添字を使用して回転を実現します

配列操作関数を使用することに加えて、手動で配列の回転を実装することもできます。配列の添字を操作します。具体的な操作は、添字 $i$ の要素を添字 $(i k)\%n$ の位置に配置することです。ここで、$n$ は配列の長さ、$k$ は右回転の桁数です。この操作はループ内で $n$ 回実行する必要があります。

function rotateArray3($arr, $k) {
    $n = count($arr);
    $k = $k % $n;
    for ($i = 0; $i < $n; $i++) {
        $newIndex = ($i + $k) % $n;
        $newArr[$newIndex] = $arr[$i];
    }
    return $newArr;
}

上記の 3 つのメソッドはいずれも配列の回転操作を実現できますが、使用される具体的なメソッドはシナリオと必要なデータ スケールによって異なります。実際の使用では、プログラムエラーにつながる可能性のあるさまざまな異常事態を回避するために、配列の種類やサイズなどの要因も考慮する必要があることに注意してください。

以上がPHPで配列の回転を実装するにはどうすればよいですか?さまざまな手法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。