Рубрики
Uncategorized

Массив структур данных

Автор оригинала: David Wong.

Определение

Массив PHP по умолчанию является динамической структурой данных, и базовый массив должен открывать в памяти пространство с фиксированной емкостью для хранения непрерывного раздела данных, поэтому мы можем использовать splfixedarray только для ограничения объема памяти.

Код

Адрес GitHub: массивы

class Arrays
{
    private $data;
    private $size;
    private $capacity;
    //Constructor, pass in the capacity of array, construct array, default capacity of array capacity = 10
    public function __construct(int $capacity = 10)
    {
        $this->data = new SplFixedArray($capacity);
        $this->capacity = $capacity;
        $this->size = 0;
    }
    //Get the number of elements in the array
    public function getSize():int
    {
        return $this->size;
    }
     //Returns whether the array is empty
    public function isEmpty():bool
    {
        return $this->size == 0;
    }
    //Get the capacity of an array
    public function getCapacity():int
    {
        return $this->data->getSize();
    }
    //Insert a new element E O (n) at the index index
    public function add(int $index,int $e)
    {
        if($index <0 || $index > $this->size){
            throw new Exception("index is illegal");
        }
        if ($this->size == $this->capacity){
            $this->resize(2 * $this->capacity);
        }
        for ($i=$this->size -1 ; $i >=$index; $i--) {
            $this->data[$i + 1] = $this->data[$i];
        }
        $this->data[$index] = $e;
        $this->size ++;

    }
    //Add a new element o after all elements (1)
    public function addLast($e)
    {
        $this->add($this->size,$e);
    }
    //Add a new element o before all elements
    public function addFirst($e)
    {
        $this->add(0,$e);
    }
    //Get element o of index location (1)
    public function get($index)
    {
        if($index <0 || $index > $this->size){
            throw new Exception("index is illegal");
        }
        return $this->data[$index];
    }
    public function getLast(){
        return $this->get($this->size-1);
    }
    public function getFirst(){
        return $this->get(0);
    }
    //Change the element of index index location to e o (1)
    public function set($index,$e)
    {
        if($index <0 || $index > $this->size){
            throw new Exception("index is illegal");
        }
        $this->data[$index] = $e;
    }
    //Find if there is element E O in the array (n)
    public function contains($e):bool
    {
        for ($i=0; $i < $this->size; $i++) {
            if($this->data[$i] == $e){
                return true;
            }
        }
        return false;
    }
    //Finds the index of element E in the array, and returns - 1 o (n) if element E does not exist
    public function find($e):int
    {
        for ($i=0; $i < $this->size; $i++) {
            if($this->data[$i] == $e){
                return $i;
            }
        }
        return -1;
    }
    //Delete the element at index position from the array, and return the deleted element
    public function remove($index)
    {
        if($index <0 || $index > $this->size){
            throw new Exception("index is illegal");
        }
        $ret = $this->data[$index];

        for ($i=$index+1; $i < $this->size; $i++) {
            $this->data[$i-1] = $this->data[$i];
        }
        $this->size--;
        unset($this->data[$this->size]);
        if($this->size == $this->capacity / 4 && $this->capacity /2 != 0){
            $this->resize($this->capacity/2);
        }
        return $ret;
    }
     //Delete the last element from the array, return the deleted element
    public function removeLast()
    {
        $this->remove($this->size-1);
    }
    //Delete the first element from the array, return the deleted element
    public function removeFirst()
    {
        $this->remove(0);
    }
     //Remove element E from array
    public function removeElement($e)
    {
        $index = $this->find($e);
        if($index != -1){
            $this->remove($index);
        }
    }
    //Change the capacity of array space to newcapacity
    private function resize($newCapacity)
    {
        $newData = (new self($newCapacity))->data;
        for($i=0;$i<$this->size;$i++){
            $newData[$i] = $this->data[$i];
        }
        $this->data = $newData;
        $this->capacity = $newCapacity;
    }

    public function __toString()
    {
        $str = sprintf("\nArray: size = %d , capacity = %d\n",$this->size,$this->getCapacity());
        $str.='[';
        for($i = 0 ; $i < $this->size; $i ++){
            $str.= $i;
            if($i != $this->size - 1){
                $str.= ", ";
            }
        }
        $str.="]";
        return $str;
    }
}

Временная сложность

Аддитивные элементы В худшем случае снова переместите все позиции элементов добавлять O(n)
Добавьте элементы в заголовок Наихудший сценарий Добавить сначала O(n)
Добавьте элементы в конце В лучшем случае addLast O(1)
Добавьте элементы в конце Данные являются непрерывными, и элементы могут быть получены непосредственно в соответствии с местоположением получить O(1)
Получить первый элемент То же getFirst O(1)
Получить конечный элемент То же получить Последнее O(1)
Измените элемент в указанном местоположении индекса То же набор O(1)
Найдите, есть ли элементы в массиве Требуется круговой поиск содержит O(1)
Найдите индекс элемента в массиве Требуется круговой поиск находить O(1)
Удалить указанный элемент В худшем случае снова переместите все позиции элементов удалить O(n)
Удалить первый элемент Наихудший сценарий Удалить первым O(n)
Удалить конечный элемент В лучшем случае Удалить последние O(1)
Удалить указанный элемент Требуется круговой поиск Удалить элемент O(1)

резюме

Массив-это самая базовая структура данных, поэтому понимание принципа массива и сложности времени работы является основой структуры и алгоритма глубокого обучения данным.

Добро пожаловать, чтобы отсканировать QR-код ниже и привлечь ваше внимание:

Интернет-инженер (идентификатор: php stcn), мы учимся и прогрессируем вместе