Kolekce (abstraktní datový typ)
Kolekce nebo kontejner je třída nebo abstraktní datový typ obsahující sadu hodnot jednoho nebo různých typů a umožňující přistupování k těmto hodnotám. Kolekce umožňuje zapisovat do sebe hodnoty a získávat je. Cíl kolekce je sloužit jako úložiště objektů a zajišťovat k nim přístup. Obvykle se kolekce používají pro uchovávání skupin objektů stejného typu podléhajících stereotypnímu zpracování. Pro přistupování ke konkrétnímu elementu kolekce mohou používat různé metody v závislosti na její logické organizaci. Implementace může připouštět provedení jednotlivých operací na celé kolekce. Takové operace na celé kolekce mohou v mnoha případech podstatně usnadnit programování.
Některé z různých typů kolekce jsou seznamy, množiny, multimnožiny, stromy a grafy. Výčtový typ může být buď seznam, nebo množina
Pole (nebo tabulka) s pevnou velikostí se obvykle nepovažuje za kolekci, protože uchovává pevné číslo položek, ačkoliv se pole/tabulky běžně používají při implementaci kolekcí. Pole s proměnnou velikostí se obyčejně považují za kolekci.
Přehled
Kolekce mohou být zkoumány ze třech hledisek:
- z hlediska přistupování k prvkům kolekce
- z hlediska uchovávání prvků kolekce
- z hlediska procházení prvků kolekce
Obvykle kolekce implementuje a může provádět následující operace:
- oznamovat, jaký má počet objektů, které v sobě uchovává
- odstraňovat všechny objekty z kolekce
- přidávat nový objekt do kolekce
- odstraňovat objekt z kolekce
- poskytovat přístup k uchovávanému objektu
Rychlost (viz Asymptotická složitost) provádění těchto operací se liší v závislosti na konkrétní implementaci kolekce.
Lineární kolekce
Mnoho kolekcí se chovají, jako kdyby uchovávali data do řady uspořádané nějakým způsobem s přístupem k jednomu nebo obou koncům. Skutečná datová struktura implementující takovou kolekci nemusí být lineární. Například prioritní fronta je často implementována jako halda, což je něco jako strom. Lineární kolekcí je:
- Lineární seznam
- Pole
- Zásobník (FILO, LIFO)
- Fronta (FIFO, LILO)
- Prioritní fronta (často implementována jako Halda)
- Oboustranná fronta (deque)
- Oboustranná prioritní fronta (DEPQ)
Seznamy
V seznamu pořadí datových položek hraje velice důležitou roli. Duplicitní datové položky jsou povoleny. Příklady operací na seznamech jsou vyhledávání prvků v seznamu a určování jeho umístění, odstraňování prvků ze seznamu, přidávání prvků do určitého místa atd. Pokud operace přidávání umísťuje prvky z jednoho konce a operace odstraňování odstraňuje z jiného konce, tak tomu se říká fronta nebo FIFO. Pokud operace přidávání a odstraňování prvků fungují pouze na jednom konci, tam tomu se říká zásobník nebo LIFO. V obou případech prvky jsou udržovány v kolekci ve stejném pořadí (pokud nebyly odstraněny nebo znovu vložený někam jinam) a jsou to zvláštní případy kolekce typu seznam. Jiné operace na seznamu zahrnují třídění, kde zase pořadí prvků má obrovský význam.
Prioritní fronty
Taktéž zvané haldy, sledují "minimální" nebo "maximální" prvek v kolekci podle nějakého kritéria pořadí.
Asociativní kolekce
Jiné kolekce mohou být interpretovány jako jakési funkce, tj. při daném vstupním "klíči" kolekce vydá výstupní hodnotu. Příklady takových kolekcí jsou množiny, multimnožiny a asociativní pole. Množina může být interpretována jako zvláštní multimnožina, což je zase zvláštní mapa, s tím, že se v každém případě omezují možné hodnoty. Toto platí, když množina reprezentována charakteristickou funkcí
Množiny
Ve množinách pořadí datových položek nemá žádnou posloupnost, ale duplicitní prvky nejsou povoleny. Příklady operací na množinách jsou přidávání a odstraňování prvků a vyhledávání prvku ve množině. Některé jazyky přímo podporují množiny. V jiných množiny mohou být implementovány pomocí hašovací tabulky s umělými hodnotami, tj. pro reprezentování množiny jsou používány pouze klíče.
Multimnožiny
V multimnožině jako ve množině pořadí datových položek nemá žádnou posloupnost. Ale v tomto případě duplicitní prvky jsou povoleny. Příklady operací na množinách jsou přidávání a odstraňování prvků a určení, jak mnoho konkrétních prvků se nachází v multimnožině. Multimnožina může být transformována v seznam pomocí třídění.
Asociativní pole
Asociativní pole (nebo mapa, nebo slovník, nebo vyhledávací tabulka) se chová jako slovník, tj. poskytuje "hodnotu" (jako definice) jako odpověď na vyhledávaný "klíč" (jako slovo). Hašovací tabulka je obvykle efektivní implementace asociativního pole a proto tento datový typ je často známý jako "haš".
Grafy
V grafu datové položky mají asociaci s jedním nebo více datovými položkami v kolekci a jsou něco jako stromy bez pojmu kořenu nebo vztahu rodič-dítě, tj. všechny data jsou si rovné. Příklady operací na grafech jsou procházení a hledání, což zkoumá asociace datových položek a hledá nějakou specifickou vlastnost. Grafy jsou často používány pro modelování skutečných situací a pro řešení s tím souvisejících problémů. Příkladem je Spanning Tree Protocol, který vytváří grafovou reprezentaci datové sítě a řeší, které asociace mezi spojovacími uzly je třeba zrušit, aby se vytvořil strom, a tím zabránit datům, aby nechodily v cyklech.
Stromy
Zvláštní druh grafu je strom. Ve stromu kořenová datová položka má asociace s nějakým počtem jiných datových položek, které zase mají asociace s jinými datovými položkami. Tomuto se často říká jako vztahy typu rodič-dítě. Každý prvek (kromě kořenů) má jediného rodiče (kořen nemá žádné rodiče) a některý počet dítě (je možné, že nemá ani jednoho). Příklady operace na stromech jsou přidávání prvku s tím, že bude obsahovat určitou vlastnost stromu, aby se dalo třídit, a procházení stromu tak, že navštívíme všechny prvky s dodržováním určité posloupnosti.
Kolekce typu strom mohou být používány, aby uchovávaly hierarchická data, která reprezentována na stromový způsob, jako například soubory v adresářích.
Určité stromy jsou používány v různých algoritmech. Například řazení haldou používá něco jako strom zvané haldou
Abstraktní koncepce vs. implementace
Jak bylo popsáno výše, kolekce a různé druhy kolekce jsou abstraktní koncepce. V literatuře existuje značné zmatení mezi abstraktní koncepci a její určitou implementaci v různých jazycích nebo druzích jazyků. Tvrzení, že kolekce, seznamy, množiny, stromy atd. jsou datové struktury, abstraktní datové typy nebo třídy musí být chápáno s tímto na mysli. Kolekce jsou především abstrakce, které jsou užitečné při formulování řešení problémů. Díváme-li se na to tímto způsobem, abstrakce udržují důležité spojení k základním matematickým koncepcím, které ale mohou být ztraceny, když se zaměřuje na implementaci.
Například prioritní fronta je často implementována jako halda, zatímco asociativní pole je často implementováno jako hašovací tabulka, takže se na tyto abstraktní typy odkazuje těmito implementacemi jako "halda" nebo "haš", ačkoli to není vždycky správné.
Implementace
- C++: Standard Template Library
- Java: Java Collections Framework
- Python: collections[nedostupný zdroj]