面试题3--I/O,链表与数组,PHP变量作用域

2021-08-30  本文已影响0人  Amy1234567

计算机中的I/O是什么?

在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O,Direct I/O,数据库I/O等,只要具有输入输出类型的系统数据交换和人机交互的通道,这个概念与选用的开发语言没有关系,是一个通用的概念。

链表是什么?

链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素;

链表是线性表的一种,所谓的线性表包含顺序线性表和链表。顺序线性表是用数组来实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。

所以,链表允许插入和删除表上任意位置上的节点,但是不允许随机存取。链表有很多中不同的类型:单向链表,双向链表,循环链表。

单向链表

csnd

单向链表包含两个域,一个是信息域,一个是指针域。也就是单向链表的节点被分为两部分,一部分是保存或显示关于节点的信息,第二部分存储下一个节点的地址,而最后一个节点则指向一个空值。

双向链表

csnd

从上图可以很清晰的看出,每个节点有2个链接,一个是指向前一个节点(当此链接为第一个链接时,指向的是空值或空列表),另一个则指向后一个节点(当此链接是最后一个链接时,指向的是空值或空列表)。意思就是说双向链表有2个指针,一个指向前一个节点的指针,另一个则指向后一个节点的指针。

循环链表

csnd

循环链表就是首节点和末节点被连接在一起。循环链表中第一个节点之前就是最后一个节点,反之亦然。

数组和链表的区别

1. 不同

\bullet 链表是链式的存储结构;数组是顺序的存储结构

\bullet 链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储

\bullet 链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;

\bullet 数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要在编程一开始时指定,故当达到最大长度,扩充长度不如链表方便

2. 相同

两种结构均可实现数据的顺序存储,构造出来的模型成线性结构

数组和链表的区别浅析_我的博客-CSDN博客_链表和数组的区别

数组与链表的区别(详细说明)

\bullet 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中的任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。

\bullet 链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就十分简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素就需要链表数据结构了。

C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。

从逻辑结构角度来看

数组必须事先定义固定的长度(元素个数),不能适应动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费

链表动态地进行存储分配;可以适应数据动态地增减的情况,且可以方便地插入,删除数据项。(数组中插入,删除数据项时,需要移动其他数据项)

从内存存储角度来看

(静态)数组从栈中分配空间,对于程序员方便快速,但自由度小

链表从堆中分配空间,自由度大但申请管理比较麻烦

PHP变量的作用域

PHP有三种不同的变量作用域:

\bullet local (局部)

\bullet global (全局)

\bullet static (静态)

1. local和global作用域

函数之外声明的变量拥有Global作用域,只能在函数以外进行访问。

函数之内声明的变量拥有Local作用域,只能在函数内部进行访问。

my test

2. global关键字

global关键字用于在函数内访问全局变量。

w3c

PHP同时在名为$GLOBAL[index]的数组中存储了所有的全局变量。下变存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。

w3c

3. static关键字

通常,当函数完成、执行后,会删除所有变量。不过,有时需要不删除某个局部变量,可以在首次声明变量时使用static关键字。

my test
上一篇 下一篇

猜你喜欢

热点阅读