Идентичный пара в массиве 2 индексов p,q
таким образом, чтоПодсчет количества идентичных пар
0<=p<q<N
и array[p]=array[q]
где N
длина массива.
Учитывая несортированный массив, найдите число одинаковых пар в массиве.
Моим решением было сортировать массив по значениям, отслеживать индексы.
Тогда для каждого индекса p
в отсортированном массиве, посчитайте все q<N
таким образом, что и
sortedarray[p].index < sortedarray[q].index and
sortedarray[p] = sortedarray[q]
Является ли это правильный подход. Я думаю, что сложность будет
O(N log N) for sorting based on value +
O(N^2) for counting the newsorted array that satisfies the condition.
Это значит, что я все еще смотрю O(N^2)
. Есть ли способ лучше ?
Еще одна мысль, которая пришла, заключалась в том, что каждый P-бинарный поиск сортировал массив для всех Q, который удовлетворяет условию. Разве это не уменьшить сложность второй части к O(Nlog(N))
Вот мой код для второй части
for(int i=0;i<N;i++){
int j=i+1;
while(j<N && sortedArray[j].index > sortedArray[i].index &&
sortedArray[j].item == sortedArray[i].item){
inversion++;
j++;
}
}
return inversion;
@Edit: Я думаю, я перепутал сложность второй части будет O(N^2)
.
Как и в каждой итерации во время цикла, не происходит повторного сканирования элементов из индексов 0-i, для сканирования отсортированного массива для подсчета инверсий требуется линейное время. Таким образом, общая сложность
O(NlogN)
для сортировки и O(N)
для линейного сканирования в сортированном массиве.
Поскольку сортировка объединяет одинаковые значения, вам не нужно проверять все 'q', только те, которые находятся рядом с' p'. Если вы используете стабильный алгоритм сортировки, вам даже не нужно выполнять первый тест. –
Правильно, мне нужно будет проверить значения вблизи p, для каждого p из 0
sreeprasad
Тот факт, что массив отсортирован, подразумевает что вы можете сканировать его за один проход. Таким образом, это не O (n^2), а O (n). В качестве примера счетчика сортировка вставки - это O (n^2), потому что для каждого элемента он должен сканировать весь массив. – mdm