Как эффективно найти ранг каждого элемента массива, усредняя в случае связей? Например:Эффективное обнаружение рангов элементов в массиве?
float[] rank(T)(T[] input) {
// Implementation
}
auto foo = rank([3,6,4,2,2]); // foo == [3, 5, 4, 1.5, 1.5]
Единственный способ, которым я могу думать делать это требует выделения 3 массива:
- дубликат входного массива, так как он должен быть отсортирован, и мы не его владельцем.
- Массив для отслеживания порядка сортировки входного массива.
- Множество рангов для возврата.
Кто-нибудь знает, как это сделать в O (N log N) и O (1) вспомогательном пространстве (что означает, что мы должны выделить только один массив, который мы собираемся вернуть) или по крайней мере, избавиться от одного из трех массивов выше?
Что вы подразумеваете под «мы не владеем им»? – Jacob
Фактически вы, вероятно, могли бы обойтись без второго массива, так как поиск в отсортированном массиве равен O (log N), и вам понадобятся N поисковых запросов, которые работают в соответствии с требованием O (N log N). –
«мы его не владеем» = это функция библиотеки, которая должна предположить, что вызывающий агент rank() не ожидает, что его входной массив будет беспорядочно переупорядочен, поэтому по принципу наименьшего удивления мы должны его дублировать и сортировать по копии. – dsimcha