L'exécution de l'algorithme décrit est O(n^2)
. La boucle externe est exécutée n/2
fois, ainsi le compteur interne j
est réinitialisé n/2
fois, et ainsi la boucle interne est exécutée au total de O(n^2)
fois.
Je ne suis pas sûr que je suis la logique derrière votre idée, mais voici deux approches comment je mettre en œuvre [en pseudo-code de haut niveau]:
(1) créer un histogram de la données:
- créer un
Map<Integer,Integer>
[la clé est l'élément et la valeur est le nombre de occurances]
- itérer le tableau, et pour chaque élément compte combien de fois il semble
- itérer l'histogramme et trouver s'il y a un maximum unique.
- S'il existe - retour vrai, sinon retour faux.
Cette approche est moyenne de O(n)
si vous utilisez un HashMap
comme carte.
(2) de tri et de trouver Max occurances:
- trier le tableau - à la suite, tous les éléments sont égaux à côté de l'autre. Vous pouvez utiliser
Arrays.sort(array)
pour le tri.
- Comptez le nombre de fois que chaque élément apparaît [similaire à l'idée de l'histogramme], et déterminez s'il existe un maximum unique. Vous n'avez pas besoin de maintenir les données pour tous les éléments, il suffit de maintenir pour le top 2, et à la fin pour voir si elles sont identiques.
Cette solution est O(nlogn)
moyenne + pire des cas [en fait, selon le genre - merge sor vous donne t O(nlogn)
pire des cas, alors que quick-sort vous donne O(n^2)
pire des cas, et les deux sont O(nlogn)
le cas moyen].
EDIT:
j'ai mal compris le problème à portée de main, je pensais que vous cherchez s'il y a un maximum unique. Ces 2 solutions conviennent toujours au problème, il suffit de modifier la dernière étape de chaque [pour vérifier si l'élément le plus courant apparaît plus de la moitié des fois, ce qui est encore assez facile et faisable dans O(n)
].
De plus, il existe une autre solution: Utilisez selection algorithm pour trouver la médiane, et après l'avoir trouvé, vérifiez s'il s'agit d'un élément majoritaire et revenez si c'est le cas. Puisque l'algorithme de sélection est une solution basée sur la division et la conquête, je pense que cela correspond à vos besoins.
(n) I a ajouté une étiquette de devoirs, puisque cela semble être le cas. Si je me trompe, corrigez-moi s'il vous plaît. – amit
duplication possible de [Rechercher l'élément majoritaire dans le tableau] (http://stackoverflow.com/questions/4325200/find-majority-element-in-array) – erickson
Plus précisément, [this] (http://stackoverflow.com/a/9487018/3474) est la meilleure solution à la question en double. – erickson