منظورت از فوقالعاده زیادتا چندتاست !؟
راستش این سوال کاملاً به این بستگی داره که شما چندتا search بخوای روی آرایت انجام بدی. چون اگر قرار باشه فقط یه دونه جستجو انجام بدی پیچیدگیش n میشه! اما اگر بخوای چندین تا جستجو روی آرایه انجام بدی اولش یه پیچیدگی n داری و بعداً هر جستجو رو میتونی تو log n انجام بدی. پس من فرض میکنم که هدفتون اینه که تعدادی جستجو روی آرایه انجام بدین :
دو تا آرایه در نظر بگیر، مثلاً first و last. یه آرایه ی دیگه هم به نام copy در نظر بگیر و داده های آرایه ی اصلی رو توش کپی کن. حالا مقداری که توی first[i] I باید قرار بدی برابر با اولین مکان i امین عنصر غیر تکراری هستش و مقداری هم که توی last[i] I باید قرار بدی برابر با آخرین مکان i امین عنصر غیر تکراری هستش. آرایه ی copy رو هم باید جوری تغییر بدی که copy[i] I شامل i امین عنصر غیر تکراری باشه. حالا با باینری سرچ روی آرایه ی copy باید مکان عنصر جستجو شده رو توی آرایه ی copy به دست بیاری (فرض کن j به دست اومد). حالا first[j] I شامل اولین ایندکس و last[j] I هم شامل آخرین ایندکس توی آرایه ی اصلی خواهند بود.
int dif=0;
first[0]=0;
copy[0]=a[0];
for(int i=1;i<n;i++){
if(a[i]!=a[i-1]){
last[dif]=i-1;
first[++dif]=i;
copy[dif]=a[i];
}
}
last[dif]=n-1;
dif+1 تعداد عناصر غیر تکراری توی آرایه هستش. پس باید باینری سرچ رو از اندیس 0 تا dif روی آرایه ی copy انجام بدی. کاملاً واضحه کدی رو هم که بالا گذاشتم فقط یه بار باید انجام بدی.