Un intervistatore mi ha fatto questa domanda:
Given a function f(ar[]) where ar[] is an array of integers, this functions claims to sort ar[] and returns it's sorted version ars[]. Determine if this function works correctly.
Mi sono avvicinato a questa domanda come:
- First check if the returned array ars[] is actually sorted in either non increasing or non decreasing order. This one is easy to check, ars[] should either follow the sequence ar[i + 1] >= ar[i] (for an array sorted in non decreasing order) or ar[i + 1] <= ar[i] (for an array sorted in non increasing order) for every i in the range [1, n], where n is the size of ars[]. The time complexity for this should be O(n).
- Then check if sizes of both the input array ar[] as well as the output array ars[] are same.
- Finally check if every element of ar[] is also present in ars[]. Since we have already examined at step 1 that ars[] is sorted and at step 2 that sizes of ar[] and ars[] are same we can use Binary Search algorithm to perform this action. The worst case time complexity for this should be O(n * log(n)).
If all the above 3 checks succeeds then the function is working fine else it is not. The overall time complexity of this algorithm should O(n * log(n))
Ma con mia sorpresa l'intervistatore ha detto che questa soluzione non è corretta e che la sua complessità temporale può essere migliorata. Non riesco a capire cosa c'è di veramente sbagliato nella mia soluzione, mi sono perso ogni angolo e l'intero approccio è sbagliato? Inoltre, quale può essere un approccio migliore a questo (in termini di complessità temporale)?
PS: l'intervistatore non ha menzionato alcuna informazione aggiuntiva o alcun vincolo aggiuntivo per questo problema.