当前位置: 首页 > 后端技术 > PHP

数据结构实现基础

时间:2023-03-29 21:14:54 PHP

简介数据统计示例:在日常的数据处理中,经常需要对一组数据进行基本的统计分析,包括这些操作:平均值、最大值、最小值、中位数、标准差、方差等这类统计可能出现在各种情况下,比如学生成绩统计、家庭支出、GDP统计等,都会涉及到这类数据统计。为每个特定的应用程序编写一个程序并不是一个好主意,这些程序都非常相似。数据结构的处理方法就是从这些具体的应用中抽象出通用的数据组织和操作方法,然后用特定的编程语言实现相应的数据存储和操作数据抽象类型名称:统计数据集数据对象集:N集合S的元素{x1,x2,...,xN}操作集:ElementTypeAverage(S,N):求S中N个元素的平均值ElementTypeMax(S,N):求S中N个元素ElementTypeMin(S,N):求S中N个元素的最小值ElementTypeMedian(S,N):求S中N个元素的中位数数据存储数据组织的基本存储方式主要使用数组可以用链式实现list方法,包括非常复杂的数据结构,比如图片、树等,无非就是数组和链表的应用。如果要实现的操作不是基本统计,而是集合操作,则需要判断元素是否属于集合,对集合进行并交运算,向集合中插入元素等。虽然这些操作也可以简单数组实现,效率不高。使用树的组织方式可以更方便地实现上述对集合的操作。如果除了基本的统计操作外,还需要动态维护一个集合,即经常向集合中添加/删除元素,那么应该设计多大的数组来存储这些元素,太大浪费空间,太小是不够。用链表来存储数据可能更合适,但是链表也有缺点。链表需要记录后续节点的地址。与数组存储相比,链表需要更多的存储空间,程序实现也比数组复杂。数据结构的存储实现与所需的操作密切相关。没有最好的收纳方式,只有最合适的收纳方式。操作实现在确定了数据的存储方式之后,数据结构中涉及的另一个问题就是如何实现相关的操作。这些操作的实现需要使用编程语言提供的另一种功能,即流程设计功能。任何高级编程语言都提供了基本的流程控制语句,即分支控制语句和循环控制语句。程序的分支控制结构、循环控制结构和语句自然顺序执行结构是实现任何算法流程的基本结构。在程序中,我们可以将程序的一个基本功能设计为一个函数,一方面降低了程序设计的复杂度,另一方面提高了程序设计的复用性。递归是数据结构算法设计的一种非常重要的手段。《PHP面试问答》https://github.com/colinlet/PHP-Interview-QA欢迎star关注~~结合PHP面试实际,总结自己遇到的问题,以及网上其他人遇到的问题,并尽量提供简明准确的答案包括网络、数据结构与算法、PHP、Web、MySQL、Redis、Linux、安全、设计模式、架构、面试等一些数据结构存储基本变量是数据的基本单位存储,而变量有类型,例如:整型、浮点型、字符型、布尔型数组数组是最基本的结构类型,它是一组有序的同类型数据指针集合,指针变量用于存储变量的地址,可以通过指针间接访问变量结构卷结构类型是一种数据类型,可以让一些数据成分聚合成一个整体。它可以将具有内在联系的不同类型的数据统一为一个整体,使它们相互关联。同时,结构体是变量的集合,其变量成员可以像成员类型变量一样独立使用。结构与数组的不同之处在于,数组的所有元素必须属于同一类型,而结构的成员可以属于不同的数据类型。struct结构名{类型名结构成员名1;类型名结构成员名2;......类型名结构成员名n;};链表链表是一种常见而重要的基本数据结构,也是实现复杂数据结构的重要手段。它不是按线性顺序存储数据,而是由若干个结构类型相同的“节点”串联而成,即每个节点存储下一个节点的地址。使用链表结构可以克服数据需要事先知道数据大小的缺点,可以充分利用计算机的内存空间,实现灵活的内存动态管理。但是链表失去了数组方便随机存储的优势,同时链表由于增加了节点指针域,空间开销也比较大。单向链表结构//单向链表节点类node{public$data;公共$下一个;/***@param$p1节点数据*@param$p2下一个节点*/publicfunction__construct($p1,$p2){$this->data=$p1;$this->next=$p2;}}单向链表的常用操作链表的建立在使用链表进行编程时,往往需要创建一个链表,建立链表的过程实际上就是向链表不断插入节点的过程classsingleLinkList{/***@param$nint节点数*@return$headobj头节点*/publicfunctioncreate($n){$head=newnode(0,null);对于($i=$n;$i>0;$i--){$newNode=新节点($i,null);$newNode->next=$head->next;$head->next=$newNode;}返回$头;}}插入节点在单向链表头部的某个节点p之后插入一个新节点:找到正确的位置p,申请一个新节点Nodet,并为t的节点信息赋值,以及finallyinserttafterpafterpanddeletethenode从单向链表的头部删除一个节点:找到被删除节点的前一个节点p,删除p之后的节点处理单向链表最常见的方法是逐个查看链表中每个节点的数据,并对双向链表进行处理。在单向链表的基础上增加指向前驱单元的指针的链表称为双向链表。节点增加指向其前驱节点的指针,会牺牲一部分空间成本,前驱单元查找不需要从链头开始//双向链表节点类node{public$data;公共$下一个;公共$previous;/***@param$p1节点数据*@param$p2下一个节点*@param$p3前一个节点*/publicfunction__construct($p1,$p2,$p3){$this->data=$p1;$this->next=$p2;$this->previous=$p3;}}双向循环链表将双向链表的最后一个单元的Next指针指向链表的第一个单元,第一个单元的Previous指针指向链表的最后一个单元,这样形成的链表称为双向循环链表。基础程序设计语言除了要表达各种数据外,还必须提供一种表达数据处理过程的手段,即对程序的控制。过程。程序的控制过程是通过程序中的一系列语句来实现的。按照结构化程序设计的观点,任何程序都可以通过三种基本的控制结构组合程序模块来实现。三种基本的控制结构是序列、分支和循环。《数据结构实现基础》