Восходящие кардинальные числа в APL

В библиотеке идиом FinnAPL 19-й элемент описывается как "Восходящие кардинальные числа (ранжирование, все разные)", а код выглядит следующим образом:

⍋⍋X

Я также нашел рецензию на книгу той же библиотеки Р. Пески, в которой он сказал: "По возрастанию кардинальных чисел (ранжирование, все разные)". Как многие из нас понимают, почему оценка результата Повышения класса имеет такой эффект? " мой вопрос тоже Я много искал в интернете и придумал пшик.

1 ответ

Решение

Восходящие кардинальные числа

Для краткости я назову этот небольшой фрагмент кода "ранг". Становится очевидным, что происходит с рангом, когда вы начинаете применять его к двоичным числам. Например:

X←0 0 1 0 1
⍋⍋X             ⍝ output is 1 2 4 3 5

Выходные данные указывают положение значений после сортировки. Из выходных данных вы можете видеть, что два 1 будут в последних двух слотах 4 и 5, а 0 - в позициях 1, 2 и 3. Таким образом, он присваивает ранг каждому значению вектора. Сравните это, чтобы оценить:

X←7 8 9 6
⍋X              ⍝ output is 4 1 2 3
⍋⍋X             ⍝ output is 2 3 4 1

Вы можете думать о повышении, как эта позиция получает это число, и вы можете думать о рейтинге, как это число получает эту позицию:

7 8 9 6         ⍝ values of X

4 1 2 3         ⍝ position 1 gets the number at 4 (6)
                ⍝ position 2 gets the number at 1 (7) etc.
2 3 4 1         ⍝ 1st number (7) gets the position 2
                ⍝ 2nd number (8) gets the position 3 etc.

Интересно отметить, что повышение и ранжирование подобны двум сторонам одной медали, и вы можете чередовать их. Другими словами, у нас есть следующие личности:

⍋X = ⍋⍋⍋X = ⍋⍋⍋⍋⍋X = ...
⍋⍋X = ⍋⍋⍋⍋X = ⍋⍋⍋⍋⍋⍋X = ...

Зачем?

Пока что это на самом деле не отвечает на вопрос господина Пески о том, почему это имеет такой эффект. Если вы думаете о парах ключ-значение, ответ заключается в том, что исходные ключи представляют собой набор возрастающих кардинальных чисел: 1 2 3 4. После применения повышения класса создается новый вектор, значения которого являются исходными. ключи переставлены так, как они должны быть после сортировки: 4 1 2 3. Повторное применение оценки означает восстановление исходных ключей в последовательности возрастающих кардинальных чисел. Однако значения этого третьего вектора не являются самими восходящими кардинальными числами. Скорее они соответствуют ключам второго вектора.

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

7 8 9 6
2 3 4 1

В этом примере 2 ссылается на 7 из исходного положения 7. Поскольку значение 2 также соответствует ключу второго вектора, который, в свою очередь, является второй позицией, последнее сообщение состоит в том, что после сортировки 7 будет в положении 2. 8 будет в положении 3, 9 в 4 и 6. в 1-й позиции.

Рейтинг и поделиться

В библиотеке идиом FinnAPL 2-й элемент описывается как "Восходящие кардинальные числа (ранжирование, совместное использование)", а код выглядит следующим образом:

⌊.5×(⍋⍋X)+⌽⍋⍋⌽X

Вывод этого кода совпадает с его братом, возрастающие кардинальные числа (ранжирование, все разные), пока все значения входного вектора различны. Тем не менее, разделяемая версия не назначает новые значения для тех, которые равны:

X←0 0 1 0 1
⌊.5×(⍋⍋X)+⌽⍋⍋⌽X         ⍝ output is 2 2 4 2 4

Значения выходных данных обычно следует интерпретировать как относительные, т. Е. 2 ​​имеют относительно более низкий ранг, чем 4, поэтому они будут появляться первыми в массиве.

Другие вопросы по тегам