Страница 2 из 2

Re: Оптимальный вариант зацикливания индексов массива

СообщениеДобавлено: 06 фев 2018, 23:08
maksimov
)))
Вот так, "элементарный вопрос" превращается в неразрешимую задачу.

К слову, работающее арифметическое решение, вот:
Синтаксис:
Используется csharp
int f = i < 0 ? length - System.Math.Abs(i%length):i%length;
f = f == length ? 0 : f;
 

Только я как-то не уверен, что оно реально оптимальнее изначального:
Синтаксис:
Используется csharp
while (x > size - 1)
                x = x - size;
while (x < 0)
                x = x + size;
 

Которое при определённых условиях, можно сфейковать и до такого: (не уверен, насколько это критично в плане производительности)
Синтаксис:
Используется csharp
if (x > size - 1)
    x = x - size;
else if (x < 0)
    x = x + size;
 


"Одно/два сравнения и опциональное вычитание/сложение"
, против "двух сравнений, деления по остатку и опционального вычитания с вызовом системной функции".
Хм..

Re: Оптимальный вариант зацикливания индексов массива

СообщениеДобавлено: 07 фев 2018, 00:25
samana

Re: Оптимальный вариант зацикливания индексов массива

СообщениеДобавлено: 07 фев 2018, 01:53
maksimov
samana писал(а):Надеюсь оно https://stackoverflow.com/questions/108 ... g-my-brain


Спасибо. Идея с
int newIndex = (index + 100) % length;
просто шикарна по своей красоте и изяществу. =)

По прежнему не уверен, является ли арифметический метод производительнее сравнения, но данный способ является явно самым красивым.

Спасибо за линк!