Ниже приводится выдержка из «Структуры Алгоритмы + Данные = Программы» по Никлаус Вирт, глава «1.7 Структура записи.»:Связывание элементов массива со смещением
В следующем примере мы предполагаем, что (возможно, чтобы быстрее их найти) некоторые группы лиц в массиве a связаны между собой. Информация связывания представлена дополнительным компонентом структуры записи Лицо, названное link. Связи соединяют записи в линейную цепочку, чтобы можно было легко найти преемника и предшественника каждого человека. Интересным свойством этого метода связывания является то, что цепь может проходить по обоим направлениям на основе одного числа, сохраненного в каждой записи. Техника работает следующим образом.
Предположим, что индексы трех последовательных членов цепочки я к-1, я к, я K + I. Значение звено-го элемента к выбирается так, чтобы быть я к + 1 - я к-1. Обход цепь в прямом направлении, я к + 1 определяется из двух текущих переменных индекса х = я к-1 и у = я к как:
я к + 1 = х + а [у] .link
тогда пересекая цепь в обратном направлении, I к-1 определяется из х = I к + 1 и у = я к как:
я к-1 = х - а [у] .link
пример объединения всех лиц равного пола в таблице:
Index First Name Sex Link
----- ---------- --- ----
1 Carolyn F 2
2 Chris M 2
3 Tina F 5
4 Robert M 3
5 Jonathan M 3
6 Jennifer F 5
7 Raytheon M 5
8 Mary F 3
9 Anne F 1
10 Mathias M 3
Я не могу понять, как работает связывание. Предположим, что мы хотим пересечь цепь в прямом направлении, начиная с y = i k = a [1]. Поскольку у нас нет предыдущих i k-1 элемент, каково стартовое значение x? Я пробовал начать с x = 0 или x = 1, но оба ведут к неправильным последовательностям. Что, если мы хотим пересечь цепь в обратном направлении?