J'essaie de voir si une chaîne contient plus de 10 000 caractères. si c'est le cas, il devrait imprimer trop longtemps . Je sais que je peux le faire avec strlen , mais la complexité temporelle est O (n) , ce qui n'est pas trop mal, mais je dois encore parcourir 10000 caractères à chaque fois si quelqu'un entre 10 000 caractères, mais si quelqu'un entre 1 million de caractères, c'est un mauvais n . Ma solution est donc de vérifier si le 10 001e caractère est défini. S'il est défini, alors c'est évidemment trop long. Cela fonctionnerait-il? Ou cela fonctionnerait-il parfois (et dépend de la façon dont la mémoire a été / est allouée).
4 Réponses :
<?php
if (isset($str[100001])) {
... do my stuff ...
} ?>
The isset function is run on $str[10001] which is only one address in the array, hence o[1]. Also, while accessing key out of index in php, it does not throw error or cause memory leak. It throws an OutOfBoundsException exception which can be caught with a try catch block.
Peut-être expliquer cela.
@AbraCadaver, la fonction isset est exécutée sur $ str [10001] qui n'est qu'une seule adresse dans le tableau, d'où o [1]. En outre, l'accès au tableau hors de l'index dans la fonction isset ne génère aucune erreur.
Qu'en est-il de l'allocation de mémoire? Le résultat serait-il affecté? Par exemple, si la chaîne ne contient que 250 caractères et que nous recherchons le caractère 10001, il se peut qu'il y ait quelque chose en mémoire (données inutiles)
@Yuri, En fait, si vous avez le code dans un bloc try, php lancera une OutOfBoundsException à condition que vous l'attrapiez. Rien n'est ajouté dans la mémoire. Jetez un œil à ceci - stackoverflow.com/questions/8193798/…
Je connais l'explication, ajoutez-la à la réponse, pas seulement Cela pourrait fonctionner.
strlen a déjà une complexité temporelle de O (1), du fait que la longueur est simplement stockée en tant qu'attribut.
Je sais que je peux faire cela avec strlen, mais alors la complexité temporelle est O (n)
Je ne sais pas qui vous dit cela,
strlenrenvoie simplement la propriétélen.Définition de strlen , il utilise la macro
ZSTR_LENZSTR_LEN obtenir la longueur de la chaîne#define ZSTR_LEN(zstr) (zstr)->lenEt la définition de ZSTR_LEN
ZEND_FUNCTION(strlen) { zend_string *s; ZEND_PARSE_PARAMETERS_START(1, 1) Z_PARAM_STR(s) ZEND_PARSE_PARAMETERS_END(); RETVAL_LONG(ZSTR_LEN(s)); }
J'ai appris en c . Et on m'a dit que dans c strlen est O (n). J'ai supposé que ce serait la même chose en php