Big-O, Big-Θ, Big-Ω are independent of the worst, medium and best.
The notation f (n) = O (g (n)) means that f (n) does not grow faster than some constant multiple of g (n). The notation f (n) = Ω (g (n)) means that f (n) grows no more slowly than some constant multiple of g (n). The notation f (n) = Θ (g (n)) means that both of them are true.
Note that f (n) here may represent the best, worst, or average run-time of a program with input size n.
In addition, “average” can have many meanings: it can mean the average input or average input size (“expected” time), or it can mean ultimately (amortized time) or both, or something else.
Often people are interested in the worst running time of the program, amortized over the entire duration of the entire program (therefore, if something initially costs n, but only 1 time for the next n elements, it averages the cost of 2 per element). The most useful thing to measure here is the smallest upper bound in the worst case; therefore, usually when you see someone asking for a Big-O program, this is what they are looking for.
Similarly, to prove a problem is inherently difficult, people may try to show that the worst (or possibly average time) work time is at least a certain amount (for example, exponential).
You should use the Big-Ω notation for them because you are looking for lower grades on them.
However, there is no particular relationship between the worst case and Big-O, or the best case and Big-Ω.
Both can be used for both: just one of them is more typical than the other.
Thus, the upper bounding best case is not very useful. Yes, if the algorithm always takes O (n) time, then you can say it O (n) in the best case, and also on average, as well as in the worst case. That a perfectly fine statement, with the exception of the best case, is usually very trivial and therefore not interesting in itself.
In addition, note that f (n) = n = O (n 2 ) - this is technically correct, since f grows slower than n 2 but it is not useful because it is not the smallest upper bound - there is a very obvious upper bound more useful than this one, namely O (n). So yes, you can say that the best / worst / average run time of the program is O (n!). This is mathematically perfectly correct. This is simply useless because when people ask for Big-O, they are interested in the smallest upper bound, not just a random upper bound.
It is also worth noting that simply being insufficient to describe the runtime of a program as f (n). Opening hours often depend on the entrance itself, and not on its size. For example, it may be that even requests are trivially easy to answer, while odd requests take a long time to respond.
In this case, you cannot just give f as a function of n - it will depend on other variables. In the end, remember that this is just a set of mathematical tools; it's your job to figure out how to apply it to your program, and to find out what an interesting thing to measure. Using tools in a useful manner requires some creativity, and mathematics is no exception.