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

数组数据结构

时间:2023-03-30 05:05:21 PHP

定义了php的array数组,默认是一个动态数据结构,数组底层应该在内存中开辟一块固定容量的存储空间来存储一段连续的数据,这样我们就可以仅使用SplFixedArray来限制内存容量。代码github地址:数组(Arrays)类Arrays{private$data;私人$大小;私人$容量;//构造函数,传入数组的容量构造Array,数组默认容量为capacity=10publicfunction__construct(int$capacity=10){$this->data=newSplFixedArray($capacity);$this->容量=$容量;$this->size=0;}//获取数组中元素的个数publicfunctiongetSize():int{return$this->size;}//返回数组是否为空publicfunctionisEmpty():bool{return$this->size==0;}//获取数组的容量publicfunctiongetCapacity():int{return$this->data->getSize();}//在index索引O(n)的位置插入一个新元素epublicfunctionadd(int$index,int$e){if($index<0||$index>$this->size){thrownewException("索引不合法");}if($this->size==$this->capacity){$this->resize(2*$this->capacity);}对于($i=$this->si泽-1;$i>=$索引;$i--){$this->data[$i+1]=$this->data[$i];}$this->data[$index]=$e;$this->大小++;}//在所有元素之后添加一个新元素O(1)publicfunctionaddLast($e){$this->add($this->size,$e);}//在所有元素之前添加一个新元素O(n)publicfunctionaddFirst($e){$this->add(0,$e);}//获取索引位置的元素O(1)publicfunctionget($index){if($index<0||$index>$this->size){thrownewException("indexisillegal");}返回$this->data[$index];}publicfunctiongetLast(){return$this->get($this->size-1);}publicfunctiongetFirst(){return$this->get(0);}//修改index索引位置的元素为eO(1)publicfunctionset($index,$e){if($index<0||$index>$this->size){thrownewException(“索引是非法的”);}$this->data[$index]=$e;}//查找O(n)的数组中是否有元素epublicfunctioncontains($e):bool{for($i=0;$i<$this->size;$i++){if($this->data[$i]==$e){返回真;}}返回假;}//查找元素e在数组中的索引,如果没有元素e,返回-1O(n)publicfunctionfind($e):int{for($i=0;$i<$this->size;$i++){if($this->data[$i]==$e){返回$i;}}返回-1;}//从数组中删除索引位置的元素并返回删除的元素publicfunctionremove($index){if($index<0||$index>$this->size){thrownewException("indexis非法的”);}$ret=$this->data[$index];对于($i=$index+1;$i<$this->size;$i++){$this->data[$i-1]=$this->data[$i];}$this->size--;取消设置($this->data[$this->size]);如果($this->size==$this->capacity/4&&$this->容量/2!=0){$this->调整大小($this->容量/2);}返回$ret;}//从数组中删除最后一个元素并返回删除的元素publicfunctionremoveLast(){$this->remove($this->size-1);}//从数组中删除第一个元素并返回删除的元素publicfunctionremoveFirst(){$this->remove(0);}//从数组中移除元素epublicfunctionremoveElement($e){$index=$this->find($e);如果($index!=-1){$this->remove($index);}}//改变数组空间的容量为newCapacity的大小privatefunctionresize($newCapacity){$newData=(newself($newCapacity))->data;对于($i=0;$i<$this->size;$i++){$newData[$i]=$this->data[$i];}$this->data=$newData;$this->容量=$newCapacity;}publicfunction__toString(){$str=sprintf("\nArray:size=%d,capacity=%d\n",$this->size,$this->getCapacity());$海峡='[';for($i=0;$i<$this->size;$i++){$str.=$i;如果($i!=$this->size-1){$str.=",";}}$str.="]";返回$str;}}时间复杂度操作注意事项时间复杂度说明add添加元素O(n)最坏情况需要重新移动所有元素addFirst在头部添加一个元素O(n)worstcaseaddLast在尾部添加一个元素O(1)bestcaseget获取指定位置元素O(1)数据是连续的,可以根据位置直接获取getFirst获取第一个元素O(1)同上getLast获取最后一个元素O(1)相同如上设置修改指定索引位置的元素O(1)同上contains查找数组中是否有元素O(1)需要循环遍历find找到元素在数组中的索引O(1)需要循环查找remove删除指定元素O(n)最坏情况需要重新移动所有元素位置removeFirst删除第一个元素O(n)最坏情况removeLast删除最后一个元素O(1)在最好的情况下removeElement删除指定的ElementO(1)需要循环进行了搜索和总结。数组是最基本的数据结构,理解数组的原理和运算时间复杂度是深入研究数据结构和算法的基础。欢迎扫描下方二维码继续关注:互联网工程师(id:phpstcn),我们一起学习,一起进步