func3 time complexity is explained below line by line.
int m= data.length; here the length of the array is fetched from data and it is assigned to m; which will take constant time which is O(1)
int t=m; O(1)
Now comes the loop which will decide what the time complexity of this function is going to be
So the loop is running until t becomes 1
let’s see how the t is decremented (what is the logic which is changing it), and based on that time complexity will be decided.
t= t/2; is the statement
suppose the value of t was 1024
so the value of t will change as
If we observe the pattern here then we can say it is operating log t times.
there is an inner loop as well so whatever time the inner loop consume will be multiplied by log t, since the inner loop will be executed log t times
since the loop is controlled by the value of t, this loop will also run log t times.
So, over all time complexity for func3 is O(log^2 t) or we can say O(log^2 length), where length is the number of elements present in array data. Because t is assigned by m which is assigned by the value of the length of array data.
Since I have explained above how the time complexity will be calculated, here I will go through only the effective statements which drive the time complexity
so, here is only one loop and it is controlled by the value of variable bound which is assigned to the length of the array named data.
so the time complexity of func4 will be O(length), where length is the number of elements present in array data.