数码资讯
PHP巧妙地减少了带有数组的程序的时间复杂度。
关于作者 王丹丹,IBM中国系统与科技中心的软件工程师,一直以来她在2006加入IBM公司从事网络系统的设计与开发。她有五年的PHP应用程序设计和开发经验。 通常,当开发人员编写的程序,通常是由编程语言翻译,这已被设计或设想,程序可以编译成功了,这是一件很愉快的事。如果程序运行的时间还是可以接受的,
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
关于作者
王丹丹,IBM中国系统与科技中心的软件工程师,一直以来她在2006加入IBM公司从事网络系统的设计与开发。她有五年的PHP应用程序设计和开发经验。
通常,当开发人员编写的程序,通常是由编程语言翻译,这已被设计或设想,程序可以编译成功了,这是一件很愉快的事。如果程序运行的时间还是可以接受的,这是沉浸在写代码的意义,往往忽略代码的优化在这个过程中,只有当程序的速度受到影响,这是回想优化。本文主要介绍了如何使用数组来降低时间复杂度在PHP编程的多层周期造成的。特别是,当程序需要与数据库的多次互动,此方法用于优化你的代码,而CH会带来意想不到的结果。
算法的时间复杂度是多少
时间复杂度的主要因素,开发人员使用测量的优点和应用算法的缺点。客观地说,该算法的优缺点是时间复杂度有关,而且对空间的复杂性密切相关。对设备硬件配置的不断提高,对算法的空间复杂度的要求,也为中小型应用宽松。然而,在当前的Web2.0时代,时间复杂度有较高要求的应用。
算法的时间复杂度是多少总之,它指的是选择一个能代表从算法的原始操作,和时代的原始操作数是重复作为算法的时间量度。有影响时间复杂度两方面的因素:一是原操作的执行时间,和两个由原来的操作控制结构引起的执行次数。很容易降低算法的时间复杂度和降低原操作数。本文所述的方法主要是巧妙地利用PHP数组来减少原操作的执行时间,以减少算法的时间复杂度,并与大家分享。
算法的时间度量写为t(n)=o(f(n))。这意味着算法中的基本运算次数反复重复,这是问题规模n的函数f(n)。也就是说,随着问题规模的增大,算法的执行时间的增长率是相同的,F(n)。在大多数情况下,我们使用的句子在深循环的原始操作来讨论算法的时间复杂度,因为它执行的次数是作为包含它的语句的频率相同,在一般情况下,它选择一个讨论算法的时间复杂度问题的一个基本操作是必要的,有时需要同时考虑各种基本操作。
在web开发中,一个函数的执行时间或响应时间不仅是响应速度和服务器的处理能力,而且对第三方工具的相互作用时间,如链路时间数据库和时间来访问数据。因此,当选择原来的操作,我们需要考虑所有因素的综合应用,并测量与影响程序的执行时间为原来的操作运行的算法的时间复杂度。也就是说,它是必要的,程序员有一个基本的了解的重要操作的执行时间的代码编写。
常用程序的时间复杂度分析
让我们先看一个例子。假设Web程序的开发语言是PHP,后台使用DB2数据库,PHP通过XML:DB数据抽象层实现对数据库的访问。
例子
在数据库中,有学生表学生(见表1)、班级表类(见表2)、学生成绩表成绩(见表3),我们需要显示数学分数超过90分的学生的姓名和班级。
表1。学生表
列名称
描述
希德
不.
stuname
全名
性别
性别
年龄
年龄
classid
类数
…
表2。课程表
列名称
描述
classid
类数
类名
类名称
…
表3。评分表
列名称
描述
希德
SnO
课程
主题
退休主管服务队
成就
…
根据个人编程习惯的不同,通常有两种方法来解决这个问题(访问数据库的操作以梨:DB)表示,参考方法1和2。
{方法1 }对三张学生、班级和分数表进行联合查询,一次获取学生的信息和满足条件的课堂信息:
清单1。方法1
复制代码代码如下所示:
querystr美元=选择不同的s.stuname作为stuname,c.classname作为类名。
从学生s,类为C,分数为R 。
在s.sid = r.sid和s.classid = c.classid和r.course = 'math '。
和r.score > = 90 ;
美元db2handle ->查询结果= $(美元; / / querystr)得到的数据从一个数据库
而($行= $结果-> fetchrow(db_fetchmode_assoc)){
读取和显示数据
回声studentname ={ } 'stuname美元的行。 T classname ={ } 'classname美元的行。;
}
{方法2 }找出满足评分表要求的学生编号,然后从学生表中查找学生的名称和类代码,最后得到类表中类的名称:
清单2。方法2
复制代码代码如下所示:
scorestr美元=选择不同的SID从分数课程= 'math'and评分> = 90 ;
scoredata美元=美元db2handle ->查询($ scorestr);
从数据库中获得学生的条件
而(得分=美元美元scoredata -> fetchrow(db_fetchmode_assoc)){
在学生表中阅读学生ID和姓名和班级号码以便找到学生。
studentstr美元=选择stuname,从学生那里SID =$评分{ SID ClassID。}。;
studata美元=美元db2handle ->查询($ studentstr);
研究studata美元美元= -> fetchrow(db_fetchmode_assoc);
显示学生的名字
回声studentname ={ } 'stuname美元的研究。;
学生在课堂上搜索班级名称和搜索班级表的人数。
classstr美元=选择从类类名classid =$斯图{ 'classid'}。;
美元db2handle ->查询类的= $(美元classstr);
美元类=美元类-> fetchrow(db_fetchmode_assoc);
显示学生/班级
回声ClassName ={ } 'classname美元类的。;
为获得每个学生的ID. Done而结束
这样的算法描述,相信会有一种似曾相识的感觉,这也是一种算法,大多数程序员都广泛使用。因为习惯翻译算法的逻辑代码直接,没有时间和心思去考虑算法的优缺点。这里是对这两个算法的时间复杂性分析。
因为时间,Web服务器读取并显示数据比较小,通常在大小为10ms的时间顺序,从DB2数据库查询和获取数据的大小将100ms的大小,它会随着数据的增加,查询,查询数据库的操作可以作为测量时间的原操作复杂性。学生表和成绩表的数据量为问题规模的N(通常,类表的数据量小且相对稳定)。
方法1、随问题规模N,数据库的访问数是1。因此,时间复杂度为T(n)= O(1)。方法2,如果在评分表的条件的记录,对原执行的操作数M + 1.that是说,作为数据大小规模的增大,对原操作数是线性增长的。可以看出,时间复杂度为T(n)= O(n)。可以看出,方法1的时间复杂度低。
那么方法1的问题在哪里呢主要原因是,方法1增加,数据库负载,对原操作的执行时间的问题,假设学生,班数规模影响较大,而分数x,y,z,分别执行联合查询操作时,一个X Y×Z号码在数据库中形成的矩阵,然后找到记录,满足要求的矩阵,最后得到的信息和记录stuname类名。这样,任何表中数据量的增加将导致增加增加记录在矩阵表。
使用数组优化算法
主要思想:在比较简单的数据和稳定的数据量的情况下,使用PHP数组(array)下标(指数)可以暂时临时存储数据到字符串的特征数组(字符串)。这样,所需的值可以迅速获得的指标,从而减少对数据库查询的次数,进而降低了算法的时间复杂度。
{ 3 }从课程表方法ClassID和类名之间的对应关系,并将其存储在classarray一维数组,从学生表希德和stuname和classid之间的对应关系,并将其存储在stuarray二维数组。之后,发现符合要求的成绩表、学生人数,从stuarray阵列读学生的名字和类数,从classarray读取类名。PHP算法描述如下:
清单3。方法3
复制代码代码如下所示:
classarray美元=阵();
stuarray美元=阵();
classstr美元=选择classid,从类className;
美元db2handle ->查询类的= $(美元classstr);
而(合类类美元-> fetchrow(db_fetchmode_assoc)){
生成 / / classarray数组下标索引命名的ClassID,相应的值是
classarray美元{ $类{ } } =美元'classid类'classname'} {;
} / /结束而classarray美元
stustr美元=选择SID,stuname,从学生classid;
studata美元=美元db2handle ->查询($ stustr);
而($斯图=美元studata -> fetchrow(db_fetchmode_assoc)){
生成 / / stuarray数组下标索引,名为SID,对于相应的价值stuname和classid
stuarray美元{ $ { } { }斯图SID 'stuname} = { } 'stuname美元的研究;
stuarray美元{ $ { } { }斯图SID 'classid} = { } 'classid美元的研究;
} / /结束而stuarray美元
scorestr美元=选择不同的SID从分数课程= 'math'and评分> = 90 ;
scoredata美元=美元db2handle ->查询($ scorestr);
从数据库中获得学生的条件
而(得分=美元美元scoredata -> fetchrow(db_fetchmode_assoc)){
/ /读学生从stuarray名字读,读classarray类的名字
回声studentname =美元。stuarray { $评分{ } } { 'stuname SID}。;
回声ClassName = 。classarray美元美元美元stuarray { { { } { }得分SID 'classid} }。;
为获得每个学生的ID. Done而结束
该改进方法的时间复杂度仍然是T(n)= O(1)。与方法1相比,方法3不必担心将提高数据库查询的单表的增加导致的成本。与方法2相比,时间是降低复杂度,和算法的空间复杂度是不受影响的。有一石二鸟。
虽然这种优化方法简单易用,但这并不意味着它是万能的,使用时需要考虑的问题。假设在学生表的数据量大,那么系统内存的消耗将增加stuarray时产生的,所以算法复杂度将的影响。此外,在数据量足够大,影响了算法的执行时间的主要因素有变化,和原来的操作需要重新选择。在学生表的记录和稳定的类表小记录大量的观点,我们可以考虑嵌套查询与阵列的优化算法,这里给出的参考方法4。
{ 4 }方法从课程表的ClassID和类名的对应关系存储在classarray阵列。查询学生人数从成绩表得到学生的stuname和CLASSID为查询学生表的查询条件,然后类的名称是从classarray读。PHP算法描述如下:
清单4。方法4
复制代码代码如下所示:
classarray美元=阵();
classstr美元=选择classid,从类className;
美元db2handle ->查询类的= $(美元classstr);
而(合类类美元-> fetchrow(db_fetchmode_assoc)){
生成 / / classarray数组下标索引命名的ClassID,相应的值是
classarray美元{ $类{ } } =美元'classid类'classname'} {;
} / /结束而classarray美元
stustr美元=选择stuname,从学生在SID classid。
(选择不同的SID从分数课程= 'm'and评分> = 90);
studata美元=美元db2handle ->查询($ stustr);
获取学生姓名和班级号码,以满足来自数据库的条件。
而($斯图=美元studata -> fetchrow(db_fetchmode_assoc)){
/ /读学生的名字,并从classarray读类的名字
回声studentname ={ } 'stuname美元的研究。;
回声ClassName =美元。classarray { $斯图{ 'classid} }。;
为获得每个学生的信息而结束。多恩
总结
方法3和方法4参照阵列的小技巧,巧妙地降低了算法的时间复杂度,在实际应用中,该算法的逻辑是非常复杂的,和算法的优化需要综合考虑的因素很多,需要提出本文所描述的方法是不只适用于PHP应用程序。如果编程语言支持的字符串作为数组下标,我们可以考虑采用本文提出的方法:使用数组来降低算法的时间复杂度的下标。编程语言不支持字符串数组下标,你可以考虑使用一个哈希表来达到相同的效果。
王丹丹,IBM中国系统与科技中心的软件工程师,一直以来她在2006加入IBM公司从事网络系统的设计与开发。她有五年的PHP应用程序设计和开发经验。
通常,当开发人员编写的程序,通常是由编程语言翻译,这已被设计或设想,程序可以编译成功了,这是一件很愉快的事。如果程序运行的时间还是可以接受的,这是沉浸在写代码的意义,往往忽略代码的优化在这个过程中,只有当程序的速度受到影响,这是回想优化。本文主要介绍了如何使用数组来降低时间复杂度在PHP编程的多层周期造成的。特别是,当程序需要与数据库的多次互动,此方法用于优化你的代码,而CH会带来意想不到的结果。
算法的时间复杂度是多少
时间复杂度的主要因素,开发人员使用测量的优点和应用算法的缺点。客观地说,该算法的优缺点是时间复杂度有关,而且对空间的复杂性密切相关。对设备硬件配置的不断提高,对算法的空间复杂度的要求,也为中小型应用宽松。然而,在当前的Web2.0时代,时间复杂度有较高要求的应用。
算法的时间复杂度是多少总之,它指的是选择一个能代表从算法的原始操作,和时代的原始操作数是重复作为算法的时间量度。有影响时间复杂度两方面的因素:一是原操作的执行时间,和两个由原来的操作控制结构引起的执行次数。很容易降低算法的时间复杂度和降低原操作数。本文所述的方法主要是巧妙地利用PHP数组来减少原操作的执行时间,以减少算法的时间复杂度,并与大家分享。
算法的时间度量写为t(n)=o(f(n))。这意味着算法中的基本运算次数反复重复,这是问题规模n的函数f(n)。也就是说,随着问题规模的增大,算法的执行时间的增长率是相同的,F(n)。在大多数情况下,我们使用的句子在深循环的原始操作来讨论算法的时间复杂度,因为它执行的次数是作为包含它的语句的频率相同,在一般情况下,它选择一个讨论算法的时间复杂度问题的一个基本操作是必要的,有时需要同时考虑各种基本操作。
在web开发中,一个函数的执行时间或响应时间不仅是响应速度和服务器的处理能力,而且对第三方工具的相互作用时间,如链路时间数据库和时间来访问数据。因此,当选择原来的操作,我们需要考虑所有因素的综合应用,并测量与影响程序的执行时间为原来的操作运行的算法的时间复杂度。也就是说,它是必要的,程序员有一个基本的了解的重要操作的执行时间的代码编写。
常用程序的时间复杂度分析
让我们先看一个例子。假设Web程序的开发语言是PHP,后台使用DB2数据库,PHP通过XML:DB数据抽象层实现对数据库的访问。
例子
在数据库中,有学生表学生(见表1)、班级表类(见表2)、学生成绩表成绩(见表3),我们需要显示数学分数超过90分的学生的姓名和班级。
表1。学生表
列名称
描述
希德
不.
stuname
全名
性别
性别
年龄
年龄
classid
类数
…
表2。课程表
列名称
描述
classid
类数
类名
类名称
…
表3。评分表
列名称
描述
希德
SnO
课程
主题
退休主管服务队
成就
…
根据个人编程习惯的不同,通常有两种方法来解决这个问题(访问数据库的操作以梨:DB)表示,参考方法1和2。
{方法1 }对三张学生、班级和分数表进行联合查询,一次获取学生的信息和满足条件的课堂信息:
清单1。方法1
复制代码代码如下所示:
querystr美元=选择不同的s.stuname作为stuname,c.classname作为类名。
从学生s,类为C,分数为R 。
在s.sid = r.sid和s.classid = c.classid和r.course = 'math '。
和r.score > = 90 ;
美元db2handle ->查询结果= $(美元; / / querystr)得到的数据从一个数据库
而($行= $结果-> fetchrow(db_fetchmode_assoc)){
读取和显示数据
回声studentname ={ } 'stuname美元的行。 T classname ={ } 'classname美元的行。;
}
{方法2 }找出满足评分表要求的学生编号,然后从学生表中查找学生的名称和类代码,最后得到类表中类的名称:
清单2。方法2
复制代码代码如下所示:
scorestr美元=选择不同的SID从分数课程= 'math'and评分> = 90 ;
scoredata美元=美元db2handle ->查询($ scorestr);
从数据库中获得学生的条件
而(得分=美元美元scoredata -> fetchrow(db_fetchmode_assoc)){
在学生表中阅读学生ID和姓名和班级号码以便找到学生。
studentstr美元=选择stuname,从学生那里SID =$评分{ SID ClassID。}。;
studata美元=美元db2handle ->查询($ studentstr);
研究studata美元美元= -> fetchrow(db_fetchmode_assoc);
显示学生的名字
回声studentname ={ } 'stuname美元的研究。;
学生在课堂上搜索班级名称和搜索班级表的人数。
classstr美元=选择从类类名classid =$斯图{ 'classid'}。;
美元db2handle ->查询类的= $(美元classstr);
美元类=美元类-> fetchrow(db_fetchmode_assoc);
显示学生/班级
回声ClassName ={ } 'classname美元类的。;
为获得每个学生的ID. Done而结束
这样的算法描述,相信会有一种似曾相识的感觉,这也是一种算法,大多数程序员都广泛使用。因为习惯翻译算法的逻辑代码直接,没有时间和心思去考虑算法的优缺点。这里是对这两个算法的时间复杂性分析。
因为时间,Web服务器读取并显示数据比较小,通常在大小为10ms的时间顺序,从DB2数据库查询和获取数据的大小将100ms的大小,它会随着数据的增加,查询,查询数据库的操作可以作为测量时间的原操作复杂性。学生表和成绩表的数据量为问题规模的N(通常,类表的数据量小且相对稳定)。
方法1、随问题规模N,数据库的访问数是1。因此,时间复杂度为T(n)= O(1)。方法2,如果在评分表的条件的记录,对原执行的操作数M + 1.that是说,作为数据大小规模的增大,对原操作数是线性增长的。可以看出,时间复杂度为T(n)= O(n)。可以看出,方法1的时间复杂度低。
那么方法1的问题在哪里呢主要原因是,方法1增加,数据库负载,对原操作的执行时间的问题,假设学生,班数规模影响较大,而分数x,y,z,分别执行联合查询操作时,一个X Y×Z号码在数据库中形成的矩阵,然后找到记录,满足要求的矩阵,最后得到的信息和记录stuname类名。这样,任何表中数据量的增加将导致增加增加记录在矩阵表。
使用数组优化算法
主要思想:在比较简单的数据和稳定的数据量的情况下,使用PHP数组(array)下标(指数)可以暂时临时存储数据到字符串的特征数组(字符串)。这样,所需的值可以迅速获得的指标,从而减少对数据库查询的次数,进而降低了算法的时间复杂度。
{ 3 }从课程表方法ClassID和类名之间的对应关系,并将其存储在classarray一维数组,从学生表希德和stuname和classid之间的对应关系,并将其存储在stuarray二维数组。之后,发现符合要求的成绩表、学生人数,从stuarray阵列读学生的名字和类数,从classarray读取类名。PHP算法描述如下:
清单3。方法3
复制代码代码如下所示:
classarray美元=阵();
stuarray美元=阵();
classstr美元=选择classid,从类className;
美元db2handle ->查询类的= $(美元classstr);
而(合类类美元-> fetchrow(db_fetchmode_assoc)){
生成 / / classarray数组下标索引命名的ClassID,相应的值是
classarray美元{ $类{ } } =美元'classid类'classname'} {;
} / /结束而classarray美元
stustr美元=选择SID,stuname,从学生classid;
studata美元=美元db2handle ->查询($ stustr);
而($斯图=美元studata -> fetchrow(db_fetchmode_assoc)){
生成 / / stuarray数组下标索引,名为SID,对于相应的价值stuname和classid
stuarray美元{ $ { } { }斯图SID 'stuname} = { } 'stuname美元的研究;
stuarray美元{ $ { } { }斯图SID 'classid} = { } 'classid美元的研究;
} / /结束而stuarray美元
scorestr美元=选择不同的SID从分数课程= 'math'and评分> = 90 ;
scoredata美元=美元db2handle ->查询($ scorestr);
从数据库中获得学生的条件
而(得分=美元美元scoredata -> fetchrow(db_fetchmode_assoc)){
/ /读学生从stuarray名字读,读classarray类的名字
回声studentname =美元。stuarray { $评分{ } } { 'stuname SID}。;
回声ClassName = 。classarray美元美元美元stuarray { { { } { }得分SID 'classid} }。;
为获得每个学生的ID. Done而结束
该改进方法的时间复杂度仍然是T(n)= O(1)。与方法1相比,方法3不必担心将提高数据库查询的单表的增加导致的成本。与方法2相比,时间是降低复杂度,和算法的空间复杂度是不受影响的。有一石二鸟。
虽然这种优化方法简单易用,但这并不意味着它是万能的,使用时需要考虑的问题。假设在学生表的数据量大,那么系统内存的消耗将增加stuarray时产生的,所以算法复杂度将的影响。此外,在数据量足够大,影响了算法的执行时间的主要因素有变化,和原来的操作需要重新选择。在学生表的记录和稳定的类表小记录大量的观点,我们可以考虑嵌套查询与阵列的优化算法,这里给出的参考方法4。
{ 4 }方法从课程表的ClassID和类名的对应关系存储在classarray阵列。查询学生人数从成绩表得到学生的stuname和CLASSID为查询学生表的查询条件,然后类的名称是从classarray读。PHP算法描述如下:
清单4。方法4
复制代码代码如下所示:
classarray美元=阵();
classstr美元=选择classid,从类className;
美元db2handle ->查询类的= $(美元classstr);
而(合类类美元-> fetchrow(db_fetchmode_assoc)){
生成 / / classarray数组下标索引命名的ClassID,相应的值是
classarray美元{ $类{ } } =美元'classid类'classname'} {;
} / /结束而classarray美元
stustr美元=选择stuname,从学生在SID classid。
(选择不同的SID从分数课程= 'm'and评分> = 90);
studata美元=美元db2handle ->查询($ stustr);
获取学生姓名和班级号码,以满足来自数据库的条件。
而($斯图=美元studata -> fetchrow(db_fetchmode_assoc)){
/ /读学生的名字,并从classarray读类的名字
回声studentname ={ } 'stuname美元的研究。;
回声ClassName =美元。classarray { $斯图{ 'classid} }。;
为获得每个学生的信息而结束。多恩
总结
方法3和方法4参照阵列的小技巧,巧妙地降低了算法的时间复杂度,在实际应用中,该算法的逻辑是非常复杂的,和算法的优化需要综合考虑的因素很多,需要提出本文所描述的方法是不只适用于PHP应用程序。如果编程语言支持的字符串作为数组下标,我们可以考虑采用本文提出的方法:使用数组来降低算法的时间复杂度的下标。编程语言不支持字符串数组下标,你可以考虑使用一个哈希表来达到相同的效果。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。