PHP学习笔记(一谦四益)

news2024/9/25 3:26:29

前言

上一篇文章 PHP学习笔记(观隅反三)分享了数组的知识,这篇文章接着分享和数组相关的算法。

算法效率

算法效率分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间。

冒泡排序

冒泡排序算法的原理如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
在这里插入图片描述

$arr1=array(1,2,4,3,5,0,8);
for($j=0;$j<count($arr1);$j++){
    for($i=0;$i<count($arr1)-1-$j;$i++){
        if($arr1[$i]>$arr1[$i+1]){
            $temp=$arr1[$i];
            $arr1[$i]=$arr1[$i+1];
            $arr1[$i+1]=$temp;
        }
    }   
}
echo '<pre>';
print_r($arr1);
//Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 8 ) 

时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C记录移动次数M均达到最小值:Cmin=n-1 ; Mmin=0
所以,冒泡排序最好的时间复杂度为O(n)
若初始文件是反序的,需要进行 n-1 趟排序。每趟排序要进行 n-i 次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
在这里插入图片描述
冒泡排序的最坏时间复杂度为 O(n2)
综上,因此冒泡排序总的平均时间复杂度为 O(n2)。 [1]

稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法

选择排序

选择排序原理如下:
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
在这里插入图片描述

$arr2=array(1,0,3,4,6,2,7);
for($i=0;$i<count($arr2);$i++){
    // 选定一个元素下标,假定其为最小元素下标,将其存储在变量$min中
    $min=$i;
    for($j=$i+1;$j<count($arr2);$j++){
        if($arr2[$j]<$arr2[$min]){
            $min=$j;
        }
    }
    // 如果选定的最小值不等于实际最小值,就进行交换
    if($min !=$i){
        $temp =$arr2[$i];
        $arr2[$i]=$arr2[$min];
        $arr2[$min]=$temp;
    }
}
print_r($arr2);
//Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 6 [6] => 7 ) 

时间复杂度

选择排序的交换操作介于0 和 (n - 1)次之间。选择排序的比较操作为n (n - 1) / 2次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+…+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次; 最坏情况交换n-1次,逆序交换n/2次。 交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。

稳定性

在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。因此选择排序是一个不稳定的排序算法。

插入排序

插入排序:
通常称之为 直接插入排序, 当进行少量数据的排序中,还可以使用插入排序的方法,插入排序的方法是将一个数据插入到已经排好序的有序数据中,以此得到一个新的个数加一的数组,该方法比较稳定
在这里插入图片描述

$arr3=array(1,0,3,4,6,2,7);
for($i=1,$len=count($arr3);$i<$len;$i++){
    // 选出要插入元素
    $temp = $arr3[$i];
    //选出有序数列,将待插入元素和有序数列进行比较,若前者比后者小,就将待插入元素插入到指定位置,待插入元素后的原有序数列往后移,补上待插入元素的空位
    for($j=$i-1;$j>=0;$j--){
        if($arr3[$j]>$temp){
            $arr3[$j+1]=$arr3[$j];
            $arr3[$j]=$temp;
        }else{
            // 如果当前需要插入的元素要比前面的元素大,位置正确跳出循环
            break;
        }
        
    }
}
print_r($arr3);
//Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 6 [6] => 7 )

时间复杂度

在插入排序中,当待排序数组是有序时,此时是最优情况,即只需要和前一个数比较即可,这时比较只需要进行一次,时间复杂度是O(N)
最坏的情况是待排序数组是逆序的,此时需要比较的次数是最多的,即插入排序最坏情况的时间复杂度是 O(N2);
通常情况下,插入排序在平均情况下运行时间和最坏情况运行时间一样。

空间复杂度

插入排序的空间复杂度是常数阶 O(1)

稳定性

如果待排序的序列中存在两个或两个以上具有相同关键词的数据,排序后这些数据的相对次序保持不变,即如果排序后两个相同的数的相对顺序不会发生改变,则该算法是稳定的
如果排序后,数据的相对次序发生了变化,则该算法是不稳定的。关键词相同的数据元素将保持原有位置不变,所以该算法是稳定的

归并排序

归并排序的原理:
将数组拆成两个数组;申请一个空间用于存放合并后的数组;
假设两个数组已经排好序列,设置两个指针,指针指向的位置分别是两个已经排好序的有序数列的数组的起始位置;
两指针分别指向两个数组的起始元素,并比较两个指针所指的元素,将较小的元素放入申请的空间
然后将指针移动到下一位置;最后将另一个序列所剩的元素直接复制到合并序列中。
在这里插入图片描述

二路归并

$nums1=array(1,3,5);
$nums2=array(2,4,6);
// 申请空间用于存放合并后的数组
$nums3=array();
// 当需要合并的数组中含有元素,就进入循环
while(count($nums1) && count($nums2)){
    // 取出每个数组的第一个元素进行比较:array_shift() 函数删除数组中的第一个元素,并返回被删除元素的值。
    $nums3[]=$nums1[0]<$nums2[0]?array_shift($nums1):array_shift(($nums2));
}
// array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
print_r(array_merge($nums3,$nums2,$nums1));//其中$nums1  $num2的顺序可颠倒
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 )

归并排序

通过二路归并的例子,归并排序就更容易理解了:

$arr4=array(2,4,1,3,6,5,0);
		function merge($arr4){
    $len=count($arr4);
    if($len<=1) return $arr4;
    $mid=floor($len/2);
// array_slice() 函数返回数组中的选定部分。
    $left=array_slice($arr4,0,$mid);
    $right=array_slice($arr4,$mid);
    // 如果分成的两个数组没有排好序,由于是奇数个元素的数组,无法均分成两个相同元素个数的数组
    // 最后在进行二路合并的时候就会乱序,因此需要对$left  $right进行排序
    // 调用merge函数  
    $left=merge($left);
    $right=merge($right);
    $arr5=array();
    while(count($left) && count($right)){
        $arr5[]=$left[0]<$right[0]?array_shift($left):array_shift($right);
    }
    return array_merge($arr5,$left,$right);
}
print_r(merge($arr4));
//Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 ) 

时间复杂度

归并排序比较占用内存,但却是一种效率高且稳定的算法。
改进归并排序在归并时先判断前段序列的最大值后段序列最小值的关系再确定是否进行复制比较。如果前段序列的最大值小于等于后段序列最小值,则说明序列可以直接形成一段有序序列不需要再归并,反之则需要。所以在序列本身有序的情况下时间复杂度可以降至O(n)

稳定性

归并排序是稳定的排序.即相等的元素的顺序不会改变

查找算法

顺序查找

顺序查找也叫做线性查找,对于任意一个序列以及一个给定的元素,将给定元素序列中元素依次比较,直到找出与给定关键字相同的元素,或者将序列中的元素与其都比较完为止。
在这里插入图片描述

$arr2=array(4,23,54,67,3,7);
function check($arr2,$num){
    for($i=0;$i<count($arr2);$i++){
        if($arr2[$i]==$num){
            return $arr2[$i];
        }
    }
    return false;
}
var_dump(check($arr2,3));
//int(3)

二分查找算法

//二分查找
		$arr=array(1,4,2,3,6,5,7);
		//得到数组边界
		$right = count ($arr);
		$left = 0;
		$res = 3;
		//循环匹配
		while($left <= $right){
		//得到中间位置
		$middle = floor(($right - $left) /2);
		//进行查找匹配
		if($arr[$middle] == $res){
			echo $middle + 1;
			break;
			}
		if($arr[$middle]<$res{
				$left =$middle + 1;
			}else{
			$right=$middle -  1;
			}
		}

最后

以上就是这篇文章给大家带来的全部内容了,后续会持续更新相关文章,期待和大家的交流~
如有不足,感谢指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringSecurity认证

文章目录登陆校验流程依赖yaml实现建表、工具类、实体类加密器、AuthenticationManager登录逻辑登录过滤器、配置过滤器登出登陆校验流程 认证 登录&#xff1a; ​ ①自定义登录接口 ​ 调用ProviderManager的方法进行认证 如果认证通过生成token&#xff0c;根据userId把用…

国密SM2算法(JS加密,C#、Java解密)

常见的渗透测试会将网站登录时密码使用明文传输视为风险。推荐使用国密算法或者RSA算法对密码进行加密传输。 RSA加密&#xff08;JS加密&#xff0c;C#、Java解密&#xff09;请参考《RSA对称加密&#xff08;JS加密&#xff0c;C#、Java解密&#xff09;》​​​​​​ 本文…

数据的进制转换以及算术逻辑运算

1.数据的进制转化 进制的表示&#xff1a;二进制、十六进制&#xff0c;二进制符号位0b&#xff0c;一般表示为0b0011&#xff0c;十六进制符号位0x或H&#xff0c;可以表示为0x18F或18FR进制整数转十进制&#xff1a;位权展开法&#xff0c;用R进制数的每一位乘以R的n次方&am…

C++——二叉树排序树

文章目录1 二叉搜索树概念2 二叉搜索树操作与模拟实现2.1 二叉搜索树的查找非递归版本递归版本2.2 二叉搜索树的插入非递归版本递归版本2.3 二叉搜索树的删除非递归版本递归版本3 二叉搜索树的应用&#xff08;K模型、KV模型&#xff09;4 二叉搜索树的性能分析1 二叉搜索树概念…

Go语言设计与实现 -- 反射

Go的反射有哪些应用&#xff1f; IDE中代码的自动补全对象序列化fmt函数的相关实现ORM框架 什么情况下需要使用反射&#xff1f; 不能明确函数调用哪个接口&#xff0c;需要根据传入的参数在运行时决定。不能明确传入函数的参数类型&#xff0c;需要在运行时处理任意对象。 …

1.TCP、UDP区别、TCP/IP七层、四层模型、应用层协议(计网)

文章目录1.OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f;2.TCP/IP 四层模型是什么&#xff1f;每一层的作用是什么&#xff1f;应用层&#xff08;Application layer&#xff09;传输层&#xff08;Transport layer&#xff09;网络层&#xff08;Network lay…

百度工程师带你探秘C++内存管理

一、概述 ptmalloc是开源GNU C Library(glibc)默认的内存管理器&#xff0c;当前大部分Linux服务端程序使用的是ptmalloc提供的malloc/free系列函数&#xff0c;而它在性能上远差于Meta的jemalloc和Google的tcmalloc。服务端程序调用ptmalloc提供的malloc/free函数申请和释放内…

Datawhale组队学习:大数据 D2——分布式文件系统(HDFS)

妙趣横生大数据 Day2三、Hadoop 分布式文件系统(HDFS)1. 分布式文件系统2. HDFS 简介3. HDFS 体系结构4. HDFS存储原理数据冗余存储数据存储策略数据错误与恢复5. HDFS数据读写过程读写过程HDFS故障类型和其检测方法HDFS编程实验1. 本地和集群文件间操作2. 基本文件操作3. Hado…

Java基本语法【未完待续】

目录 一、注释方式 1、单行注释 // 2、多行注释 /*...*/ 3、文档注释 /**....*/ 二、标识符和关键字 三、数据类型 拓展及面试题讲解 1、整数拓展 进制 二进制0b 八进制0 十六进制0x 2、字符拓展 编码Unicode表 2字节 0~65536 3、字符串拓展 4、布尔值拓展 四、类型…

CleanMyMac X软件下载及详细功能介绍

mac平台的知名系统清理应用CleanMyMac在经历了一段时间的测试后&#xff0c;全新设计的X正式上线。与CleanMyMac3相比&#xff0c;新版本的UI设计焕然一新&#xff0c;采用了完全不同的风格。使用Windows电脑时&#xff0c;很多人会下载各类优化软件&#xff0c;而在Mac平台中&…

jsp高校教职工管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 高校教职工管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助mvc模式 serlvetdaobean方式开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#…

tomcat安装和配置

目录 1.下载tomcat 2.解压tomcat压缩包 3.配置端口号 4.启动 命令行窗口日志乱码的解决 5.验证 tomcat 如果已经安装配置过jdk&#xff0c;则向下执行&#xff0c;若无&#xff0c;请先安装jdk。 1.下载tomcat 路径&#xff1a; Apache Tomcat - Apache Tomcat 9 Sof…

Windows 系统从零配置 Python 环境,安装CUDA、CUDNN、PyTorch 详细教程

文章目录1 配置 python 环境1.1 安装 Anaconda1.2 检查环境安装成功1.3 创建虚拟环境1.4 进入/退出 刚刚创建的环境1.5 其它操作1.5.1 查看电脑上所有已创建的环境1.5.2 删除已创建的环境2 安装 CUDA 和 CUDNN2.1 查看自己电脑支持的 CUDA 版本2.2 安装 CUDA2.3 安装 CUDNN2.4 …

LabVIEW中CPU和内存使用情况在NI分布式系统管理器中不可见

LabVIEW中CPU和内存使用情况在NI分布式系统管理器中不可见想使用NI分布式系统管理器监测网络连接实时控制器的CPU和内存使用情况。从左侧窗口的树中选择了感兴趣的实时目标&#xff0c;然后通过选择视图自动视图来确保启用自动查看。希望看到CPU/内存选项卡&#xff0c;但它有显…

算法导论【在线算法】—The Ski-Rental Problem、The Lost Cow Problem、The Secretary Problem

算法导论【在线算法】The Ski-Rental Problem问题描述在线算法证明The Lost Cow Problem问题描述在线算法类似问题—寻宝藏The Secretary Problem问题描述在线算法The Best Possible kThe Ski-Rental Problem 问题描述 假设你正在上滑雪课。每节课结束后&#xff0c;你决定&a…

【Element】el-table 表格

目录 ElementUI 表格分页&#xff08;每页20条&#xff09; 表格分页&#xff08;全部数据&#xff09; 表格排序&#xff08;全部数据&#xff09; 表格排序&#xff08;默认&#xff09; 两个el-table冲突 加载数据前显示“ 暂无数据 ” 表格项为路由 表头样式 树形…

Homebrew 安装遇到的问题

Homebrew 安装遇到的问题 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录Homebrew 安装遇到的问题前言一、安装二、遇到的问题1.提示 zsh: command not found: brew三、解决问题前言 使用 Homebrew 能够 安装 Apple&#xff08;或您的 Linux 系统&#…

React 合成事件理解

1 事件三个阶段 捕获、目标、处理 &#xff08;具体百度&#xff0c;后面有空补全&#xff09;2import React from "react";class Test extends React.Component {parentRef;childRef;constructor(props) {super(props);this.parentRef React.createRef();this.chil…

cmd 窗口、记事本打开后一片空白且几秒钟后闪退的问题解决方案汇总

前言 前段时间&#xff0c;电脑忽然出现了问题&#xff0c;首先是通过 微软应用商店 Microsoft Store 下载安装的 Snipaste 截图软件崩溃&#xff0c;不过将其卸载后&#xff0c;通过电脑管家下载后又可以正常使用了。 之后就是突然发现&#xff0c;记事本文本文档不能使用了…

分享112个HTML娱乐休闲模板,总有一款适合您

分享112个HTML娱乐休闲模板&#xff0c;总有一款适合您 112个HTML娱乐休闲模板下载链接&#xff1a;https://pan.baidu.com/s/15uBy1SVSckPPMM55fiudeQ?pwdkqfz 提取码&#xff1a;kqfz Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 Bootstrap视频网站模板 …