LoginSignup
0
0

More than 1 year has passed since last update.

配列を使って値を検索する速度の比較

Posted at

ある2つの値のペア$x,$yが、最初に与えられた複数のペアのデータの中に含まれるかどうかを検索したい時
最初のデータを$arrに格納しておくとする。

方法1

function check_element_exists($arr, $x, $y) {
    for ($i = 0; $i < count($arr); $i++) {
        if ($arr[$i][0] == $x && $arr[$i][1] == $y) {
            return true;
        }
    }
    return false;
}

この方法は配列の要素数が多い場合、処理に時間がかかる。

方法2

function check_element_exists($arr, $x, $y) {
    return isset($arr[$x][$y]);
}

isset関数を使って要素を探索する場合には、要素の有無を高速に判定することができる。

検証方法

microtime関数で実行時間を比較してみる。
コードは、chatGPT先生にご協力いただいた。

<?php

function check_element_exists1($arr, $x, $y) {
    for ($i = 0; $i < count($arr); $i++) {
        if ($arr[$i][0] == $x && $arr[$i][1] == $y) {
            return true;
        }
    }
    return false;
}

function check_element_exists2($arr, $x, $y) {
    return isset($arr[$x][$y]);
}

// 検証用の多次元配列を生成する
$arr = [];
for ($i = 0; $i < 1000; $i++) {
    for ($j = 0; $j < 1000; $j++) {
        $arr[$i][$j] = rand(0, 100000);
    }
}
$arr[123][0] = 500; // 存在する要素を設定する
$arr[123][1] = 500; // 存在する要素を設定する
$arr[500][500] = 12345; // 存在する要素を設定する

// 方法1を実行する
$start_time1 = microtime(true);
$result1 = check_element_exists1($arr, 500, 500);
$end_time1 = microtime(true);
$elapsed_time1 = $end_time1 - $start_time1;
var_dump($result1);
echo "<br>";
echo "方法1: " . $elapsed_time1 . "秒<br>";

// 方法2を実行する
$start_time2 = microtime(true);
$result2 = check_element_exists2($arr, 500, 500);
$end_time2 = microtime(true);
$elapsed_time2 = $end_time2 - $start_time2;
var_dump($result2);
echo "<br>";
echo "方法2: " . $elapsed_time2 . "秒<br>";

?>

結果

bool(true)
方法1: 3.6001205444336E-5秒
bool(true)
方法2: 2.8610229492188E-6秒
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0