Вступление
Предположим, что вам передана случайная перестановка 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- это вектор битов.