Как реализовать структуру данных deque в javascript? - PullRequest
0 голосов
/ 04 февраля 2020

Я изучаю структуру данных с javascript

и теперь я сосредоточен на том, как реализовать deque?

Редактировать: из комментариев ниже я получаю полезные инструкции о том, как реализовать deque based array. Есть ли направление, как реализовать deque based object с использованием класса?

enter image description here

Я понимаю некоторые моменты, которые мне нужны:

  • addFront ()
  • removeFront ()
  • peekFront ()

  • addBack ()
  • removeBack ()
  • peekBack ()

, но я запутался в некоторых моментах:

  • сколько указателей мне нужно ? по крайней мере, я знаю из очереди Мне нужны два (голова-хвост) указателя, но я не уверен, что мне нужно больше в deque

  • , какие данные набрать javascript удобно в этом случае в качестве базы? Я видел некоторых репетиторов в YouTube, которые говорили о круговом массиве, например, который мне неизвестен в JS.

edite2:

Я следил Книга под названием: Изучение javascript Структуры данных и алгоритмы 3-е издание

В главе 5 этой книги автор начал реализовывать Deque на основе только объекта и некоторых переменных

но я не понял, как он это сделал, потому что код зашифрован, но я все еще могу добраться до его файлов и проверить его подход репозиторий github

Я могу сказать, что ответ @trincot очень близок подхода автора книги

, но когда я сравниваю результаты, я получаю [1 = author - 2 = @trincot]: enter image description here

в соответствии с индексом книги Взятие примерно 1073 * связного списка приведено в главе 6, поэтому я не ожидал, что его решение будет основано на чем-то, о чем он не упомянул раньше

PLZ Если я пропущу какой-либо пункт, я буду рад сообщить мне это ... спасибо

1 Ответ

2 голосов
/ 04 февраля 2020

Как указано в комментариях, JavaScript имеет встроенную поддержку операций deque через свой класс / прототип Array: pu sh, pop, shift, unshift.

Если вы все еще хотите написать собственную реализацию , тогда вы можете go для двусвязного списка, где вам просто нужны два "указателя". Следует сказать, что в JavaScript мы на самом деле говорим не об указателях, а об объектах. Переменные или свойства, которые получают объект как значение, на самом деле ссылки в JavaScript.

В качестве альтернативы, вы можете go для кругового массива. Поскольку в JavaScript стандартные массивы не гарантируют, что они будут последовательными массивами, как, например, в случае C, вам не нужно использовать экземпляр Array для этого. Подойдет простой объект (или Карта).

Итак, есть две возможные реализации:

Двусвязный список

class Deque {
    constructor() {
        this.front = this.back = undefined;
    }
    addFront(value) {
        if (!this.front) this.front = this.back = { value };
        else this.front = this.front.next = { value, prev: this.front };
    }
    removeFront() {
        let value = this.peekFront();
        if (this.front === this.back) this.front = this.back = undefined;
        else (this.front = this.front.prev).next = undefined;
        return value;
    }
    peekFront() { 
        return this.front && this.front.value;
    }
    addBack(value) {
        if (!this.front) this.front = this.back = { value };
        else this.back = this.back.prev = { value, next: this.back };
    }
    removeBack() {
        let value = this.peekBack();
        if (this.front === this.back) this.front = this.back = undefined;
        else (this.back = this.back.next).back = undefined;
        return value;
    }
    peekBack() { 
        return this.back && this.back.value;
    }
}

// demo
let deque = new Deque;
console.log(deque.peekFront()); // undefined
deque.addFront(1);
console.log(deque.peekBack()); // 1
deque.addFront(2);
console.log(deque.removeBack()); // 1
deque.addFront(3);
deque.addFront(4);
console.log(deque.peekBack()); // 2
deque.addBack(5);
deque.addBack(6);
console.log(deque.peekBack()); // 6
console.log(deque.removeFront()); // 4
console.log(deque.removeFront()); // 3
console.log(deque.removeFront()); // 2
console.log(deque.removeFront()); // 5
console.log(deque.removeFront()); // 6
console.log(deque.removeFront()); // undefined

Круговой "массив"

class Deque {
    constructor() {
        this.data = {}; // Or Array, but that really does not add anything useful
        this.front = 0;
        this.back = 1;
        this.size = 0;
    }
    addFront(value) {
        if (this.size >= Number.MAX_SAFE_INTEGER) throw "Deque capacity overflow";
        this.size++;
        this.front = (this.front + 1) % Number.MAX_SAFE_INTEGER;
        this.data[this.front] = value;
    }
    removeFront()   {
        if (!this.size) return;
        let value = this.peekFront();
        this.size--;
        delete this.data[this.front];
        this.front = (this.front || Number.MAX_SAFE_INTEGER) - 1;
        return value;
    }
    peekFront()     { 
        if (this.size) return this.data[this.front];
    }
    addBack(value) {
        if (this.size >= Number.MAX_SAFE_INTEGER) throw "Deque capacity overflow";
        this.size++;
        this.back = (this.back || Number.MAX_SAFE_INTEGER) - 1;
        this.data[this.back] = value;
    }
    removeBack()   {
        if (!this.size) return;
        let value = this.peekBack();
        this.size--;
        delete this.data[this.back];
        this.back = (this.back + 1) % Number.MAX_SAFE_INTEGER;
        return value;
    }
    peekBack()     { 
        if (this.size) return this.data[this.back];
    }
}

// demo
let deque = new Deque;
console.log(deque.peekFront()); // undefined
deque.addFront(1);
console.log(deque.peekBack()); // 1
deque.addFront(2);
console.log(deque.removeBack()); // 1
deque.addFront(3);
deque.addFront(4);
console.log(deque.peekBack()); // 2
deque.addBack(5);
deque.addBack(6);
console.log(deque.peekBack()); // 6
console.log(deque.removeFront()); // 4
console.log(deque.removeFront()); // 3
console.log(deque.removeFront()); // 2
console.log(deque.removeFront()); // 5
console.log(deque.removeFront()); // 6
console.log(deque.removeFront()); // undefined

Методы вернут undefined, когда будет предпринята попытка получить значение из пустой deque.

...