В чем разница между кольцевым буфером и циклическим связанным списком?
Какой цели служит кольцевой буфер, чего не может сделать круговой связанный список, или наоборот?
В чем разница между кольцевым буфером и циклическим связанным списком?
Какой цели служит кольцевой буфер, чего не может сделать круговой связанный список, или наоборот?
Кольцевой буфер — это единый непрерывный блок памяти, который содержит ваши элементы, и когда вы достигаете конца, вы возвращаетесь к началу:
+----------------------+
| |
+-->| a | b | c | d |--+
=== increasing memory ===>
Циклический связанный список из-за природы связанного списка вообще не должен быть непрерывным, поэтому все элементы могут быть разбросаны по памяти. Он просто подчиняется тому свойству, что элементы цикла:
+---------| d |<-----------------+
| |
+-->| a |------------->| b |--+ |
| |
+-----------------+ |
| |
+-->| c |------------+
=== increasing memory ===>
Циклический связанный список имеет то же преимущество перед кольцевым буфером, что и связный список перед фиксированным массивом. Он может различаться по размеру, и вы можете вставлять и удалять элементы без перетасовки.
Недостатки также аналогичны: нет доступа к массиву O (1) и увеличивается объем работы, если вы расширяете или сжимаете список.
Кольцевой буфер, как правило, используется, когда вы знаете максимально допустимое количество записей в нем или не возражаете против его ограничения. Например, если у вас есть протокол связи, который может блокировать передающую сторону, когда буфер заполняется, давая принимающей стороне время наверстать упущенное.
Примером кругового связанного списка может быть список процессов в операционной системе, где вам нужно иметь возможность добавлять или удалять процессы, но вам не заботится заголовок списка, а только текущий элемент.