Php 如何确定字符串在O(1)时间复杂度中是否过长?

Php 如何确定字符串在O(1)时间复杂度中是否过长?,php,strlen,Php,Strlen,我想看看一个字符串是否超过10000个字符。如果是,它应该打印的太长。我知道我可以用strlen实现这一点,但是时间复杂度是O(n),这并不太糟糕,但是如果有人输入10000个字符,我仍然需要每次迭代10000个字符,但是如果我的人输入100万个字符,这是一个糟糕的n。所以我的解决方案是,检查是否设置了第10001个字符。如果设置了,那么它显然太长了。这样行吗?或者这有时会起作用(取决于内存分配的方式)。使用 isset函数在$str[10001]上运行,而$str[10001]是数组中仅有

我想看看一个字符串是否超过10000个字符。如果是,它应该打印的
太长
。我知道我可以用strlen实现这一点,但是时间复杂度是
O(n)
,这并不太糟糕,但是如果有人输入10000个字符,我仍然需要每次迭代10000个字符,但是如果我的人输入100万个字符,这是一个糟糕的
n
。所以我的解决方案是,检查是否设置了第10001个字符。如果设置了,那么它显然太长了。这样行吗?或者这有时会起作用(取决于内存分配的方式)。

使用



isset函数在$str[10001]上运行,而$str[10001]是数组中仅有的一个地址,因此是o[1]。此外,在php中访问索引外的键时,它不会抛出错误或导致内存泄漏。它抛出边界外异常,该异常可以通过try-catch块捕获。

strlen
已具有O(1)的时间复杂度,因为长度仅存储为一个属性

我知道我可以用strlen来做,但是时间复杂度是O(n)

我不知道是谁告诉你的,
strlen
只是返回
len
属性

定义,它使用
ZSTR_LEN
宏获取字符串长度

ZEND_函数(strlen)
{
zend_字符串*s;
ZEND_解析_参数_开始(1,1)
Z_PARAM_街(s)
ZEND_PARSE_PARAMETERS_END();
回程(s);;
}
以及

#定义ZSTR#u LEN(ZSTR)(ZSTR)->LEN

也许可以解释这一点。@Abracadver,isset函数是在$str[10001]上运行的,而$str[10001]是数组中唯一的一个地址,因此是o[1]。另外,在isset函数的索引外访问数组不会引发任何错误。内存分配呢?结果会受到影响吗?例如,如果字符串只有250个字符长,我们查找10001个字符,那么内存中可能有一些东西(垃圾数据)@Yuri,实际上,如果您在try块中有代码,php将抛出OutOfBoundsException,只要您捕获它。内存中没有添加任何内容。看看这个-我知道解释,把它添加到答案中,不仅仅是这个可能有用。我是在
c
中学习的。有人告诉我,在
c
strlen
中是O(n)。我认为在
php
substr(yourString, lengthConstraint, 1);
<?php 
if (isset($str[100001])) { 
     ... do my stuff ... 
} ?>