データ構造アルゴリズムの誘導

再帰的思考

例:フィボナッチシーケンス:1 1 2 3 5 8 13……要件:指定された位置Nに対応する値を見つけます。ブログ設定ページに
移動し、好きなコードピースの強調表示スタイルを選択します同じ強調表示を以下に示します代码片

//递推思想
//需求 1 1 2 3 5 8 13 ...... 求出指定位置N对应的值是多少

$f[1] = 1;
$f[2] = 1;
//列出数组元素
$des = 15;
for($i = 3;$i <= $des;$i++){
    
    
    $f[$i] = $f[$i-1] + $f[$i-2];
}

echo '<pre>';
print_r($f);
//建立函数寻找
function my_recursive($des){
    
    
    if($des == 1 || $des == 2) return 1;

    //开始计算
    $f[1] = 1;
    $f[2] = 1;

    for($i = 3;$i <= $des;$i++){
    
    
        $f[$i] = $f[$i-1] + $f[$i-2];
    }
    return $f[$des];
}

echo '第15个元素的值为:' . my_recursive(15);

効果画像:
ここに写真の説明を挿入

再帰的思考

再帰的思考の重要なポイント:再帰的ポイント再帰的出口
再帰点:現在の問題は、現在の問題を解決し、現在の問題よりも小規模な問題を解決する機能を持つことができることがわかります。例:F(N)= F(N-1)+ F(N-2);
再帰的終了:現在の問題が解決されると、(必須の)最適なサブ問題に到達し、関数を再度呼び出すことはできません。
エッセンス:時間のスペース

//递归思想
//用递归的思想求斐波那契数列
//递归一定有函数

function recursion($n){
    
    
    //递归出口
    if($n ==1 || $n == 2) return 1;

    //递归点:求N得值,与求N-1的值一模一样,只是N-1的规模比N小
    return recursion($n-1) + recursion($n-2);
}

//调用
echo recursion(15);

バブルソート

バブルソート(バブルソート)は、コンピューターサイエンスの分野では比較的単純なソートアルゴリズムです。ソートするシーケンスに繰り返しアクセスし、一度に2つの要素を比較し、順序が間違っている場合は交換しました。シーケンスにアクセスする作業は、交換する必要がなくなるまで、つまりシーケンスがソートされるまで繰り返されます。

バブリングのアイデア:
1。隣接する要素を比較します。最初の要素が2番目の要素ほど大きくない場合は、2つ交換します。2
。隣接する各要素に対して、最初の最初のペアから最後の最後のペアまで同じ作業を行います。正しい。この時点で、最後の要素が最大数になるはずです。
3.最後の要素を除くすべての要素に対して上記の手順を繰り返します
。4。比較する数値のペアがなくなるまで、毎回、要素の数を減らして上記の手順を繰り返します。

//数组排序算法:冒泡排序

$arr = array(1,4,2,9,7,5,8);
$a = 0;

//2、想办法让下面可以每次找出最大的代码重复执行
for($i = 0; $i < count($arr)-1; $i++){
    
    
//1、想办法将最大的值放到右边
    for($j = 0; $j < count($arr)-1-$i; $j++){
    
    
        if($arr[$j] > $arr[$j+1]){
    
    
            $temp = $arr[$j];
            $arr[$j] = $arr[$j+1];
            $arr[$j+1] = $temp;
        }
        $a++;
    }
}


echo '<pre>';
print_r($arr);
echo '计算次数:' . $a;

効果画像:
ここに写真の説明を挿入

並べ替えを選択

選択ソート(選択ソート)は、シンプルで直感的なソートアルゴリズムです。その動作原理は、毎回ソートされるデータ要素から最小(最大)要素を選択し、ソートされたすべてのデータ要素が配置されるまでシーケンスの最初にそれを格納することです。選択ソートは最も不安定なソート方法です(シーケンス[5,5,3]など)。最初の5と3が初めて交換され、最初の5が2番目の5の後ろに移動します。
アイデア:
1。仮定最初の要素は最小の要素です
添え字2を書き留めます。右側の残りの要素を探します。小さいものがある場合は、最新の添え字
3を書き直します。新しい最小の要素がある場合は、2つの要素を交換します
。4。移動します。要素自体が最後になるまで、上記の手順を右に繰り返します

//数组排序算法:选择排序

$arr = array(1,5,2,9,6,3,4);

//1、确定要交换多少次,一次只能找到一个最小的,需要找到数组长度对应的次数
for($i = 0,$len = count($arr); $i < $len; $i++){
    
    
    //2、假设当前第一次已经排好序了
    $min = $i;
    //3、拿该最小的取比较剩余的其他
    for($j = $i+1; $j < $len; $j++){
    
    
        //4、比较当前最小值和指定值
        if($arr[$j] < $arr[$min]){
    
    
            //说明当前指定的min不合适
            $min = $j;
        }
    }

    //5、交换最小值的小标
    if($min != $i){
    
    
        $temp = $arr[$i];
        $arr[$i] = $arr[$min];
        $arr[$min] = $temp;
    }
}
echo '<pre>';
print_r($arr);

効果画像:
ここに写真の説明を挿入

挿入ソート

挿入ソートとは、ソートされた順序付きデータにデータを挿入することです。
アイデア:
1。最初の要素がソートされていることを確認します
。2。挿入するデータとして2番目の要素を取り出します。3
ソートされた配列の右端から比較を開始します
。4。後者が前の配列よりも小さい場合:以前に注文した配列要素が正しい位置にないことを説明し(1ビット後方に移動)、新しい要素を入力します
。5 現在の要素が正しい位置に挿入されるまで、前の手順を繰り返します。

//php数组排序:插入排序
$arr = array(4,2,6,8,9,5);

//1、确定要插入的次数(同时假设第一个位置是对的)
for($i = 1, $len = count($arr); $i < $len; $i++){
    
    
    //2、取出当前要插入的元素值
    $temp = $arr[$i];

    //标记:默认说明当前要插入的数组位置是对的
    $change = false;
    //3、让该数据与前面已经排好序的数组元素重复比较,直到位置正确
    for($j = $i - 1;$j >= 0; $j--){
    
    
        //比较
        if($arr[$j] > $temp){
    
    
            $arr[$j+1] = $arr[$j];
            //$arr[$j] = $temp;

            //说明前面顺序位置有不合适的位置
            $change = true;
        }else{
    
    
            //说明当前带插入元素,比前面大,位置正确
            break;
        }
    }
    //判断位置是否有变动
    if($change){
    
    
        //有数据移动:占错位置了
        $arr[$j+1] = $temp;
    }
}

echo '<pre>';
print_r($arr);

クイックソート

クイックソート(クイックソート)は、バブルソートの改良版です。並べ替えにより、並べ替えるデータを2つの独立した部分に分割します。データの一部が他の部分よりも小さい場合、この方法に従って2つの部分をすばやく並べ替えます。並べ替えプロセス全体を再帰的に実行して、全体を実現できます。データは順序付けられたシーケンスになります。
アルゴリズムのアイデア:
1。参照として配列(通常は最初の要素)から要素を選択します
。2。2つの配列を定義し、ターゲット配列の残りの要素を参照要素と1つずつ比較します。小さい方の配列と大きい方の配列を配置し
ます3。 、実行後、前後の配列の順序は不確かですが、それらの位置は決定されます
。4 結果の小さい配列を1から3まで繰り返します
。5。最小の配列(1要素)をバックトラックします

//php数组排序:快速排序

$arr = array(5,6,3,4,9,2,7,8);

//快速排序
function quick_sort($arr){
    
    
    //递归出口
    $len = count($arr);
    if($len <= 1) return $arr;

    //取出某个元素。然后将剩余的数组元素,分散到两个不同的数组中
    $left = $right = array();

    for($i = 1; $i < $len; $i++){
    
    
        //第一个元素作为比较元素
        //比较:小的放left,大的放right中
        if($arr[$i] < $arr[0]){
    
    
            $left[] = $arr[$i];
        }else{
    
    
            $right[] = $arr[$i];
        }
    }

    //left和right没有排好序:递归点
    $left = quick_sort($left);
    $right = quick_sort($right);

    //合并三个“数组”
    return array_merge($left,(array)$arr[0],$right);

}

echo '<pre>';
print_r(quick_sort($arr));

マージソート

マージソート
マージソート(マージソート)は、マージ操作に基づく効果的なソートアルゴリズムです。このアルゴリズムは、除算と征服の典型的なアプリケーションです。既存の順序付きサブシーケンスを組み合わせて、完全に順序付けられたシーケンスを取得します。つまり、最初に各サブシーケンスを使用して順序付けし、次にサブシーケンスを順番に終了させて​​から、2つの順序付きリストを1つの順序付きリストにマージします。これは2つになります。道路が合流しました。

マージソートアルゴリズムは次のとおり
です。1。アレイを2つのアレイ
に分割します。2。手順1を繰り返して、アレイを2つの最小単位に分割し
ます。3。スペースを適用して、ソートされた2つのシーケンスのサイズを合計にします。このスペースは、マージを格納するために使用されます。シーケンスの後
4.2つのポインターを設定します。初期位置は、それぞれ2つのソートされたシーケンスの開始位置です
。5。2つのポインターが指す要素を比較し、比較的小さい要素を選択してマージスペースに配置し、ポインターをに移動します。次の位置
6.ポインタがシーケンスの終わりを超えるまで手順3を繰り返します
。7。他のシーケンスの残りのすべての要素を直接コピーし、シーケンスの終わりをマージします。

//PHP数组算法:归并排序

/**二路归并*/
$arr1 = array(1,3,5);
$arr2 = array(2,4,6);

//取出数组用于归并空间
$arr3 = array();

while(count($arr1) && count($arr2)){
    
    
    //如果数组中都还有数据,则循环
    $arr3[] = $arr1[0] < $arr2[0] ? array_shift($arr1) :array_shift($arr2);
}
//print_r(array_merge($arr3,$arr1,$arr2));

/**归并排序*/
$arr = array(4,7,2,1,5,9,3,5,6);

//归并排序函数
function merge_sort($arr){
    
    
    //递归出口
    $len = count($arr);
    if($len <= 1) return $arr;

    //拆分
    $middle = floor($len/2);
    $left = array_slice($arr,0,$middle);
    $right = array_slice($arr,$middle);

    //递归出口
    $left = merge_sort($left);
    $right = merge_sort($right);

    //假设左边和右边都已经排序好了
    $arr3 = array();
    while(count($left) && count($right)){
    
    
        //只要$left和$right都还有元素
        $arr3[] = $left[0] < $right[0] ? array_shift($left) :array_shift($right);
    }
    return array_merge($arr3,$left,$right);
}
echo '<pre>';
$t1 = microtime(true);
print_r(merge_sort($arr));
$t2 = microtime(true);
echo '耗时' . round($t2 - $t1,3).;

検索アルゴリズム

検索アルゴリズムの意味:
検索とは、大量の情報から特定の情報要素を見つけることです。コンピューターアプリケーションでは、検索は一般的な基本操作です。検索アルゴリズムは、検索プロセスで対応するコードノットを参照します。大きな配列の中から目的の要素をすばやく見つけることです。

シーケンシャル検索アルゴリズム
シーケンシャル検索は線形検索とも呼ばれます。データ構造の線形テーブルのセクションから開始し、順次スキャンします。スキャンしたノードキーを指定されたk値と順番に比較します。これらが等しい場合、検索は成功します。検索が失敗したことを示す、kに等しいキーワードを持つノードを検索します

バイナリ検索アルゴリズム
バイナリ検索では、線形テーブルのノードがキーワードの昇順または降順で配置され、指定された値kを使用して中間ノードのキーワードが比較されます。中間ノードは、線形テーブルが等しい場合、2つのサブテーブルに分割します。検索は成功します。等しくない場合は、kと中間ノードキーの比較結果に基づいて次に検索するサブテーブルを決定し、検索または検索が終了してテーブルにそのようなノードがなくなるまで再帰的に続行します。

バイナリ検索コード:

//二分法查找
$arr = array(1,2,3,4,5,6,7);
$res = 100;

function check_break($arr,$res){
    
    
    //1、得到数组边界
    $right = count($arr)-1;
    $left = 0;

    //2、循环匹配
    while($right >= $left){
    
    
        //3、得到中间位置
        $middle = floor(($right + $left)/2);

        //4、匹配数据
        if($arr[$middle] == $res){
    
    
            return $middle + 1;
        }

        //没有找到
        if($arr[$middle] < $res){
    
    
            //值在右边
            $left = $middle + 1 ;
        }else{
    
    
            //值在左边
            $right  = $middle - 1;
        }
    }
    return false;
}

echo '<pre>';
var_dump(check_break($arr,$res));

それがあなたを助けるなら、それと同じように!

おすすめ

転載: blog.csdn.net/weixin_43477545/article/details/106826943