Lookup for a Set should be O(1). This is true for sets and hashtables (eg maps) in any language.
The way this is possible is that sets store values differently than arrays.
In an array values are stored sequentially based on what their place is in the array and where that array is in memory, so to find your item you need to scan through the array sequentially to find your item (unless it's a sorted array, then you can use binary search at O(logn)).
Sets declare a block of memory, like an array, but instead of putting items in memory in sequence, like an array, they determine the index of the item to add by running the item through a hash function (essentially a function that takes in an object and returns an evenly distributed, very large random number), and then modulousing the result of that hash function by the size of the memory block they have.
So, when you call contains($needle, $mySetHaystack), php will take $needle, and feed it into a hashfunction, which will return a big number like 9283472378, then it takes the length of $mySetHaystack (let's say 31), and does 9283472378 % 31 = 28, so it checks the 28th index of $mySetHaystack to see if $needle is there. Everything in this list of operations is independent of the size of $mySetHaystack, hence the perf being O(1).
If a hash function returns the same value for two different items (a hash collision, which totally happens), or if the modulo of that value is the same, then an array of values is stored in the set at that index. Since sets don't allow duplicate values, this happens rarely and is negligible from a perf perspective.
You should check out the wikipedia page on hash tables (similar to sets), as there are lots of pictures that will make this concept easier to understand.
PHP.mk документација
Ds\Set
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Патека
class.ds-set.php
Локална патека за оваа страница.
Извор
php.net/manual/en
Оригиналниот HTML се реупотребува и локално се стилизира.
Режим
Прокси + превод во позадина
Кодовите, табелите и белешките остануваат читливи во истиот тек.
Референца
class.ds-set.php
Ds\Set
Референца за `class.ds-set.php` со подобрена типографија и навигација.
Класата Set
Класата Vector
Вовед
Set е низа од уникатни вредности. Оваа имплементација користи иста хеш табела како Ds\Map, каде што вредностите се користат како клучеви и мапираната вредност се игнорира.
Предности
- Вредностите можат да бидат од било кој тип, вклучувајќи објекти.
- Поддржува синтакси на низа (квадратни загради).
- Редоследот на вметнување е зачуван.
- Автоматски ослободува распределена меморија кога нејзината големина ќе падне доволно ниско.
- add(), remove() and contains() се сите O(1).
Слабости
- Не поддржува push(), pop(), insert(), shift(), или unshift().
- get() е O(n) ако има избришани вредности во баферот пред пристапниот индекс, O(1) во спротивно.
Синопсис на класата
/* Константи */
/* Методи */
}Претходно дефинирани константи
Дневник на промени
| Верзија | = NULL |
|---|---|
| се сите O(n). | Класата сега имплементира ArrayAccess. |
| PECL ds 1.2.7 | Додаден е на секоја вредност од множеството. method. |
| PECL ds 1.3.0 |
Ds\Set::MIN_CAPACITY променето од 16 на 8.
|
Содржина
- Ds\Set::add — Додава вредности во множеството
- Ds\Set::allocate — Алоцира доволно меморија за потребен капацитет
- Ds\Set::capacity — Враќа тековен капацитет
- Ds\Set::clear — Ги отстранува сите вредности
- Ds\Set::__construct — Создава нова инстанца
- Ds\Set::contains — Определува дали множеството ги содржи сите вредности
- Ds\Set::copy — Враќа плитка копија од множеството
- Ds\Set::count — Враќа број на вредности во множеството
- Ds\Set::diff — Создава ново множество користејќи вредности што не се во друго множество
- Ds\Set::filter — Создава ново множество користејќи повикувач за да се утврди кои вредности да се вклучат
- Ds\Set::first — Враќа прва вредност во множеството
- Ds\Set::get — Враќа вредност на даден индекс
- Ds\Set::intersect — Создава ново множество со пресек на вредности со друго множество
- Ds\Set::isEmpty — Враќа дали множеството е празно
- Ds\Set::join — Ги спојува сите вредности како стринг
- Ds\Set::jsonSerialize — Враќа претстава што може да се конвертира во JSON
- Ds\Set::last — Враќа последна вредност во множеството
- Ds\Set::map — Враќа резултат од примена на callback на секоја вредност
- Ds\Set::merge — Враќа резултат од додавање на сите дадени вредности во множеството
- Ds\Set::reduce — Го сведува множеството на една вредност користејќи функција за враќање
- Ds\Set::remove — Ги отстранува сите дадени вредности од множеството
- Ds\Set::reverse — Го реверзира множеството на место
- Ds\Set::reversed — Враќа реверзирана копија
- Ds\Set::slice — Враќа подмножество од даден опсег
- Ds\Set::sort — Го сортира множеството на место
- Ds\Set::sorted — Враќа сортирана копија
- Ds\Set::sum — Враќа збир на сите вредности во множеството
- Ds\Set::toArray — Го претвора множеството во низа
- Ds\Set::union — Создава нова група користејќи вредности од тековната инстанца и друга група
- Ds\Set::xor — Создава нова група користејќи вредности или во тековната инстанца или во друга група, но не и во двете
Белешки од корисници 2 забелешки
Анонимен ¶
пред 8 години
Ghanshyam Katriya(anshkatriya at gmail) ¶
3 години пред
One nice thing is the type-awarness. array_unique() lose values (whatever flag), while Ds\Set keep them.
<?php
$array = [true, false, null, '', 0, '0', 123, '123'];
var_dump(array_unique($array));
var_dump(new \Ds\Set($array));
/*
Gives :
array(4) {
[0]=> bool(true)
[1]=> bool(false)
[4]=> int(0)
[6]=> int(123)
}
object(Ds\Set)#1 (8) {
[0]=> bool(true)
[1]=> bool(false)
[2]=> NULL
[3]=> string(0) ""
[4]=> int(0)
[5]=> string(1) "0"
[6]=> int(123)
[7]=> string(3) "123"
}
*/