返回首页

php常用算法和时间复杂度?

98 2024-04-01 09:08 admin

一、php常用算法和时间复杂度?

按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3)

复制代码 代码如下:

//二分查找O(log2n)

function erfen($a,$l,$h,$f){

if($l >$h){ return false;}

$m = intval(($l+$h)/2);

if ($a[$m] == $f){

return $m;

}elseif ($f < $a[$m]){

return erfen($a, $l, $m-1, $f);

}else{

return erfen($a, $m+1, $h, $f);

}

}

$a = array(1,12,23,67,88,100);

var_dump(erfen($a,0,5,1));

//遍历树O(log2n)

function bianli($p){

$a = array();

foreach (glob($p.'/*') as $f){

if(is_dir($f)){

$a = array_merge($a,bianli($f));

}else{

$a[] = $f;

}

}

return $a;

}

//阶乘O(log2n)

function jc($n){

if($n<=1){

return 1;

}else{

return $n*jc($n-1);

}

}

//快速查找 O(n *log2(n))

function kuaisu($a){

$c = count($a);

if($c <= 1){return $a;}

$l = $r = array();

for ($i=1;$i<$c;$i++){

if($a[$i] < $a[0]){

$l[] = $a[$i];

}else{

$r[] = $a[$i];

}

}

$l = kuaisu($l);

$r = kuaisu($r);

return array_merge($l,array($a[0]),$r);

}

//插入排序 O(N*N)

function charu($a){

$c = count($a);

for($i=1;$i<$c;$i++){

$t = $a[$i];

for($j=$i;$j>0 && $a[$j-1]>$t;$j--){

$a[$j] = $a[$j-1];

}

$a[$j] = $t;

}

return $a;

}

//选择排序O(N*N)

function xuanze($a){

$c = count($a);

for($i=0;$i<$c;$i++){

for ($j=$i+1;$j<$c;$j++){

if($a[$i]>$a[$j]){

$t = $a[$j];

$a[$j] = $a[$i];

$a[$i] = $t;

}

}

}

return $a;

}

//冒泡排序 O(N*N)

function maopao($a){

$c = count($a);

for($i=0;$i<$c;$i++){

for ($j=$c-1;$j>$i;$j--){

if($a[$j] < $a[$j-1]){

$t = $a[$j-1];

$a[$j-1] = $a[$j];

$a[$j] = $t;

}

}

}

return $a;

}

复制代码 代码如下:

/**

* 排列组合

* 采用二进制方法进行组合的选择,如表示5选3时,只需有3位为1就可以了,所以可得到的组合是 01101 11100 00111 10011 01110等10种组合

*

* @param 需要排列的数组 $arr

* @param 最小个数 $min_size

* @return 满足条件的新数组组合

*/

function plzh($arr,$size=5) {

$len = count($arr);

$max = pow(2,$len);

$min = pow(2,$size)-1;

$r_arr = array();

for ($i=$min; $i<$max; $i++){

$count = 0;

$t_arr = array();

for ($j=0; $j<$len; $j++){

$a = pow(2, $j);

$t = $i&$a;

if($t == $a){

$t_arr[] = $arr[$j];

$count++;

}

}

if($count == $size){

$r_arr[] = $t_arr;

}

}

return $r_arr;

}

$pl = pl(array(1,2,3,4,5,6,7),5);

var_dump($pl);

二、php异或算法?

/**

* PHP字符串“异或”算法

* param array key

* @param Request $request

* @return mixed|string|void

*/

public function setSecretKey(Request $request){

$keyArr = $request->input('key');

if(!is_array($keyArr) || empty($keyArr))

return;

foreach ($keyArr as $v){

if(empty($v) || (strlen($v) != 32)){

return;

}

}

if(count($keyArr) == 1)

return $keyArr[0];

$arrLength = count($keyArr);

$initKey = "00000000000000000000000000000000";

$initKeyArr = str_split($initKey);

for($i = 0;$i < $arrLength;$i++){

$newKey = '';

for($j = 0;$j < strlen($keyArr[$i]);$j++){

$str = '';

$tmpArr = str_split($keyArr[$i]);

$tmpA = str_pad(base_convert($tmpArr[$j],16,2),4,0,STR_PAD_LEFT);

$tmpB = str_pad(base_convert($initKeyArr[$j],16,2),4,0,STR_PAD_LEFT);

for($k=0;$k<strlen($tmpA);$k++){

$str .=(intval($tmpA[$k]) ^ intval($tmpB[$k]));

}

$tmpOneKey = strtoupper(base_convert($str,2,16));

unset($str);

$newKey .= $tmpOneKey;

}

unset($initKeyArr);

$initKeyArr = str_split($newKey);

}

return join($initKeyArr);

}

三、php经典趣味算法

php function bubbleSort($arr) { $n = count($arr); for ($i = 0; $i < $n - 1; $i++) { for ($j = 0; $j < $n - $i - 1; $j++) { if ($arr[$j] > $arr[$j + 1]) { $temp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $temp; } } } return $arr; }

四、tts 常用算法?

TTS是Text To Speech的缩写,即从文本到语音,是人机对话的一部分,让机器能够说话。要合成出高质量的语音,所采用的算法是极为复杂的。

它是同时运用语言学和心理学的杰出之作,在内置芯片的支持之下,通过神经网络的设计,把文字智能地转化为自然语音流。

TTS技术对文本文件进行实时转换,转换时间之短可以秒计算。

在其特有智能语音控制器作用下,文本输出的语音音律流畅,

使得听者在听取信息时感觉自然,毫无机器语音输出的冷漠与生涩感。

五、php经典版本?

您好,很高兴为您解答: 开发新项目:推荐使用PHP7的版本,他是一个趋势,也是优化后的结晶,他的效率非常高。

维护老项目:推荐使用PHP5.2的版本,非常稳定!

使用开源项目/CMS之类的:查询源码支持的PHP版本,一般官网都有文档,像DeDecms推荐使用PHP5.2,WP最新版本推荐PHP7 Laravel,Thinkphp5也支持PHP7了

六、如何实现PHP的TEA算法?

  算法简单,而且效率高,每次可以操作8个字节的数据,加密解密的KEY为16字节,即包含4个int数据的int型数组,加密轮数应为8的倍数,一般比较常用的轮数为64,32,16,QQ原来就是用TEA16来还原密码的.  TEA算法  核心为:  PHP部分代码非我原创,大家可以了解一下这方面的知识  上面的是TEA的算法,XTEA的算法为:  #include

七、目标排序常用算法?

1选择排序

找到数组中最小的元素,和第一个元素交换,再在剩余的元素中(未排序元素)找到最小的元素,和第二个元素交换,如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它不断地在剩余元素中选择最小者。

2插入排序

插入排序比较类似与我们生活中给一副乱序的扑克牌排序的过程,从第一张牌开始,第一张牌先放着,第二张牌和第一张牌比较,小的放前面,第三张牌在与前面两张比较,插入到合适的位置,特点是前面的牌是排好顺序的,后面拿出的牌根据大小再去排好位置。具体过程是:新拿到的牌先和排序好的最后一张牌比较,若是新牌大,结束,否则就交换,这样依次交换,直到把新牌放入合适位置。

八、php显示时间常用方法小结?

一、PHP函数Date()获取当前时间

代码如下:<?php echo $showtime=date("Y-m-d H:i:s");?>

显示的格式: 年-月-日 小时:分钟:秒

相关参数:

a:"am"或者"pm"

A:"AM"或者"PM"

d:几日,二位数字,若不足二位则前面补零,如: "01"至"31"

D:星期几,三个英文字母,如: "Fri"

F:月份,英文全名,如: "January"

h:12 小时制的小时,如: "01"至"12"

H:24 小时制的小时,如: "00"至"23"

g:12 小时制的小时,不足二位不补零,如: "1"至12"

G:24 小时制的小时,不足二位不补零,如: "0"至"23"

i:分钟,如: "00"至"59"

j:几日,二位数字,若不足二位不补零,如: "1"至"31"

l:星期几,英文全名,如:"Friday"

m:月份,二位数字,若不足二位则在前面补零;如: "01"至"12"

n:月份,二位数字,若不足二位则不补零;如:"1"至"12"

M:月份,三个英文字母;如:"Jan"

s:秒;如:"00"至"59"

S:字尾加英文序数,二个英文字母;如:"th"、"nd"

t:指定月份的天数;如:"28"至"31"

U:总秒数

w:数字型的星期几,如: "0"(星期日)至"6"(星期六)

Y:年,四位数字;如:"1999"

y:年,二位数字;如:"99"

z:一年中的第几天;如:"0"至"365"

二、PHP5中Date()函数获取时间相差8小时问题的解决方法

只需在输出时间之前加个定义:date_default_timezone_set("PRC");,代码:

<?php

date_default_timezone_set("PRC");

echo date("Y-m-d H:i:s");

?>

三、PHP获取文件创建时间和最后修改时间的函数

filemtime(string filename):返回文件上次被修改的时间,出错时返回false。时间以Unix时间戳的方式返回,可用于Date()。

filectime(string filename):返回文件上次inode被修改的时间,如果出错则返回false。时间以Unix时间戳的方式返回。

fileatime(string filename):返回文件上次被访问的时间,如果出错则返回false。时间以Unix时间戳的方式返回。

四、PHP比较两个日期相差天数

代码:

<?php

echo (strtotime("2008-08-24 00:00:00")-strtotime("2008-08-08 00:00:00"))/86400;

?>

九、信息提取常用算法?

方法一:

完整解析信息的标记形式,,再提取关键信息

XML JSON YAML

需要标记解析器 如bs库的标签树遍历

优点:信息解析准确

缺点:提取过程繁琐

方法二:无标记形式,直接搜索关键信息

搜索

对信息的文本查找函数即可

优点,过程简洁,速度较快

缺点,提取结果准确性与内容相关

十、监督分类的常用算法?

监督分类是一种常见的机器学习任务,有很多算法可以用于解决这个问题。以下是一些常用的监督分类算法:

1. 逻辑回归(Logistic Regression):逻辑回归是一种线性模型,常用于二分类问题,通过训练一个逻辑回归模型将输入特征映射到概率输出。

2. 决策树(Decision Tree):决策树是一种树形结构的模型,在每个节点根据特征进行分割,直到达到判定节点的条件。可以处理多分类问题和二分类问题。

3. 随机森林(Random Forest):随机森林是一种基于决策树的集成学习方法,通过训练多个决策树,并综合它们的预测结果来进行分类。

4. 支持向量机(Support Vector Machine,SVM):支持向量机是一种通过将数据映射到高维空间并找到一个最优超平面来进行分类的方法。

5. K近邻算法(K-Nearest Neighbors,KNN):K近邻算法是一种基于实例的学习方法,通过根据新数据点与已有数据点的距离来进行分类。

6. 朴素贝叶斯(Naive Bayes):朴素贝叶斯是基于贝叶斯定理和特征条件独立性假设的分类算法,适用于文本分类和多项式分类等问题。

7. 梯度提升算法(Gradient Boosting):梯度提升算法是一种迭代训练的集成学习方法,通过逐步构建多个基学习器并整合它们的预测结果来进行分类。

这只是一小部分常用的监督分类算法,实际应用中还有其他许多算法可供选择。根据具体问题和数据特征的不同,选择合适的分类算法是很重要的,可以通过实验和比较来确定最佳的算法。

顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
用户名: 验证码:点击我更换图片

网站地图 (共30个专题189477篇文章)

返回首页