Следният блог предполага, че читателят има основни познания за структурите от данни, по-специално за масивите. За целите на последователността, блогът ще обяснява концепции с помощта на Javascript.

Ако сте някой, който научава повече за структурите от данни, ще е имало точка в обучението ви, в която сте научили за масивите. Масивите са съществена част от програмирането и предоставят по-голям набор от инструменти за решаване на проблеми. Съществуват обаче други структури от данни, като набори, които могат да доведат до по-добри решения при правилната ситуация.

Масив срещу набор

За преглед, един масиве по същество колекция от елементи, разпределени в последователна памет. Поради естеството на разпределението на паметта на масива, можем да използваме индекси за лесен достъп до елементите на масива. Какво ще кажете за комплект?

Според уеб документацията на MDN, набор (Javascript) е колекция от уникални елементи, които не се разпределят последователно. Това означава, че не можем да използваме индекси за достъп до елементи. Произволен достъп до елемент с помощта на индекс се поддържа само от масиви.

Ами ако искаме да потвърдим съществуването на елемент в набор? За щастие наборите имат полезен метод, който позволява на програмистите да знаят дали наборът съдържа конкретен елемент. Преди да научим за този полезен метод, нека разберем как да създаваме и променяме комплекти.

Как да конструираме комплект?

За да инициализираме нов и празен набор, можем да използваме конструктора Set().

const newSet = new Set()

За да инициализираме набор с въвеждане на масив, можем да направим следното:

const newSet = new Set([1, 2, 3]) //{1, 2, 3}

Забележете, че начинът, по който инициализираме набор, е различен от инициализирането на масив. Това е така, защото не съществува пряк път за конструиране на набори, както прави масив, чрез използване на нотацията със скоби.

Ами ако имаме дублиращи се стойности в нашия предварително конструиран набор?

const newSet = new Set([1, 1, 2, 3]) //{1, 2, 3}

Както се очаква, дублиращите се стойности се премахват и наборът е обект, съдържащ уникални стойности. След това, как можем да добавим стойности към текущия ни набор?

Добавяне

Добавянето на стойности към набор е лесно! Когато въведем произволен литерал или променлива като аргумент към параметъра на метода за добавяне, ние го добавяме към набора.

const newSet = new Set([1]) //{1}
// Duplicate value not added to the set
newSet.add(1) //{1}
newSet.add("string") //{1, "string"}
const obj = {key: value}
newSet.add(obj) //{1, "string", {...}}

Какво ще кажете за премахване на стойности от набора? За щастие, премахването на стойности също е лесно.

Изтриване

Можем да използваме метода изтриване, за да премахнем всеки елемент вътре в набора. Всичко, което трябва да направим, е да предоставим стойността на този елемент в параметрите на метода.

newSet.delete(1) //{"string", {...}}
newSet.delete("string") //{{...}}
newSet.delete(obj) //{}

В сравнение с методите pop() и shift() на масиви, методът delete ни позволява да изберем конкретен елемент за изтриване. Заедно с метода за изтриване можем да използваме и методаизчистванеза премахване на всички елементи в набора.

const clearSet = new Set([1, 2, 3]) //{1, 2, 3}
newSet.clear() //{}

Вече имате основно разбиране за набори и можете да създавате/променяте набори! И така, връщайки се към този полезен метод, как можем да гарантираме, че определен елемент е в набор? Можем да използваме Set.prototype.has(value).

Има

Методът has()връща булево значение, което потвърждава дали дадена стойност е в зададения обект или не.

const newSet = new Set([1, 2, 3]) //{1, 2, 3}
newSet.has(1) //true
newSet.has(4) //false

Сравнение по време на изпълнение между Set Methods и Array Methods

Като цяло методите set и array имат сходни времена на изпълнение. Въпреки това, въз основа на ситуацията, методите на набора могат да се окажат по-ефективни и обратното.

Добавяне срещу натискане-И двете взематO(1)

Delete срещу Pop и Shift - delete и pop вземат O(1), докато shift отнема O (н)

Има срещу indexOf- имаотнема O(1), докато indexOf взема O(n)

Защо трябва да използвам набори над масиви?

Целта на наборите не е да заместват масиви! Както масивите, така и наборите имат своето приложение при решаване на проблеми и, ако се използват правилно, могат да направят работата на програмата много по-добра! Когато работите с данни, които са ненужно повтарящи се, работата с набори определено ще подобри производителността. Знаейки кога да използвате набори вместо масиви, ще допринесе много за практиките на кодиране и подобряването на производителността.