У комп'ютерній науці, список або послідовність — абстрактний тип даних, який являє собою зліченне число впорядкованих , де одне і теж саме значення може зустрічатися більше одного разу. Екземпляр списку — це комп'ютерне подання математичного поняття скінченної послідовності; (потенційно) нескінченний аналог списку — це потік.
Списки є основним прикладом контейнерів, оскільки вони містять інші значення. Якщо ж значення зустрічається кілька разів, у кожному випадку воно розглядається, як окремий елемент.
Назва «список» також використовується для кількох конкретних структур даних, які можна використати для реалізації абстрактних списків, особливо зв'язаних списків.
Багато мов програмування забезпечують підтримку типів даних списку, і мають спеціальний синтаксис і семантику для списків і перелік операцій. Список часто можна побудувати шляхом написання послідовності елементів, розділених комами, крапками з комою та/або пропусками, в межах пари роздільників, таких як круглі дужки '()', квадратні дужки '[]', фігурні дужки '{}', або кутові дужки '<>'. В об'єктно-орієнтованих мовах програмування, списки зазвичай подаються як екземпляри підкласів загального класу «списку», і проходяться через окремі ітератори. Тип даних «список» часто реалізується з використанням структури даних «масив» або зв'язаних списків деякого виду, але і інші структури даних можуть бути більш відповідними для деяких застосувань. У деяких контекстах, наприклад, у програмуванні на Lisp, термін список може стосуватися конкретно зв'язаного списку, а не масиву.
У теорії типів і функційному програмуванні, абстрактні списки зазвичай [en] визначаються двома операціями: NIL, що дає порожній список, і CONS, яка додає елемент у початок списку.
Операції
Реалізація структури даних списку може надати деякі з таких операцій:
- конструктор для створення порожнього списку;
- операція для перевірки чи список порожній, чи ні;
- операція для додавання об'єкта на початок списку;
- операція для додавання об'єкта в список;
- операція для визначення першого компонента (або «голови») списку;
- операція для посилання на список, що складається з усіх компонентів списку, за винятком його першого елемента («голови»), (це називається «хвіст» списку).
В іноземній термінології використовуються такі позначення: голова списку — англ. head, хвіст — англ. tail.
Реалізації
Списки зазвичай реалізуються або у вигляді зв'язаних списків (або однобічно, або двобічно) або у вигляді масивів, як правило, змінної довжини або динамічних масивів.
Стандартний спосіб реалізації списків, що походить з мови програмування Lisp, передбачає, що кожен елемент списку має значення і вказівник, який вказує місце розташування наступного елемента списку. Це призводить або до зв'язаного списку або до дерева, залежно від того, чи має список вкладені підсписки. Деякі старі реалізації Lisp (такі як реалізація Lisp Symbolics 3600) також підтримують «стислі списки» (з використанням CDR кодування), які мали спеціальне внутрішнє подання (невидиме для користувача). Списками можна маніпулювати за допомогою ітерації або рекурсії. Перше часто є кращим в імперативних мовах програмування, тоді як останнє є нормою у функційних мовах.
Списки можуть бути реалізовані у вигляді збалансованих двійкових дерев пошуку, котрі містять пари індекс-значення, забезпечуючи доступ до будь-якого елемента за однаковий час (наприклад, як крайові, так і внутрішні вузли зберігають індекс найправішого нащадка, що використовується для направлення пошуку), затрачаючи час, логарифмічний від розміру списку, але, поки список не дуже змінюється, це також забезпечує ілюзію випадкового доступу і робить можливим операції перестановки, префіксних і додавання також за логарифмічний час.
Підтримка у мовах програмування
Деякі мови не пропонують структуру даних «список», але підтримують використання асоціативних масивів або свого роду таблиць, щоб емулювати списки. Наприклад, Lua надає таблиці. Хоча Lua зберігає списки, які мають числові індекси, як масиви, вони як і раніше відображаються у вигляді словників.
У Lisp, списки є основним типом даних і можуть містити як програмний код, так і дані. В більшості діалектів, список перших трьох простих чисел можна записати у вигляді (list 2 3 5)
. У деяких діалектах Lisp, зокрема в Scheme, список є набором пар, що складаються зі значення і вказівника на наступну пару (або нульового значення), що реалізує однобічно зв'язаний список.
Використання
Як випливає з назви, списки можна використати для зберігання списку елементів. Однак, на відміну від традиційних масивів, списки можуть розширюватися і стискатися, і зберігаються в пам'яті динамічно.
В обчислювальній техніці, списки легше реалізувати, ніж множини. Скінченну множину в математичному сенсі можна реалізувати у вигляді списку з додатковими обмеженнями, а саме, елементи, що повторюються, заборонені і порядок не має значення. Сортування списку прискорює процес визначення наявності об'єкта у множині, але підтримання порядку вимагає більше часу для додання нового запису до списку. Більш ефективно множини реалізуються з використанням збалансованих двійкових дерев пошуку або геш-таблиць, а не списком.
Списки також є основою для інших абстрактних типів даних, зокрема черг, стеків і їх варіацій.
Абстрактне визначення
Абстрактний список типу L з елементами деякого типу Е (мономорфний список) визначається такими функціями:
- nil: () → L
- cons: E × L → L
- first: L → E
- rest: L → L
з аксіомами:
- first (cons (e, l)) = e
- rest (cons (e, l)) = l
для будь-якого елемента е і будь-якого списку L. Мається на увазі, що:
- cons (e, l) ≠ l
- cons (e, l) ≠ e
- cons (e1, l1) = cons (e2, l2) if e1 = e2 and l1 = l2
Зауважимо, що first (nil ()) і rest (nil ()) не визначені.
Ці аксіоми еквівалентні аксіомам типу даних абстрактного стеку.
В теорії типів, наведене вище визначення простіше розглядається як визначення [en] в термінах конструкторів: nil і cons. В алгебраїчних термінах, це можна подати як перетворення 1 + E × L → L. first та rest потім отримуються шляхом зіставлення зі зразком у конструкторі cons і окремо обробляється випадок nil.
Список монад
Тип списку утворює монаду з такими функціями (використано E*, а не L для відображення мономорфних списків з елементами типу Е):
де append визначається так:
Як альтернатива, монаду можна визначити в термінах операцій return, fmap та join:
Зверніть увагу, що fmap, join, append та bind чітко визначені, оскільки вони застосовуються до більш і більш глибоких аргументів за кожного рекурсивного виклику.
Тип списку є адитивною монадою, з nil, як монадичним нулем, і append, як монадичною сумою.
Списки утворюють моноїд відносно операції додавання. Одиничний елемент моноїда є порожній список, nil. Насправді, це [en] над множиною елементів списку.
Примітки
- Reingold, Edward; Nievergelt, Jurg; Narsingh, Deo (1977). Combinatorial Algorithms: Theory and Practice. Englewood Cliffs, New Jersey: Prentice Hall. с. 38–41. ISBN .
- Barnett, Granville; Del tonga, Luca (2008). (PDF). mta.ca. Архів оригіналу (PDF) за 12 листопада 2014. Процитовано 12 листопада 2014.
- Lerusalimschy, Roberto (December 2003). (вид. First). Lua.org. ISBN . Архів оригіналу за 9 жовтня 2014. Процитовано 12 листопада 2014.
- Steele, Guy (1990). Common Lisp (вид. Second). Digital Press. с. 29–31. ISBN .
Джерела
- Томас Кормен; Чарльз Лейзерсон, Рональд Рівест, Кліфорд Стайн (2009) [1990]. 10.2 Зв'язані списки. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U komp yuternij nauci spisok abo poslidovnist abstraktnij tip danih yakij yavlyaye soboyu zlichenne chislo vporyadkovanih de odne i tezh same znachennya mozhe zustrichatisya bilshe odnogo razu Ekzemplyar spisku ce komp yuterne podannya matematichnogo ponyattya skinchennoyi poslidovnosti potencijno neskinchennij analog spisku ce potik Spiski ye osnovnim prikladom kontejneriv oskilki voni mistyat inshi znachennya Yaksho zh znachennya zustrichayetsya kilka raziv u kozhnomu vipadku vono rozglyadayetsya yak okremij element Struktura odnobichno zv yazanogo spisku kotrij realizuye spisok z 3 h cilih elementiv Nazva spisok takozh vikoristovuyetsya dlya kilkoh konkretnih struktur danih yaki mozhna vikoristati dlya realizaciyi abstraktnih spiskiv osoblivo zv yazanih spiskiv Bagato mov programuvannya zabezpechuyut pidtrimku tipiv danih spisku i mayut specialnij sintaksis i semantiku dlya spiskiv i perelik operacij Spisok chasto mozhna pobuduvati shlyahom napisannya poslidovnosti elementiv rozdilenih komami krapkami z komoyu ta abo propuskami v mezhah pari rozdilnikiv takih yak krugli duzhki kvadratni duzhki figurni duzhki abo kutovi duzhki lt gt V ob yektno oriyentovanih movah programuvannya spiski zazvichaj podayutsya yak ekzemplyari pidklasiv zagalnogo klasu spisku i prohodyatsya cherez okremi iteratori Tip danih spisok chasto realizuyetsya z vikoristannyam strukturi danih masiv abo zv yazanih spiskiv deyakogo vidu ale i inshi strukturi danih mozhut buti bilsh vidpovidnimi dlya deyakih zastosuvan U deyakih kontekstah napriklad u programuvanni na Lisp termin spisok mozhe stosuvatisya konkretno zv yazanogo spisku a ne masivu U teoriyi tipiv i funkcijnomu programuvanni abstraktni spiski zazvichaj en viznachayutsya dvoma operaciyami NIL sho daye porozhnij spisok i CONS yaka dodaye element u pochatok spisku OperaciyiRealizaciya strukturi danih spisku mozhe nadati deyaki z takih operacij konstruktor dlya stvorennya porozhnogo spisku operaciya dlya perevirki chi spisok porozhnij chi ni operaciya dlya dodavannya ob yekta na pochatok spisku operaciya dlya dodavannya ob yekta v spisok operaciya dlya viznachennya pershogo komponenta abo golovi spisku operaciya dlya posilannya na spisok sho skladayetsya z usih komponentiv spisku za vinyatkom jogo pershogo elementa golovi ce nazivayetsya hvist spisku V inozemnij terminologiyi vikoristovuyutsya taki poznachennya golova spisku angl head hvist angl tail RealizaciyiSpiski zazvichaj realizuyutsya abo u viglyadi zv yazanih spiskiv abo odnobichno abo dvobichno abo u viglyadi masiviv yak pravilo zminnoyi dovzhini abo dinamichnih masiviv Standartnij sposib realizaciyi spiskiv sho pohodit z movi programuvannya Lisp peredbachaye sho kozhen element spisku maye znachennya i vkazivnik yakij vkazuye misce roztashuvannya nastupnogo elementa spisku Ce prizvodit abo do zv yazanogo spisku abo do dereva zalezhno vid togo chi maye spisok vkladeni pidspiski Deyaki stari realizaciyi Lisp taki yak realizaciya Lisp Symbolics 3600 takozh pidtrimuyut stisli spiski z vikoristannyam CDR koduvannya yaki mali specialne vnutrishnye podannya nevidime dlya koristuvacha Spiskami mozhna manipulyuvati za dopomogoyu iteraciyi abo rekursiyi Pershe chasto ye krashim v imperativnih movah programuvannya todi yak ostannye ye normoyu u funkcijnih movah Spiski mozhut buti realizovani u viglyadi zbalansovanih dvijkovih derev poshuku kotri mistyat pari indeks znachennya zabezpechuyuchi dostup do bud yakogo elementa za odnakovij chas napriklad yak krajovi tak i vnutrishni vuzli zberigayut indeks najpravishogo nashadka sho vikoristovuyetsya dlya napravlennya poshuku zatrachayuchi chas logarifmichnij vid rozmiru spisku ale poki spisok ne duzhe zminyuyetsya ce takozh zabezpechuye ilyuziyu vipadkovogo dostupu i robit mozhlivim operaciyi perestanovki prefiksnih i dodavannya takozh za logarifmichnij chas Pidtrimka u movah programuvannyaDeyaki movi ne proponuyut strukturu danih spisok ale pidtrimuyut vikoristannya asociativnih masiviv abo svogo rodu tablic shob emulyuvati spiski Napriklad Lua nadaye tablici Hocha Lua zberigaye spiski yaki mayut chislovi indeksi yak masivi voni yak i ranishe vidobrazhayutsya u viglyadi slovnikiv U Lisp spiski ye osnovnim tipom danih i mozhut mistiti yak programnij kod tak i dani V bilshosti dialektiv spisok pershih troh prostih chisel mozhna zapisati u viglyadi list 2 3 5 U deyakih dialektah Lisp zokrema v Scheme spisok ye naborom par sho skladayutsya zi znachennya i vkazivnika na nastupnu paru abo nulovogo znachennya sho realizuye odnobichno zv yazanij spisok VikoristannyaYak viplivaye z nazvi spiski mozhna vikoristati dlya zberigannya spisku elementiv Odnak na vidminu vid tradicijnih masiviv spiski mozhut rozshiryuvatisya i stiskatisya i zberigayutsya v pam yati dinamichno V obchislyuvalnij tehnici spiski legshe realizuvati nizh mnozhini Skinchennu mnozhinu v matematichnomu sensi mozhna realizuvati u viglyadi spisku z dodatkovimi obmezhennyami a same elementi sho povtoryuyutsya zaboroneni i poryadok ne maye znachennya Sortuvannya spisku priskoryuye proces viznachennya nayavnosti ob yekta u mnozhini ale pidtrimannya poryadku vimagaye bilshe chasu dlya dodannya novogo zapisu do spisku Bilsh efektivno mnozhini realizuyutsya z vikoristannyam zbalansovanih dvijkovih derev poshuku abo gesh tablic a ne spiskom Spiski takozh ye osnovoyu dlya inshih abstraktnih tipiv danih zokrema cherg stekiv i yih variacij Abstraktne viznachennyaAbstraktnij spisok tipu L z elementami deyakogo tipu E monomorfnij spisok viznachayetsya takimi funkciyami nil L cons E L L first L E rest L L z aksiomami first cons e l e rest cons e l l dlya bud yakogo elementa e i bud yakogo spisku L Mayetsya na uvazi sho cons e l l cons e l e cons e1 l1 cons e2 l2 if e1 e2 and l1 l2 Zauvazhimo sho first nil i rest nil ne viznacheni Ci aksiomi ekvivalentni aksiomam tipu danih abstraktnogo steku V teoriyi tipiv navedene vishe viznachennya prostishe rozglyadayetsya yak viznachennya en v terminah konstruktoriv nil i cons V algebrayichnih terminah ce mozhna podati yak peretvorennya 1 E L L first ta rest potim otrimuyutsya shlyahom zistavlennya zi zrazkom u konstruktori cons i okremo obroblyayetsya vipadok nil Spisok monad Tip spisku utvoryuye monadu z takimi funkciyami vikoristano E a ne L dlya vidobrazhennya monomorfnih spiskiv z elementami tipu E return A A a cons a nil displaystyle text return colon A to A a mapsto text cons a text nil bind A A B B l f nil if l nil append f a bind l f if l cons a l displaystyle text bind colon A to A to B to B l mapsto f mapsto begin cases text nil amp text if l text nil text append f a text bind l f amp text if l text cons a l end cases de append viznachayetsya tak append A A A l 1 l 2 l 2 if l 1 nil cons a append l 1 l 2 if l 1 cons a l 1 displaystyle text append colon A to A to A l 1 mapsto l 2 mapsto begin cases l 2 amp text if l 1 text nil text cons a text append l 1 l 2 amp text if l 1 text cons a l 1 end cases Yak alternativa monadu mozhna viznachiti v terminah operacij return fmap ta join fmap A B A B f l nil if l nil cons f a fmap f l if l cons a l displaystyle text fmap colon A to B to A to B f mapsto l mapsto begin cases text nil amp text if l text nil text cons f a text fmap f l amp text if l text cons a l end cases join A A l nil if l nil append a join l if l cons a l displaystyle text join colon A to A l mapsto begin cases text nil amp text if l text nil text append a text join l amp text if l text cons a l end cases Zvernit uvagu sho fmap join append ta bind chitko viznacheni oskilki voni zastosovuyutsya do bilsh i bilsh glibokih argumentiv za kozhnogo rekursivnogo vikliku Tip spisku ye aditivnoyu monadoyu z nil yak monadichnim nulem i append yak monadichnoyu sumoyu Spiski utvoryuyut monoyid vidnosno operaciyi dodavannya Odinichnij element monoyida ye porozhnij spisok nil Naspravdi ce en nad mnozhinoyu elementiv spisku PrimitkiReingold Edward Nievergelt Jurg Narsingh Deo 1977 Combinatorial Algorithms Theory and Practice Englewood Cliffs New Jersey Prentice Hall s 38 41 ISBN 0 13 152447 X Barnett Granville Del tonga Luca 2008 PDF mta ca Arhiv originalu PDF za 12 listopada 2014 Procitovano 12 listopada 2014 Lerusalimschy Roberto December 2003 vid First Lua org ISBN 8590379817 Arhiv originalu za 9 zhovtnya 2014 Procitovano 12 listopada 2014 Steele Guy 1990 Common Lisp vid Second Digital Press s 29 31 ISBN 1 55558 041 6 DzherelaTomas Kormen Charlz Lejzerson Ronald Rivest Kliford Stajn 2009 1990 10 2 Zv yazani spiski Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4