Защо точно се нуждаем от структура от данни с кръгъл свързан списък (единично или двойно)?

Защо точно се нуждаем от структура от данни "Кръгов свързан списък" (единично или двойно)?

Какъв проблем решава, който е очевиден с прости свързани списъци (единично или двойно)?


person user366312    schedule 28.08.2010    source източник
comment
Прочетох горния коментар като Защо точно се нуждаем от кръгъл свързан списък? Защото целта на SO е да бъде правилното първо място.... Тогава прочетох по-ранния -1 коментар :D   -  person Swapnil    schedule 27.08.2017


Отговори (10)


Две причини да ги използвате:

1) Някои проблемни области по своята същност са кръгови.

Например, квадратите на дъска за монополи могат да бъдат представени в кръгово свързан списък, за да се съпоставят с присъщата им структура.

2) Някои решения могат да бъдат съпоставени към кръгово свързан списък за ефективност.

Например буферът за трептене е вид буфер, който взема номерирани пакети от мрежа и ги поставя в ред, така че (например) видео или аудио плейър да може да ги възпроизвежда в ред. Пакетите, които са твърде бавни (забавени), се отхвърлят.

Това може да бъде представено в кръгъл буфер, без да е необходимо постоянно да се разпределя и освобождава памет, тъй като слотовете могат да се използват повторно, след като са били изиграни.

Той може да бъде приложен със свързан списък, но ще има постоянни добавяния и изтривания към списъка, вместо замяна на константите (които са по-евтини).

person Oddthinking    schedule 28.08.2010
comment
Система от частици, която написах за игра, използва кръгъл списък за частиците. Ако свършим неизползваните частици (ограничени поради причини за производителност и памет), тогава просто презаписваме най-старите (които ще бъдат само в началото на цикъла, докато пишем отзад). - person Grant Peters; 28.08.2010
comment
За съжаление не мога да предоставя уеб връзки за моите твърдения. Наречете го оригинално изследване. :-) Дъската Monopoly е измислен пример за онагледяване на идеята. Никога не съм виждал кода за внедряване на Monopoly. Примерът за буфер на трептене се основава на няколко примера за код, който съм разработил и/или върху който съм работил. - person Oddthinking; 28.08.2010
comment
Не могат ли тези проблеми да бъдат решени само с нормален свързан списък заедно с цикъл? - person day; 25.02.2014
comment
@ден със сигурност. С кръгъл списък обаче вие ​​компрометирате сложността на алгоритъма за (доста малка) сложност на структурата. Наличието на цикъл би означавало да имате поне допълнителна проверка, докато с кръгъл списък вашата структура по същество решава това вместо вас. - person Pithikos; 08.04.2017

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

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

void traverse(CircularList *c) {
  if (is_empty(c)) {
    return;
  }
  CircularList start = c;
  do {
    operateOnNode(c);
    c = c->next;
  } while(c != start);
}
person Andrew Cone    schedule 28.08.2010
comment
Общото обхождане също се нуждае от if (!is_empty(c)) { ... } около целия do .. while цикъл. - person u0b34a0f6ae; 10.11.2011
comment
Твърде трудно ли е да се използва if(!c) c=head; в единичен свързан списък, вместо да се прилага това? - person omerfarukdogan; 02.11.2015
comment
@omerfarukdogan (късен отговор!) Това е допълнителна проверка, която трябва да се приложи на всеки възел. (Не забравяйте, че началото може да е по средата на свързания списък.) По-ефективно е да се отървете от проверката, като направите списъка кръгъл и премахнете необходимостта от тестване преди всяка навигация. - person Oddthinking; 06.04.2020

Приложения

1) Можем да използваме кръгов свързан списък всяко приложение, където записите се появяват по редуващ се начин.
2) Кръговият свързан списък е основната идея на алгоритъма за кръгово планиране.

person Sarin Vadakkey Thayyil    schedule 09.08.2012

Нещо, което намерих от гугъл.

Единично свързан кръгов списък е свързан списък, където последният възел в списъка сочи към първия възел в списъка. Кръговият списък не съдържа NULL указатели.

Добър пример за приложение, където трябва да се използва кръгов свързан списък, е проблемът с споделянето на времето, разрешен от операционната система.

В среда със споделяне на времето операционната система трябва да поддържа списък с настоящи потребители и трябва последователно да позволява на всеки потребител да използва малък отрязък от процесорното време, един потребител наведнъж. Операционната система ще избере потребител, ще му позволи да използва малко време на процесора и след това ще премине към следващия потребител и т.н.

За това приложение не трябва да има NULL указатели, освен ако няма абсолютно никой, който да поиска процесорно време.

person Praveen S    schedule 28.08.2010

Кръговият свързан списък може ефективно да се използва за създаване на опашка (FIFO) или deque (ефективно вмъкване и премахване отпред и отзад). Вижте http://en.wikipedia.org/wiki/Linked_list#Circularly-linked_vs._linearly-linked

person amit    schedule 28.08.2010

Добър пример за приложение, където трябва да се използва кръгов свързан списък, е проблемът с споделянето на времето, разрешен от операционната система.

person Rahul Singal    schedule 30.12.2015

Кръговите свързани списъци (единично или двойно) са полезни за приложения, които трябва да посещават всеки възел еднакво и списъците могат да се разрастват. Ако размерът на списъка е фиксиран, е много по-ефективно (скорост и памет) да се използва кръгова опашка.

person yoonghm    schedule 02.04.2019

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

person u0b34a0f6ae    schedule 10.11.2011
comment
Според вашите думи кръговият списък е единичен списък с двата свързани края. Добре, но как това е добро? - person Pithikos; 08.04.2017

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

person Nitish Goyal    schedule 01.11.2014

Кръговите свързани списъци се използват широко в приложения, където задачите трябва да се повтарят или в приложения за споделяне на време. Циркулярната опашка може да следи задачите, които са били изпълнени и които трябва да бъдат изпълнени, след като конкретната задача е изпълнена, тя преминава към следващата и когато целият набор от задачи е завършен, отново преминава към първата задача, за да завърши оставащата задача. При практическа употреба: когато отворите множество приложения на вашата система, паметта на тези приложения се записва в кръг, можете да наблюдавате това, ако натискате непрекъснато win+tab/alt+tab за превключване на приложения. Също така в настолните игри за много играчи всеки играч се присвоява на възел в свързания списък и ротацията се извършва

person wolf_flow    schedule 14.12.2018