2013-10-20 4 views
3

У меня вопрос в классе алгоритмов, и я не могу его решить. В вопросе говорится, что Theres является алгоритмом сортировки с O(nlogn), а поиск выполняется путем поиска двоичного поиска O(log n). Два набора дают P & Q, и я должен разработать алгоритм для определения того, являются ли два набора непересекающимися.Disjoint set using Search and Sorting

ответ

5

O(N) решение (при условии, что два набора сортируются):

  1. слияния двух отсортированных наборов информации как элемент принадлежит к которому устанавливается
  2. траверс через список слияния, если вы найти два равных элемента из двух наборов, чем непересекающиеся, если они достигают до конца, чем disjoint

например. не

a= 1, 4, 6 
b= 2, 4, 7 

слилась набор =

элементы:1 2 4 4 6 7

установить нет (а/б):1 2 1 2 1 2

Теперь мы ясно видим, что две четверки являются последовательными и оба из двух разных наборов, следовательно, не пересекаются.

EDIT:

Если ваша потребность найти множество не пересекается или не чем простое слияние даст вам это. Как только вы обнаружите, что оба элемента в наборах равны, чем просто возврат, говорящий не дизъюнктным другим, если они могут достигать до конца как непересекающихся.

Вопрос, связанный с контейнером. Ниже, что:

class Element{ 
int i; 
int setInfo 
} 

Теперь объявить массив как: Element[] e=new Element[X];

Надежда я ясно.

+1

Предполагая, что два набора отсортированы, вы правы. Чтобы сделать ваше решение, можно изменить алгоритм слияния и вместо слияния проверить только два элемента. – iampat

+0

@ Попытайтесь, можете ли вы дать практический подход для хранения информации о заданном числе, я имею в виду предоставление массива int, какой контейнер вы будете использовать? – nitinsh99

+0

@ nitinsh99 отредактировал ответ. – Trying

2

Два набора будут непересекающимися, только если между этими двумя наборами нет общего элемента. Я предполагаю, что оба эти набора имеют по n элементов. Этот алгоритм проверяет общий элемент в nlog (n) времени. Если общий элемент не найден, это означает, что оба набора не пересекаются.

For each element in set "P" search whether that number exist in set "Q". 
Time complexity - n*log(n) 
Log(n) to search in set Q and this search will be done "n" times. 
+0

Просто убедитесь, что сначала отсортированы наборы (другая операция O (n log n)), поэтому поиск может выполняться в O (n) времени. –

+0

Если оба списка отсортированы перед поиском, сложность времени будет равна O (nlogn) + O (nlogn) + O (nlogn) = O (nlogn) [2 сортировка и один поиск.] Справа? @TedHopp - как выполнить поиск в O (n), поскольку бинарный поиск будет принимать O (logn), и если мы будем использовать линейный поиск, чем O (n), но так как его внутри другого цикла будет O (n^2) , –

+0

@Ted, не могли бы вы объяснить, как поиск общего элемента в двух отсортированных массивах займет всего n раз? – nitinsh99