Обратный круговой буфер

я не очень разбираюсь в программировании алгоритмов основ, так что вот моя проблема. Я хочу создать алгоритм, который может заполнять круговой буфер, но он должен начинаться в конце буфера. Я пытаюсь сделать это уже много часов без успеха, поэтому прошу вашей помощи.

Я знаю исходный алгоритм, который начинается с начала буфера: i = (i+1)%buffLen

Но я хочу что-то, что поместит что-то из buffLen-1 в 0, и когда оно достигнет 0, оно начнется с buffLen-1.

Я знаю, что это можно сделать с условием, но я уверен, что есть формула, чтобы сделать это быстрее и чище.

Мне нужно, чтобы он бесконечно перебирал массив объектов к концу.

Извините за мой плохой английский.


person Moinonime    schedule 27.11.2011    source источник
comment
Быстрее? Сомневаюсь, что вы вообще заметите разницу. Очиститель? Я почти уверен, что загадочную магическую формулу будет труднее прочесть, чем тривиальное if (i == (bufLen - 1)) i = 0. в чем проблема с этим? (кстати, вы являетесь прекрасным примером того, насколько загадочной была бы такая формула: вы сказали, что знаете, как это сделать с if, но не можете найти эквивалентное выражение с модульной арифметикой самостоятельно...)   -  person Bruno Reis    schedule 27.11.2011


Ответы (1)


Пытаться

i = (i + buffLen - 1) % buffLen;

Она не будет эффективнее (и даже не эффективнее) конструкции if..else, но это аналог однострочного присваивания для движения в положительном направлении.

person Ted Hopp    schedule 27.11.2011
comment
Для многих языков программирования i = (i-1) % buffLen также может работать, но решение Теда безопаснее. - person Cito; 27.11.2011
comment
@Cito. Согласно этой статье в Википедии, он будет работать на очень немногих языках. Он не работает в Java, JavaScript, C/C++ или C#. - person Ted Hopp; 27.11.2011
comment
Хорошо, возможно, мне следует использовать s/many/some, но, по крайней мере, это работает в Perl, Python и Ruby. - person Cito; 27.11.2011