Структуры данных и алгоритмы

К настоящему времени мы привыкли к массивам; мы знаем, где они быстрые, а где медленные. Теперь мы углубимся в их внутреннюю работу и научимся ее строить.



Изучение того, как создать массив, является важной основой, если мы хотим понимать вещи на фундаментальном уровне.
Мы будем использовать синтаксис класса в javascript для его создания, хотя обычно с javascript мы можем просто создайте массив, как показано ниже:

const a = [];

Но давайте посмотрим, сможем ли мы построить свои собственные.

Что мы знаем о структурах данных?
Мы знаем, что это вещи, которые мы можем построить с нуля; это означает, что мы можем создать любую структуру данных, какую захотим.
Наиболее широко используемые структуры данных хорошо известны и уже реализованы, потому что они очень полезны. Но вы можете построить любую структуру данных с нуля, и большинство структур данных построено поверх других структур данных.

Строим наш массив

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

Массивы в javascript - это просто объекты с ключами на основе целых чисел, которые действуют как индексы.

Итак, мы собираемся начать с создания класса, который мы назовем MyArray. Внутри MyArray у нас будет конструктор, который является начальной функцией, которая будет запускаться при создании MyArray. Этот конструктор будет иметь две точки данных:
1. Свойство length - с помощью массивов мы можем определять длину массива. У нас будет начальная длина, равная нулю, показывающая, сколько элементов имеет массив.

2. Данные - это будет пустой объект.

Метод get ()

Доступ к данным - самое важное действие в массиве. Итак, давайте создадим метод get (). Метод get () принимает индекс для извлечения данных из памяти.

Итак, мы просто return this.data в требуемом индексе.
this.data просто ссылаемся на данные, которые мы создали в конструкторе.

Посмотрим, как это будет работать. Чтобы создать новый MyArray, все, что нам нужно сделать, это сказать const newArray = new MyArray . Мы используем ключевое слово new в JavaScript для создания экземпляра этого или создания копии класса.

Итак, теперь, если я do console.log(newArray) , я получаю myArray, у которого свойство length равно 0, а данные пусты.

Если я сделаю console.log(newArray.get(0)), я получу undefined. Ну, потому что в этом объекте ничего нет - у нас нет предметов. Javascript автоматически имеет тип undefined, пока ничего нет.

Метод push ()

Давайте добавим наш следующий метод - push (). Метод push () добавляет что-то в конец массива.

Требуется элемент, который мы ему дадим, и мы просто добавим этот элемент к объекту данных; он добавит его к длине нашего предмета.

Поскольку у нас нет элементов, а длина равна 0, это добавит данные в индекс 0. Индекс 0 теперь содержит элемент, и, поскольку мы хотим продолжать добавлять элементы, мы скажем this.length ++. Теперь наш массив имеет длину 1 вместо 0.

Итак, в следующий раз, когда мы запустим метод push (), this.length будет 1, а новый элемент будет добавлен с индексом 1. И давайте просто вернемся. this.length на данный момент, потому что типичный метод push () в javascript обычно возвращает длину массива. Давайте запустим это и посмотрим, что произойдет. Давайте push(‘hi’) .

Мы видим, что у меня есть M yArray с длиной 1, а data имеет свойство 0 hi.

Что, если мы добавим еще что-нибудь - займемся newArray.push(‘there’) . Если я запустил это, у меня будет длина 2. Теперь при индексе 0 это hi, а при индексе 1 там.

Команда pop ()

Команда pop () удаляет последний элемент из массива. Этот метод ничего не получает - нам не нужно передавать ему параметр. Все, что нам нужно сделать, это удалить последний элемент в массиве.

Мы можем просто иметь переменную lastItem. Допустим, наш lastItem захватывает последний элемент в нашем объекте данных. Так что это будет просто this.data[this.index-1] . Затем мы можем использовать ключевое слово delete в javascript и сказать delete this.data[this.length-1]

… Чтобы просто удалить последний элемент, и нам нужно уменьшить длину нашего массива на единицу. Итак this.length-- . И, наконец, мы можем просто вернуть удаленный элемент.

Итак, теперь, если я запустил новый Array.pop ();

Мы видим, что там был удален! Теперь у нас есть длина 1, всего hi. Если я снова запустил pop ()

Я вижу, что у меня длина 0; привет тоже был удален!

Метод delete ()

Метод delete () покажет нам, почему некоторые операции с массивами выполняются O (n). Требуется индекс элемента, который мы хотим удалить.

Здесь нам нужно будет создать элемент const. Итак, мы собираемся создать ссылку на this.data[index] как ссылку на элемент, который мы хотим удалить.

Но как мы собираемся удалить это? Помните, что в массиве нам нужно удалить элемент, а затем сдвинуть индекс всех других типов данных на 1.

Итак, давайте добавим еще одну функцию, которая выполняет перенос данных за нас. Я собираюсь создать новый метод, и мы сделаем это в javascript, используя ключевое слово this. Итак this.shiftItems(index) ; этот метод принимает индекс, который мы получили при удалении.

Теперь с помощью метода shiftItems нам нужно будет перебрать элементы, которые должны сигнализировать о том, что это операция O (n). Мы собираемся переместить элементы - не все, а только там, где начинается указатель. Мы видим, что наш i должен быть меньше this.length-1. И мы собираемся увеличивать i на единицу каждый раз в этом цикле.

В этом цикле все, что мы собираемся сделать, это сказать, что this.data[i] будет равно this.data[i+1] . Мы говорим, что начинаем с индекса, с которого хотим начать, и удаляем, и перебираем его до конца. И в этом цикле я хочу, чтобы вы взяли каждый элемент данных, которые у нас есть, и вместо того, что было раньше, сдвиньте его на 1. Итак, мы смещаем элементы влево на 1.

Теперь здесь есть проблема, потому что теперь будет существовать самый последний элемент в массиве, равный this.data[this.length-1] . Мы переставили все по одному, но так и не коснулись самого последнего элемента. Мы остановились, когда i меньше this.length-1.

Я получаю привет. там удаляется. Но тогда у меня есть friend с индексом 2. Итак, смещение работает, но у нас все еще есть friend, потому что мы никогда его не удаляли. Мы переместили все еще раз, но так и не коснулись последнего индекса.

Итак, все, что нам нужно сделать, чтобы избавиться от этого, - это использовать ключевое слово delete для удаления последнего элемента и, очевидно, уменьшить нашу длину, потому что мы просто удаляем элемент. Мы можем сделать this.length-- .

К настоящему времени мы должны понимать, как работают массивы и как они реализованы. У нас есть простые команды O (1), которые работают быстро. Но как только нам нужно начать смещение индексов и что-то изменить, мы должны перебрать вещи, которые сделают это O (n) или линейным временем.

Увидимся в части 35