Java: quel est le big-O temps de déclarer un tableau de taille n?
Qu'est-ce que le temps d'exécution de déclarer un tableau de taille n en Java? Je suppose que cela dépendra de savoir si le mémoire est remis à zéro sur la collecte des ordures (auquel cas il pourrait être O(1) ) ou lors de l'initialisation (auquel cas il faudrait que ce soit O(n) ).
- Je pense que ce serait JVM dependend
- Je suppose que la langue-dans-joue, pédant réponse est que c'est
O(1)
parce que même si c'estO(n)
,n
est délimitée par2^31
pour Java tableaux et donc sera asymptotiquement plus faible que certaines des grandes constante. - dans ce cas, chaque calcul est O(1) de l'espace, puisque le nombre d'atomes sur terre est finie. 😛
- eh bien, placez une autre façon, depuis que l'ordinateur a fini de mémoire, toute la résiliation de programme, exécutez en
O(1)
. - Darn, la réponse pourrait m'avez sauvé beaucoup de maux de tête dans l'uni! Oui, évidemment, c'était un commentaire ridicule.
- Merci pour toutes ces excellentes informations. Je souhaite que je pourrais accepter toutes vos réponses!
Vous devez vous connecter pour publier un commentaire.
C'est
O(n)
. Considérons ce programme simple:Le bytecode généré est:
L'instruction de prendre un coup d'oeil à est la
newarray
instruction (il suffit de chercher pournewarray
). À partir de la VM Spec:Étant donné que chaque élément est initialisé, il faudrait
O(n)
temps.MODIFIER
Regardant le lien amit, il est possible de mettre en œuvre de la matrice de l'initialisation avec une valeur par défaut, en temps constant. Donc je suppose que cela dépend en définitive de la JVM. Vous pourriez faire un peu rugueuse d'analyse comparative pour voir si c'est le cas.
Un petit aucun de référence pour les professionnels sur JRE1.6:
a donné le résultat suivant:
donc je suppose que O(n).
bien sûr, il n'est pas assez pour être sûr, mais c'est un indice.
O(n)
je.e, toujours linéaire 🙂Je suis assez sûr que c'est O(n), que la mémoire est initialisée lorsque le tableau est alloué. Il ne devrait pas être plus élevé que O(n), et je ne vois aucun moyen de faire moins de O(n), de sorte que semble la seule option.
De fournir plus de précisions, Java initialise les tableaux sur la répartition. Il n'y a aucun moyen de zéro une région de la mémoire sans marcher à travers elle, et la taille de la région détermine le nombre d'instructions. Par conséquent, la limite inférieure est O(n). Aussi, il n'aurait aucun sens d'utiliser un algorithme de mise à zéro plus lent que linéaire, puisqu'il y a un linéaire de la solution, de sorte que la limite supérieure doit être en O(n). Par conséquent, O(n) est la seule réponse qui a du sens.
Juste pour le plaisir, mais, imaginez un étrange morceau de matériel où l'OS a le contrôle sur le pouvoir de différentes régions de la mémoire et peut-zéro d'une région par un retournement de l'éteindre puis sur. Cela semble comme il serait O(1). Mais la région ne peut être si grand avant de l'utilitaire disparaît (ne voudrais pas tout perdre), afin de demander à zéro une région sera toujours en O(n) avec un grand diviseur.
type[len] array;
Disons simplement le tester.
Et les résultats sur mon linux ordinateur portable (i7-4600M @ 2.90 GHz):
Donc il est clair ressemble
O(n)
, mais il ressemble également à celui-ci passe d'une méthode plus efficace à près de 5 millions d'éléments.