zoukankan      html  css  js  c++  java
  • 初识算法-算法思想的重要性

    程序举例:不同的方法,处理相同的程序,执行效率上会有什么差别?

    /* 问题目标:从包含1000个值的数组(值为1-100的随机数)中得到不重复的值。*/

    方法一:

    /* 进行循环比较,
     *    $myda中第一个值 和 后面999个值进行比较,如果找不到与之相等的值,则将第一个值放进结果数组($goal)中,否则继续进行比较
     * 然后 $myda中第2个值 和 后面998个值进行比较,如果找不到与之相等的值,则将第一个值放进结果数组($goal)中
     * 一次类推,知道数组循环完毕*/


    /* 第一步:构造一个$myda数组。其中数组长度为1000,值为1-100的随机数 */
    $i=0;
    $myda=array();
    while($i<1000){
        $i++;
        array_push($myda, mt_rand(1, 100));
    }
    echo '待处理的数组长度:'.count($myda); //打印数组长度
    echo "</br>";
    echo "</br>";

    /* 第二步 : 通过两层循环,得到目标数组*/
    $start=microtime(true);//返回当前的时间戳 (Return current Unix timestamp with microseconds)
    $goal=array(); //定义目标数组,用来存放目标结果。

    $j=0;

    第一层循环
     while($j<count($myda)-1){
         $s=$j+1;
         $falg=true;

         第二层循环
         while($s<count($myda)){
             if($myda[$j]==$myda[$s]){    //将$myda[$j]与$myda中出本身外的其他所有值进行比较
                $falg=false;
             }
             $s++;
         }
         if($falg==true){      //成立则代表:$myda[$j]在 $myda中是独一无二的。即可将$myda[$j] 放入目标数组 $goal中。
            array_push($goal, $myda[$j]);
         }
         $j++;
     }
     array_push($goal, $myda[999]);

     echo '目标数组长度:'.count($goal);
     echo "</br>";
     $end=microtime(true);
     echo "程序运行时间:";echo $end-$start."秒";//打印出程序运行所花费的时间
     
     /* 将结果 按值升序排列,此时得到的目标数据存放在 $goal的值中。*/
     sort($goal);
     
     var_dump($goal);

    运行结果如下:

    结果:成功得到1-100的所有不重复的数据。程序运行时间为:5.4秒

    方法二:

    /* 循环遍历$myda 数组中的值一次,
     * 如果在将任意$myda的值$myda[$j],作为$goal的键时,$goal[$myda[$j]]未定义,则定义$goal[$myda[$j]],此时$myda[$j]是$goal的一个键
     * 因此循环遍历结束后,$goal中的键会存放所有,$myda中不相等的值。*/

    /*同上 第一步:构造一个$myda数组。其中数组长度为1000,值为1-100的随机数 */


    $i=0;
    $myda=array();
    while($i<1000){
        $i++;
        array_push($myda, mt_rand(1, 100));
    }
    echo '待处理的数组长度:'.count($myda); //打印数组长度
    echo "</br>";
    echo "</br>";


     $j=0;
      while($j<count($myda)){
          if(empty($goal[$myda[$j]])==1){
            $goal[$myda[$j]]=1;    //将$myda中不相等的值,定义为$goal数组的一个键
          }
          $j++;
      }
     
     echo '目标数组长度:'.count($goal);
     echo "</br>";
     $end=microtime(true);
     echo "程序运行时间:";echo $end-$start."秒";     //打印出程序运行所花费的时间
     
     /* 将结果 按键升序排列,因为此时得到的目标数据存放在 $goal的键中。*/
     ksort($goal);
     var_dump($goal);

    运行结果如下:

    结果:同样,成功得到1-100的所有不重复的数据。程序运行时间为:0.0099秒

    综合以上两种方法:

    同样都可以得到想要的结果。但是在运行时间上:

    程序一:5.4秒

    关键代码执行次数:(999+0)*1000/2 ,大于为50,0000次

    程序二:0.0099秒

    关键代码执行次数:1000次

    5.4 (秒)/ 0.0099(秒)=545.4545。

    程序一的执行时间是程序二执行时间的545倍。

    假如 程序一要执行一年半,同样的处理结果,程序二只需要执行一天。

  • 相关阅读:
    Dubbo笔记(二)
    Dubbo笔记(一)
    初识多线程
    Redis底层结构全了解
    用golang刷算法--归并排序算法
    谈谈golang中的channel
    用golang刷算法--快速排序算法
    谈谈golang中的引用类型与地址分配
    Arch安装后的配置(超详细)
    ArchLinux安装(Deepin v20桌面环境)
  • 原文地址:https://www.cnblogs.com/ahguSH/p/5797059.html
Copyright © 2011-2022 走看看