#algorithm #time-complexity
#алгоритм #время-сложность
Вопрос:
У меня очень большой отсортированный массив. Как я могу посчитать или распечатать все уникальные элементы массива??
Предположим, что мой массив равен [2,3,3,3,4,6,6,7], тогда результат должен быть 2,3,4,6,7
Я знаю, как сделать это за n (сложность) времени. Но интервьюер попросил меня сделать это за время регистрации n?? Возможно ли это?
Комментарии:
1. Поскольку печать элементов — это сложность O (n), этого не должно быть, если у вас есть только предопределенное количество разных элементов (предположим, у вас есть целые числа от 1 до 10 в массиве).
2. Интервьюер не просит выполнять задачу с (log n) количеством операций. Он просит, чтобы сложность была (log n), это означает, что количество операций пропорционально (log n). например, для алгоритма o (n), если для 100 элементов требуется 100 000 операций, то для 200 элементов потребуется 200 000 операций. где, что касается алгоритма o (log n), если для 100 элементов требуется 100 000 операций, то для 200 элементов потребуется 100 150 и т.д. (Игнорируйте фактические числа. Они просто ориентировочные)
Ответ №1:
Вот алгоритм, который требует O(logn*k)
, чтобы где k — уникальные элементы:-
set uniQ
int ind = 0;
do {
uniQ.add(arr[i]);
ind = BinSearchGreater(arr,arr[ind],ind 1);
if(ind >= arr.length)
break;
} while(true);
BinSearchGreater(arr,key,start_ind) : returns index of first element greater than key in subarray starting at start_ind
Временная сложность :-
Обратите внимание, что этот алгоритм хорош только тогда, когда ни один из уникальных элементов не является маленьким.
Это асимптотически O(n*logn)
, если все уникальны, поэтому хуже, чем линейные.
Комментарии:
1. Мой интервьюер был очень доволен этим решением, когда мне однажды задали тот же вопрос.
Ответ №2:
Я хотел бы знать, как он (интервьюер) подсчитывает каждый уникальный элемент в массиве [1,2,3,4,5], не выбирая хотя бы каждый элемент. В этом случае вам нужно выбрать каждый элемент для подсчета каждого элемента, и это будет сделано за O (n) . На мой взгляд, невозможно получить сложность O (log n), если к данному массиву нет других требований.
Комментарии:
1. массив отсортирован, поэтому вам не нужно просматривать каждый элемент.
2. Вы должны хотя бы прочитать весь этот массив, чтобы нижняя граница была O (n)
3. @perreal вы должны просмотреть каждый элемент, например, этот случай (2,5,7,100), как вы можете определить?
4. Я думаю, это можно сделать в
M log N
whereM
— размер результата. Вы можете добиться этого, выполнив несколько двоичных поисков.5. @PhamTrung, это список всех элементов uniq, поэтому даже печать равна O (n). Что делать, если у вас есть логарифмические (n) уникальные элементы?