Suppose I am having a Collection of object:
List<String> myList = populateMyArrayList();
//Here I am having an ArrayList with 1000 elements
Which is the better approach:
1 : Mergesort then Binary Search
Collections.sort(myList);
int keyIndex = Collections.binarySearch(myList, key);
2 : Sequential Search
for(String s : myList){
if(s.equals(key)){
return s;
}
}
Should there be a difference in searching approach based on the size of the collection to be searched? If YES then how to decide.
EDIT1: Suppose I have to search the list a couple of times, and no new elements will be added in the list.
EDIT2: I could have gone for a HashSet
, but I am actually having a List<CustomObject>
and I can search the List
multiple times based on different attributes of CustomObject. So I can't have a overridden equals
method in my CustomObject
It depends.
O(n)
O(logn + n*logn)
which is O(n*logn)
. So if you are checking for ca. n
strings, this one is better.HashSet
which has O(1)
.LinkedHashSet
P.S. premature optimization is the root of all evil.
If you do the search just one time:
O(n * log n)
.O(n)
.If you do the search for more than one time, let's say k
times:
O((n + k) * log n)
. O(k * n)
.So if you do the search just one time you should go with linear search. If you do the search for more than one time, most probably you should sort first.
Also, maybe in this case you can consider using a hash table, which has amortized complexity of O(1)
for an element search.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With