Unsort: запоминание перестановки и отмена ее

Предположим, у меня есть функция f, которая принимает вектор v и возвращает новый вектор с некоторыми преобразованными элементами. Это достигается путем вызова функции g, предполагающей, что вектор отсортирован. Итак, я хочу, чтобы f было определено так:

f[v_] := Module[{s, r},
  s = Sort[v];  (* remember the permutation applied in order to sort v *)
  r = g[s];
  Unsort[r]     (* apply the inverse of that permutation *)
]

Как лучше всего выполнить «Несортировку»?

Или мы могли бы по-настоящему фантазировать и заставить это как-то работать:

answer = Unsort[g[Sort[v]]];

ДОБАВЛЕНО: Давайте сделаем этот бетон с помощью игрушечный пример. Предположим, нам нужна функция f, которая принимает вектор и преобразует его, добавляя к каждому элементу следующий наименьший элемент, если таковой имеется. Это легко написать, если предположить, что вектор отсортирован, поэтому давайте напишем вспомогательную функцию g, которая делает это предположение:

g[v_] := v + Prepend[Most@v, 0]

Теперь для функции, которая нам действительно нужна, f, которая работает независимо от того, отсортирован v или нет:

f[v_] := (* remember the order; 
            sort it;
            call g on it;
            put it back in the original order;
            return it
         *)
5
задан dreeves 31 December 2010 в 06:45
поделиться