Сравните два целых массива с одинаковой длиной
[Описание] Для двух целых массивов с одинаковой длиной. Разработайте алгоритм, который может судить о том, совпадают ли они. Определение "того же" состоит в том, что если эти два массива были отсортированы по порядку, элементы в соответствующем положении должны быть одинаковыми.
[Example]
<1 2 3 4> = <3 1 2 4>
<1 2 3 4> != <3 4 1 1>
[Ограничение] Алгоритм должен требовать постоянного дополнительного пространства и времени выполнения O (n).
Ответы
Ответ 1
(Вероятно, слишком сложный вопрос для интервью.)
(Вы можете использовать время O (N), чтобы проверить, что min, max, sum, sumsq и т.д. сначала равны.)
Используйте no-extra-space radix sort для сортировки двух массивов на месте. O (N), O (1) пространство.
Затем сравните их, используя обычный алгоритм. O (N), O (1) пространство.
(При условии, что (max & min; min) массивов имеет O (N k) с конечным k.)
Ответ 2
Вы можете попробовать вероятностный подход - преобразовать массивы в число в некоторой огромной базе B
и mod некоторым простым P
, например sum B^a_i
для всех i
mod some big-ish P
. Если они оба выйдут на один и тот же номер, повторите попытку за столько простых чисел, сколько захотите. Если это неверно при любых попытках, то они неверны. Если они пройдут достаточно сложных задач, то они с большой вероятностью будут равны.
Существует тривиальное доказательство для B
> N
, P
> наибольшего числа. Таким образом, должен быть вызов, который не может быть удовлетворен. Это фактически детерминированный подход, хотя анализ сложности может быть более сложным, в зависимости от того, как люди рассматривают сложность с точки зрения размера ввода (в отличие от количества элементов).
Ответ 3
Я утверждаю, что: если не задан диапазон ввода, то он НЕВОЗМОЖНО решить в дополнительном пространстве и времени O (n).
Я буду рад, что оказался ошибочным, чтобы я мог узнать что-то новое.
Ответ 4
- Вставьте все элементы из первого массива в хэш-таблицу
- Попробуйте вставить все элементы из второго массива в одну и ту же хэш-таблицу - для каждой вставки в элемент уже должен быть
Хорошо, это не с постоянным дополнительным пространством, но лучше всего я мог бы подняться на данный момент:-). Существуют ли какие-либо другие ограничения, налагаемые на вопрос, например, например, на наибольшее целое число, которое может быть включено в массив?
Ответ 5
Несколько ответов в основном правильны, хотя они не похожи. Подход хэш-таблицы (для одного примера) имеет верхний предел, основанный на диапазоне используемого типа, а не на количестве элементов в массивах. По крайней мере, по большинству определений, что делает (верхний предел) пространством постоянным, хотя константа может быть довольно большой.
В теории вы можете изменить это с верхнего предела на истинное постоянное количество пространства. Например, если вы работали на C или С++, и это был массив char
, вы могли бы использовать что-то вроде:
size_t counts[UCHAR_MAX];
Поскольку UCHAR_MAX является константой, объем пространства, используемого массивом, также является константой.
Изменить: я хотел бы отметить для записи, что привязка к диапазонам/размерам задействованных элементов подразумевается почти во всех описаниях алгоритмической сложности. Например, мы все "знаем", что Quicksort - это алгоритм O (N log N). Это правда, однако, если мы предположим, что сравнение и замена сортируемых элементов занимает постоянное время, что может быть истинным только в том случае, если мы связали диапазон. Если диапазон задействованных элементов достаточно велик, и мы больше не можем рассматривать сравнение или обмен как постоянное время, то его сложность станет чем-то вроде O (N log N log R), если R - диапазон, поэтому log R
аппроксимирует количество бит, необходимых для представления элемента.
Ответ 6
Это трюк? Если авторы предполагали, что целые числа находятся в заданном диапазоне (2 ^ 32 и т.д.), Тогда "дополнительное постоянное пространство" может быть просто массивом размера 2 ^ 32, в котором вы считаете вхождения в обоих списках.
Если целые числа не изменяются, это невозможно.
Ответ 7
Вы можете добавить каждый элемент в hashmap < Integer, Integer > со следующими правилами: Array A - сумматор, массив B - это средство удаления. При вставке из Array A, если ключ не существует, вставьте его со значением 1. Если ключ существует, увеличьте значение (сохраните счет). При удалении, если ключ существует и больше 1, уменьшите его на 1. Если ключ существует и равен 1, удалите элемент.
Запустите массив A, за которым следует массив B, используя приведенные выше правила. Если в любое время во время фазы удаления массив B не находит элемент, вы можете немедленно вернуть значение false. Если после того, как оба сумматора и удаления закончены, hashmap пуст, массивы эквивалентны.
Изменить: размер хэш-таблицы будет равен количеству различных значений в массиве, соответствует ли это определению константного пространства?
Ответ 8
Я предполагаю, что для решения потребуется какое-то преобразование, которое является ассоциативным и коммутативным и гарантирует уникальный результат для уникального набора входов. Однако я не уверен, что это даже существует.
Ответ 9
public static boolean match(int[] array1, int[] array2) {
int x, y = 0;
for(x = 0; x < array1.length; x++) {
y = x;
while(array1[x] != array2[y]) {
if (y + 1 == array1.length)
return false;
y++;
}
int swap = array2[x];
array2[x] = array2[y];
array2[y] = swap;
}
return true;
}
Ответ 10
Для каждого массива используйте метод сортировки подсчета, чтобы построить счетчик количества элементов, меньших или равных определенному элементу. Затем сравните два построенных вспомогательных массива с каждым индексом, если они равны массивам r, равным другим, а не r. Для сортировки COACH требуется O (n) и сравнение массива при каждом индексе снова O (n), так что полностью его O (n), а требуемое пространство равно размеру двух массивов. Вот ссылка на подсчет сортировки http://en.wikipedia.org/wiki/Counting_sort.
Ответ 11
данный int находится в диапазоне -n.. + n простым способом проверки справедливости может быть следующий (псевдокод):
// a & b are the array
accumulator = 0
arraysize = size(a)
for(i=0 ; i < arraysize; ++i) {
accumulator = accumulator + a[i] - b[i]
if abs(accumulator) > ((arraysize - i) * n) { return FALSE }
}
return (accumulator == 0)
Аккумулятор должен иметь возможность хранить целое число с диапазоном = + - arraysize * n
Ответ 12
Как это сделать - XOR все числа в обоих массивах. Если результат равен 0, вы получили совпадение.