php数据结构课程---3、队列(队列实现方法)
php数据结构课程---3、队列(队列实现方法)
一、总结
一句话总结:
1、数据实现:适用于功能不复杂的情况
2、链表实现:受限链表,只能队头队尾操作:适用于功能复杂情况
1、队列的数组实现注意点?
array_push() + array_shift()
shift: [ʃɪft] :v. 转移;去除(污迹);n. 转移;改变
shift
- v. 转移;快速移动;变换;改变观点;推卸(责任);振作;移位;狼吞虎咽地吃;去除(污迹);销售,出售;换挡;轮班;含糊其辞,拐弯抹角
- n. 转移;改变,转变;手段;轮班;轮班职工;转换(键);(直筒式)连衣裙,内衣;计谋,诡计
数组实现队列
$arr = [];
array_push($arr,"张三");
array_push($arr,"李四");
array_push($arr,"王五");
array_push($arr,"王六"); while($data = array_shift($arr)){
echo $data."<br>";
}
2、队列的链表实现的注意点?
链表实现的队列可以增加各种函数来实现复杂操作
普通单链表结构 + push函数和shift函数
<?php
class Node{
public $data;
public $next;
public function __construct($data,$next=null){
$this->data = $data;
$this->next = $next;
}
}
class Queue{
public $front = null;
public $rear = null;
public $size = 0;
public function __construct(){
}
public function push($data)
{
$n = new Node($data);
if($this->front == null && $this->rear == null){
$this->front = $n;
$this->rear = $n;
}else{
$this->rear->next = $n;
$this->rear = $n;
}
$this->size++;
}
public function shift()
{
if($this->front){
$this->size--;
$data = $this->front->data;
$this->front = $this->front->next;
return $data;
}else{
return null;
}
}
}
// $s = new Queue();
// $s->push("aaaa");
// $s->push("bb");
// $s->push("cc");
// $s->push("dd");
// $s->push("fifo");
// // echo $s->shift();
// while($data = $s->shift()){
// echo $data."<br>";
// }
3、在php中使用队列适合用什么?
在PHP中建议使用Spl库SplQueue(注意不是sql)
<?php $queue = new SplQueue();
$queue->enqueue('A');
$queue->enqueue('B');
$queue->enqueue('C'); $queue->rewind();
while($queue->valid()){
echo $queue->current(),"\n";
$queue->next();
} print_r($queue);
$queue->dequeue(); //remove first one
print_r($queue); ?>
Output A
B
C
SplQueue Object
(
[flags:SplDoublyLinkedList:private] => 4
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => A
[1] => B
[2] => C
) )
SplQueue Object
(
[flags:SplDoublyLinkedList:private] => 4
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => B
[1] => C
) )
4、php中统计算法执行时间的方法及函数?
microtime():其实超好记,其实不用记,时间函数是time(),计算程序时间肯定是微秒级的,微秒函数肯定是microtime()
$begin = microtime();
算法段...
$end = microtime()-$begin;
5、n个整数,最少选几个数,使和不小于s (穷举o(n^2),用队列的o(n))?
暴力:就是双重循环
队列(感觉不是很好,用优先队列取前几个比较好o(nlogn)):如果和不够,就增加队列中的元素,如何和够了,就减去队列之前的元素。队列中的元素的个数差不多就是结果(这样算有问题,只能得到近似解,难道最大的几个数一定在数组的某一段上么)
总结:普通队列能有什么东西,入队,出队,以及队列中的个数,仅此而已
暴力:
<?php
// n个数列,最少选几个数,使和大于s,队列算法 o(n^2)
$arr=[]; $sum = 0;
$max = 10000;
$min = 100;
$s= 2500;
$count = 0; //随机生成10000个数
for ($k=0; $k < $max ; $k++) {
$arr[] = rand(0,1000);
}
$begin = microtime(); //两层for循环暴力穷举搜索结果
for ($i=0; $i <$max ; $i++) {
$sum=$arr[$i];
for ($j=$i+1; $j <$max; $j++) {
$count++;
if($sum<=$s){
$sum+=$arr[$j];
}else{
$min=min($j-$i,$min);
break;
}
}
}
$end = microtime()-$begin; echo "暴力穷举法 最少选择 $min 个数字,耗时 $end 毫秒,共执行 $count 循环。";
队列:
<?php
// n个数列,最少选几个数,使和大于s,队列算法 o(n) $arr=[]; $sum = 0;
$max = 10000;
$min = 100;
$count = 0;
$s= 2500;
$i = 0;
$j = 1; //随机生成10000个数字
for ($k=0; $k < $max ; $k++) {
$arr[] = rand(0,1000);
}
$queue = []; $begin = microtime();
$sum+=$arr[$i];
//当没有达到$max这个遍历次数时
while($i<$max && $j<$max){
$count++;
//如果当前和小于所求
if($sum<=$s){
// array_push($queue,$arr[$j]);
$sum+=$arr[$j];
$j++;
}else{
//如果当前和大于所求
$min=min($j-$i,$min);
// array_shift($queue);
$sum-=$arr[$i];
$i++;
}
}
$end = microtime()-$begin;
echo "使用队列 最少需要选择 $min 数字, 耗时 $end 毫秒,共执行 $count 次!";
6、如何快速判断函数功能:或者说算法作用?
打印中间变量
最简单实例:比如n个整数,最少选几个数,使和不小于s (穷举o(n^2),用队列的o(n)) 的队列实现,最开始可以只选3个数
二、内容在总结中
n个整数,最少选几个数,使和不小于s (穷举o(n^2),用队列的o(n)) 的队列实现测试代码
//测试队列:n个数列,最少选几个数,使和大于s,队列算法 o(n)
public function test_queue()
{
// n个数列,最少选几个数,使和大于s,队列算法 o(n) $arr=[]; $sum = 0;
$max = 6;
$min = 6;
$count = 0;
$s= 80;
$i = 0;
$j = 1; //随机生成10000个数字
for ($k=0; $k < $max ; $k++) {
$arr[] = rand(0,100);
}
$queue = []; dump($arr); echo "sum:{$sum}<br>";
echo "arr[i]:{$arr[$i]}<br>";
$begin = microtime();
$sum+=$arr[$i];
//当没有达到$max这个遍历次数时
while($i<$max && $j<$max){
$count++;
//如果当前和小于所求
if($sum<=$s){
// array_push($queue,$arr[$j]);
$sum+=$arr[$j];
echo "---sum<=s---<br>";
echo "sum:{$sum}<br>";
echo "arr[j]:{$arr[$j]}<br>";
echo "i:{$i}<br>";
echo "j:{$j}<br>";
$j++;
}else{
//如果当前和大于所求
echo "---else---<br>";
echo "sum:{$sum}<br>";
echo "arr[i]:{$arr[$i]}<br>";
echo "i:{$i}<br>";
echo "j:{$j}<br>";
$min=min($j-$i,$min);
echo "min:{$min}<br>";
// array_shift($queue);
$sum-=$arr[$i];
$i++;
}
echo "-sum:{$sum}<br><br>";
}
$end = microtime()-$begin;
echo "使用队列 最少需要选择 $min 数字, 耗时 $end 毫秒,共执行 $count 次!<br>";
}
测试的中间结果示例
array(6) {
[0] => int(56)
[1] => int(3)
[2] => int(68)
[3] => int(66)
[4] => int(99)
[5] => int(71)
}
sum:0
arr[i]:56
---sum<=s---
sum:59
arr[j]:3
i:0
j:1
-sum:59
---sum<=s---
sum:127
arr[j]:68
i:0
j:2
-sum:127
---else---
sum:127
arr[i]:56
i:0
j:3
min:3
-sum:71
---sum<=s---
sum:137
arr[j]:66
i:1
j:3
-sum:137
---else---
sum:137
arr[i]:3
i:1
j:4
min:3
-sum:134
---else---
sum:134
arr[i]:68
i:2
j:4
min:2
-sum:66
---sum<=s---
sum:165
arr[j]:99
i:3
j:4
-sum:165
---else---
sum:165
arr[i]:66
i:3
j:5
min:2
-sum:99
---else---
sum:99
arr[i]:99
i:4
j:5
min:1
-sum:0
---sum<=s---
sum:71
arr[j]:71
i:5
j:5
-sum:71
使用队列 最少需要选择 1 数字, 耗时 2.2000000000022E-5 毫秒,共执行 10 次!
php数据结构课程---3、队列(队列实现方法)的更多相关文章
- php数据结构课程---7、队列实战
php数据结构课程---7.队列实战 一.总结 一句话总结: 注意条件:注意循环的条件(比如while循环打印队列元素时),注意if的条件 把问题想清楚:比如链表操作初次插入元素和后面再插,效果是不一 ...
- js数据结构之栈和队列的详细实现方法
队列 队列中我们主要实现两种: 1. 常规队列 2. 优先队列(实际应用中的排队加急情况等) 常规队列的实现方法如下: // 常规队列 function Queue () { this.queue = ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- java 多线程阻塞队列 与 阻塞方法与和非阻塞方法
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
- Java数据结构和算法(二)--队列
上一篇文章写了栈的相关知识,而本文会讲一下队列 队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO Java中queu ...
- 数据结构代码实现之队列的链表实现(C/C++)
上班闲着无聊,一直想着要开始写博客,但又不知道写什么.最近又回顾了下数据结构的知识,那就从数据结构开始吧. 前言 关于C语言结构体的知识以及队列的特性请读者自行了解,此处不做过多解释,嘻嘻. 同时此篇 ...
- 我理解的数据结构(三)—— 队列(Queue)
我理解的数据结构(三)-- 队列(Queue) 一.队列 队列是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结 ...
随机推荐
- [转载]Axure RP 7.0下载地址及安装说明
Axure RP是产品经理必备的原型制作工具,因为很多同学是新手,在这里整理一下axure7.0的下载.安装和汉化流程,希望能够帮到大家. Axure RP是美国Axure Software Solu ...
- 解决QT:forward declaration of 'struct Ui::xxx';invalid use of incomplete struct "Ui::Widget" 等莫名奇异错误
今天在进行QT Widget的UI设计时,改了下Widget的对象名,然后在多次成功编译执行后,执行清理,又一次构建,就出现了好多莫名奇异的错误: widget.h:12: 错误:forward de ...
- Cassandra数据库Java訪问
针对的时Cassandra 2.0 数据库 Java本地client訪问Cassandra,首先建立Javaproject,使用Maven进行管理. 引入依赖: <dependency> ...
- Linux服务器性能日志收集和分析脚本(转)
最近老大要求分析服务器的性能数据,找到服务器运行的性能瓶颈,结果花了两天时间,写了两个脚本可以生成日志并可以进行数据提取,最终生成数据可以放到excel生成报表.过程中也学到了不少shell编程技术. ...
- hdu3579(线性同余方程组)
Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 如何使用EasyNVR+CDN突破萤石云在直播客户端数量上的限制,做到低成本高性价比的直播
恰逢五一假期,有以为来自内蒙的用户向我电话咨询,大概的场景是这样的: 目前用户使用的是全套的海康IPC和NVR设备: 海康NVR设备通过设置萤石云平台,由萤石云对外提供直播服务: 萤石云对单个摄像机同 ...
- C语言之基本算法12—谁是冠军
/* ================================================================== 题目:甲乙丙丁四人猜A,B,C,D,E,F6个人谁是冠军,甲 ...
- 存储过程 & 触发器
触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用.当对某一表进行诸如UPDATE. INSERT. DELETE 这些操作时, 就会自动执行触发器所定义的SQL 语句 ...
- 还原sqlserver2008 r2 数据库步骤
1: 有备份文件bak 文件(是在sqlserver2008 r2上备份的) 数据库下载地址(讯雷) ed2k://|file|cn_sql_server_2008_r2_express_with_m ...
- ALV行 列颜色设置
ALV的颜色设置分为3种:行.列.单元格. 1.列颜色的设置 在 slis_t_fieldcat_alv-emphasize 中,写入需要的颜色代码. Eg: DATA: fc TYP ...