Вступление
Предположим, что вам передана случайная перестановка n
объектов. Перестановка запечатана в коробке, так что вы не знаете, какая из n!
возможных. Если вам удалось применить перестановку к n
отдельным объектам, вы могли бы сразу определить ее идентичность. Однако вам разрешено применять перестановку только к n
двоичным векторам длины , что означает, что вам придется применять ее несколько раз, чтобы распознать ее. Очевидно, что применение его к n
векторам только с одним 1
выполняет свою работу, но если вы умны, вы можете сделать это с помощью log(n)
приложений. Код для этого метода будет длиннее, хотя ...
Это экспериментальная задача, в которой ваш результат представляет собой комбинацию длины кода и сложности запроса , то есть количества обращений к вспомогательной процедуре. Спецификация немного длинная, так что терпите меня.
Задание
Ваша задача - написать именованную функцию (или ближайший эквивалент), f
которая принимает в качестве входных данных положительное целое число n
и перестановку p
первых n
целых чисел, используя индексацию на основе 0 или 1. Его вывод - перестановка p
. Однако вам не разрешен p
прямой доступ к перестановке . Единственное, что вы можете сделать с ним, это применить его к любому вектору n
битов. Для этой цели вы должны использовать вспомогательную функцию, P
которая принимает перестановку p
и вектор битов v
и возвращает переставленный вектор, в чьей p[i]
координате которого содержится бит v[i]
. Например:
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
Вы можете заменить «биты» любыми двумя различными значениями, такими как 3
и -4
, или 'a'
и 'b'
, и они не должны быть фиксированными, так что вы можете вызывать P
оба [-4,3,3,-4]
и [2,2,2,1]
в одном вызове f
. Определение P
не засчитывается в ваш счет.
счет
Сложность запроса вашего решения на данный входе является числом вызовов он делает для вспомогательной функции P
. Чтобы сделать эту меру однозначной, ваше решение должно быть детерминированным. Вы можете использовать псевдослучайно сгенерированные числа, но затем вы должны также исправить начальное начальное число для генератора.
В этом репозитории вы найдете файл с именем, permutations.txt
который содержит 505 перестановок, по 5 каждой длины от 50 до 150 включительно, с использованием индексации на основе 0 (увеличивайте каждое число в случае на основе 1). Каждая перестановка находится на отдельной строке, а ее номера разделены пробелами. Ваша оценка - количество байтов f
+ средняя сложность запроса на этих входных данных . Самый низкий балл побеждает.
Дополнительные правила
Код с пояснениями предпочтителен, а стандартные лазейки запрещены. В частности, отдельные биты неразличимы (поэтому вы не можете задавать вектор Integer
объектов P
и сравнивать их идентичности), и функция P
всегда возвращает новый вектор, а не переупорядочивает свои входные данные. Вы можете свободно изменять имена f
и P
, и порядок, в котором они принимают свои аргументы.
Если вы первый, кто отвечает на вашем языке программирования, настоятельно рекомендуется включить тестовый набор, в том числе реализацию функции, P
которая также подсчитывает количество вызовов, которые были вызваны. В качестве примера, вот вам жгут для Python 3.
def f(n,p):
pass # Your submission goes here
num_calls = 0
def P(permutation, bit_vector):
global num_calls
num_calls += 1
permuted_vector = [0]*len(bit_vector)
for i in range(len(bit_vector)):
permuted_vector[permutation[i]] = bit_vector[i]
return permuted_vector
num_lines = 0
file_stream = open("permutations.txt")
for line in file_stream:
num_lines += 1
perm = [int(n) for n in line.split()]
guess = f(len(perm), perm)
if guess != perm:
print("Wrong output\n %s\n given for input\n %s"%(str(guess), str(perm)))
break
else:
print("Done. Average query complexity: %g"%(num_calls/num_lines,))
file_stream.close()
На некоторых языках невозможно написать такой жгут. В частности, Haskell не позволяет чистой функции P
записывать количество вызовов. По этой причине вам разрешается повторно реализовать ваше решение таким образом, чтобы оно также рассчитывало сложность его запроса, и использовать его в проводке.
abaaabababaa
и другое-4 3 3 3 -4 3
- это вектор битов.