Fast checking if array has repeated elements or not

29 visualizzazioni (ultimi 30 giorni)
I need to check whether a given array, A has repeated elements or not and return in true or false. The function runs near about 5*10^6 times. Initially I tried this
function flag = hasNoRepeats(A)
flag = numel(A)==numel(unique(A)) ;
end
This is very slow, it takes about 90-100 seconds. It is given that array has all positive integers and they are in between 1 and K.
function flag = hasNoRepeats(A,K)
tmp = zeros(1,K);
flag = true;
for i=1:numel(A)
if tmp(A(i))
flag = false;
break
end
tmp(A(i)) = 1;
end
end
This version is faster (~20 secs) but still slower than my requirements. Is there any way to do it faster?
  4 Commenti
Alex Mcaulley
Alex Mcaulley il 8 Apr 2020
Using sort and diff you can try with:
flag = ~sum(~diff(sort(A)));
Dhritishmam Sarmah
Dhritishmam Sarmah il 8 Apr 2020
Thanks Alex. But it seems like my implementation using sort gives the best timing yet so I will stick with it for the moment.

Accedi per commentare.

Risposte (1)

KSSV
KSSV il 8 Apr 2020
Modificato: KSSV il 8 Apr 2020
You can simply use unique to find out whether a array has repeated elements or not.
Let A be your array.
if length(A)==length(unique(A))
fprintf("A has no repeated elements") ;
else
fprintf("A has repeated elements") ;
end

Categorie

Scopri di più su Resizing and Reshaping Matrices in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by