## 4 Methodology
### Time Complexity Analysis  
To analyze the complexity of our MBHO, we interpret each step in Algorithm 1 according to the big-O annotation and then provide the final or the total complexity with the knowledge that \(k\) is the number of keys, \(d\) is the number of variables (features) in the dataset, and \(n\) is the number of samples. The first statement is nothing but initializing the parameters of MBHO, which takes a constant time, \(O(C)\). The second statement evaluates all \(N\) stars (solutions) as a vital step for reporting the convergence curves, and this takes \(O(N)\). And since each solution, \(X_{i}\), is evaluated as an ML classification task via KNN, we consider the complexity for this as \(O(kdn)\) and, in total, \(O(N*kdn)\). The third statement indicates that the algorithm will stop if and only if the number of iterations counter, \(iter\), exceeds the bound max iteration, \(M\), and this takes \(O(M)\). Now, we have an inner loop iterated over the \(N\) solutions, which take \(O(MN)\), where a few statements inside this inner loop are interpreted as follows: the first statement generates a new solution, \(X_{iter+1}\), from the current one, \(X_{i}\), via a function that takes each bit from the solution vector as an input. And without a loss in generality, let the length of the solutions be denoted with \(L\). Then, this takes \(O(L)\). The second and third statements are about comparing the new solution, \(X_{iter+1}\), with its old state, \(X_{i}\), and keeping the fitter one which takes \(O(kdn+C)\). The fourth statement assesses and compares the solution \(X_{iter+1}\) with the current best denoted as the black hole \(X_{BH}\) and updates the current best with \(X_{iter+1}\) if and only if the score of \(X_{iter+1}\) is better than \(X_{BH}\), and this takes \(O(kdn+C)\). After this loop, we calculate the event horizon, \(R\), which indicates the evaluation of all \(N\) solutions, takes the summation of their scores, and evaluates the current black hole. And then, its score is divided by that summation, and this takes \(O(N*kdn+C)\). Now, we have another loop that iterates over all \(N\) solutions so that the complexity becomes \(O(M(N(L+2 kdn+2C+N*kdn+C)+N)\), and the several statements in this loop are interpreted as follows: The first statement calculates the Euclidean distance between the solution and the black hole, \(X_{BH}\), and this takes \(O(L)\). The second statement eliminates the solution that crosses the event horizon, \(R\), and replaces it with a new one, and this takes \(O(L+C)\). The third statement replaces the black hole, \(X_{BH}\), with the new star, \(X_{iter+1}\), according to their fitness scores, and this takes \(O(kdn+L)\). The fourth, fifth, and sixth statements are about deciding whether to apply the mutation to the given solution, \(X_{iter}\), or not, and this takes \(O(3C+L+kdn)\). The last statement in this loop updates the black hole, \(X_{BH}\), with the current solution, \(X_{i}\), if its score is better, and this takes \(O(kdn+C)\). And the final statement of MBHO is retrieving the black hole, \(X_{BH}\), as the optimal solution, and this takes \(O(C)\).  
Therefore, the complexity becomes \(O(M(N(L+2 kdn+2C+N*kdn+C)+N(4L+5C+3 kdn))+C)\); by simplifying that term, the final time complexity can be given via \(O(M(N(L+2 kdn+N*kdn)+N(4L+3 kdn)))\), where \(k\) is the number of keys, \(d\) is the number of variables (features) in the dataset, and \(n\) is the number of samples.