2014-10-18 3 views
2

Для двух отсортированных массивов a [] и b [], размеров N1 и N2, соответственно, создайте алгоритм для нахождения k-го по величине ключа. Порядок роста наихудшего времени работы вашего алгоритма должен быть равен  lg (N1 + N2).Выбор в двух отсортированных массивах

В намеки на этот вопрос сказать, что существует два возможных решения:

Подход А: Вычислить средний показатель в a []  и средний показатель в  б [] . Повторить в подзапросе примерно в два раза.

Я уже реализовали это решение (суть которого состоит в изменении размеров/усечения [] и B [] для длины к, находя медиану в каждом, сравнивая их, выбирая соответствующие половины массива - дилинг . угловыми случаи в зависимости от обстоятельств)

другого подхода получил в жизни:

Дизайн алгоритм постоянная времени, чтобы определить, является ли a [я]  является -й по величине ключа. Используйте эту подпрограмму и двоичный поиск.

У меня возникли проблемы с выяснением, как это сделать. Я знаю, что, учитывая только один массив, можно найти, если данный элемент является kth-наибольшим ключом в O (1) раз, просто просматривая индекс этого элемента. Тем не менее, я не уверен, когда два массива, как определить, является ли элемент k-м наибольшим по объединению этих двух массивов.

ответ

2

Если x является к ю наибольшего элемента в a ⋃ b, то есть именно k-1 крупные элементы a ⋃ b. Предполагая, что массивы отсортированы в порядке убывания - вам нужно будет отрегулировать арифметику, если они отсортированы по-другому - тогда есть точно i-1 элементов в a, которые больше a[i]; любые оставшиеся большие элементы в объединении должны исходить от b.

Следовательно, a[i] является к ю наибольшего элемента в a ⋃ b если есть точно k-i большие элементы в b, так как в этом случае будут i-1 + k-i == k-1 больше элементов в объединении. Поэтому вам нужно сравнить a[i] с b[k-i] и b[k-i+1], чтобы узнать, что, безусловно, O (1).

+0

Теперь я застреваю, пытаясь использовать это в каком-то бинарном поиске, чтобы найти k-й наибольший элемент в 'a U b'. Я попробовал следующее: я модифицировал алгоритм, чтобы определить, является ли элемент в массиве A больше или равен k-му наибольшему элементу в 'AUB', а затем двоичный поиск по A, а если не найден, делайте то же самое с массивом B . Это сложность O (logA + logB). Есть ли способ сделать это в сложности O (log (A + B))? – 1110101001

+0

@ user2612743: По существу, O (logA + logB) совпадает с O (log (A + B)), потому что они отличаются не более чем постоянным коэффициентом 2. – rici

+0

Как вы это получили? Не является ли O (logA + logB) = O (log (A * B)) законами логарифма? Как это асимптотически эквивалентно O (log (A + B))? – 1110101001

Смежные вопросы