初识算法-算法思想的重要性

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

/* 问题目标:从包含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倍。

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

时间: 2024-08-04 20:46:36

初识算法-算法思想的重要性的相关文章

各种与视频编解码以及视频图像处理的应用相关的新技术,新方法,各种软件开发相关的算法,思想。

1. 各种视频压缩标准(MPEG2, MPEG4, H261/2/3/4,X264, T264以及H264(AVC)和HEVC(H265)等的优化,改进,创新. 2. 各种不同平台的(CPU, GPU, DSP, ARM等等)开发,移植优化等, 涉及到的语言包括C, C++, X86汇编,TI DSP汇编,ADI DSP汇编, ARM汇编(armv4/v5/v6/v7 XSCALE WMMX cortex A8等),MMX, SSE, SSE2/3等, 以及目前利用OpenCL来调用GPU实现并

【足迹C++primer】31、初识泛型算法

初识泛型算法 理解算法的最基本方法是了解他们是否读取元素.改变元素或是重排元素顺序! 只读算法 #include<iostream> #include<numeric> using namespace std; //对vec中的元素求和,初值是0 int sum=accumulate(vec.cbegin(), vec.cend(), 0); 这里面第三个参数决定了函数使用哪个加法运算符以及返回值类型. 算法和元素类型 string sum=accumulate(v.cbegin(

MP算法和OMP算法及其思想

主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Matching Pursuit)算法[1],这两个算法尽管在90年代初就提出来了,但作为经典的算法,国内文献(可能有我没有搜索到)都仅描写叙述了算法步骤和简单的应用,并未对其进行详尽的分析,国外的文献还是分析的非常透彻,所以我结合自己的理解,来分析一下写到博客里,算作笔记. 1. 信号的稀疏表示(sparse representation of signals) 给定一个过完备字典矩阵,当中它的每列表示一种原

O(n*lgn)时间复杂度的逆序对统计算法实现思想

逆序对定义:设A[1..n]是一个包含n个不同数的数组.如果在i<j的情况下,有A[i] > A[j],则(i,j)就称为A中的一个逆序对(inversion). 现给出一个算法,其可以用O(n*lgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数量. 简单的算法实现思想:我们可以单纯的通过从前往后的逐一比对来确定逆序对的数量,虽然实现简单,但这样一来时间复杂度将会上升为O(n*n),不符合我们的要求. 改进的算法实现思想:众所周知归并排序的时间复杂度为O(cn*lgn + cn),

初识聚类算法:K均值、凝聚层次聚类和DBSCAN

原文地址http://blog.sina.com.cn/s/blog_62186b460101ard2.html 这里只是将比较重要的部分转一下 另外还有一篇关于层次聚类的 http://blog.csdn.net/jwh_bupt/article/details/7685809 聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不同类型,通常有以下

五大算法基本思想—分治,动态规划,贪心,回溯,分支界限

一.算法理解 算法是什么,即是按照一定的步骤,一步步去解决某个问题,解决问题的方法步骤就称为算法,例如数学中我们学过的做一个运算,解一个方程,等等,都需要有一个清晰的思路,一步步地去完成.可以说算法就在身边. 算法和计算机有什么关系,计算机它是机器,没有人类的大脑可以思考,但是它怎么完成我们交给他的人物的呢,就是通过算法(当然是人为预先设计好的),计算机解决任何问题都要依赖于算法,没有算法也就没有计算机. 为了计算机能更好更有效率的运行,算法就必须足够好,既要正确易理解,又要可靠效率.下面来研究

最小生成树的Prime算法的思想

普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现:1959年,艾兹格·迪科斯彻再次发现了该算法.因此,在某些场合,普里姆算法又被称为D

推荐系统的常用算法----算法岗面试题

● 请你说一说推荐算法,fm,lr,embedding 参考回答: 推荐算法: 基于人口学的推荐.基于内容的推荐.基于用户的协同过滤推荐.基于项目的协同过滤推荐.基于模型的协同过滤推荐.基于关联规则的推荐 FM: LR: 逻辑回归本质上是线性回归,只是在特征到结果的映射中加入了一层逻辑函数g(z),即先把特征线性求和,然后使用函数g(z)作为假设函数来预测.g(z)可以将连续值映射到0 和1.g(z)为sigmoid function. 则 sigmoid function 的导数如下: 逻辑回

处理聚类问题常用算法-----算法岗面试题

● 什么是DBSCAN 参考回答: DBSCAN是一种基于密度的空间聚类算法,它不需要定义簇的个数,而是将具有足够高密度的区域划分为簇,并在有噪声的数据中发现任意形状的簇,在此算法中将簇定义为密度相连的点的最大集合. ● k-means算法流程 参考回答: 从数据集中随机选择k个聚类样本作为初始的聚类中心,然后计算数据集中每个样本到这k个聚类中心的距离,并将此样本分到距离最小的聚类中心所对应的类中.将所有样本归类后,对于每个类别重新计算每个类别的聚类中心即每个类中所有样本的质心,重复以上操作直到

[数据结构和算法]算法基本概念

算法基本概念: 算法:用来对数据的操作作描述,是对问题求解的步骤的描述.是一系列将输入转为输出的计算步骤 算法复杂度:分为时间复杂度和空间复杂度时间复杂度:算法中所有语句的频度之和用T(n)表示,记为T(n) = O(n) 常见时间复杂度递增次序:常数 O(1) , 对数阶O(log2^n) , 线性阶O(n) , 线形对数阶O(nlog2^n),平方阶O(n^2),立方阶O(n^3),指数阶O(2^n),O(n!),O(n^n)当n值增大,算法时间复杂度即变大,执行效率变低 最坏时间复杂度:最