我有一个非常大的排序数组。如何计算或打印数组的所有唯一元素?
假设我的数组是[2,3,3,3,4,6,6,7] 那么输出应该是2,3,4,6,7
我知道在n(复杂)时间内这样做。但是面试官让我在日志时间里这样做? 有可能吗?
答案 0 :(得分:6)
这是一个需要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 :(得分:0)
我想知道他(采访者)如何计算数组[1,2,3,4,5]中的每个独特元素,而不至少选择每个元素。在这种情况下,您必须选择每个元素来计算每个元素,这将在O(n)中完成。在我看来,如果对给定数组没有其他要求,则无法获得O(log n)的复杂性。