O(1)时间复杂度如何判断一个字符串是否过长?
How to determine if a string is too long in O(1) time complexity?
我正在尝试查看字符串是否超过 10,000 个字符。如果是,它应该打印 too long
。我知道我可以用 strlen
来做到这一点,但是时间复杂度是 O(n)
,这还算不错,但是如果有人输入 10,000 个字符,我仍然必须每次迭代 10,000 个字符,但是如果我的人输入了 100 万个字符,那就太糟糕了 n
。所以我的解决方案是,检查是否设置了第 10,001 个字符。如果设置了,那么它显然太长了。这行得通吗?或者这有时会起作用(并且取决于内存 was/is 的分配方式)。
使用substr
substr(yourString, lengthConstraint, 1);
<?php
if (isset($str[100001])) {
... do my stuff ...
} ?>
isset 函数是 运行 on $str[10001],它只是数组中的一个地址,因此是 o[1]。此外,在 php 中访问索引外的键时,它不会抛出错误或导致内存泄漏。它抛出一个 OutOfBoundsException 异常,可以用 try catch 块捕获。
strlen
的时间复杂度已经是 O(1),因为长度只是简单地存储为一个属性。
I know I can do this with strlen, but then the time complexity is O(n)
不知道是谁告诉你的,strlen
就是returns len
属性.
strlen的定义,它使用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));
}
以及ZSTR_LEN
的定义
#define ZSTR_LEN(zstr) (zstr)->len
我正在尝试查看字符串是否超过 10,000 个字符。如果是,它应该打印 too long
。我知道我可以用 strlen
来做到这一点,但是时间复杂度是 O(n)
,这还算不错,但是如果有人输入 10,000 个字符,我仍然必须每次迭代 10,000 个字符,但是如果我的人输入了 100 万个字符,那就太糟糕了 n
。所以我的解决方案是,检查是否设置了第 10,001 个字符。如果设置了,那么它显然太长了。这行得通吗?或者这有时会起作用(并且取决于内存 was/is 的分配方式)。
使用substr
substr(yourString, lengthConstraint, 1);
<?php
if (isset($str[100001])) {
... do my stuff ...
} ?>
isset 函数是 运行 on $str[10001],它只是数组中的一个地址,因此是 o[1]。此外,在 php 中访问索引外的键时,它不会抛出错误或导致内存泄漏。它抛出一个 OutOfBoundsException 异常,可以用 try catch 块捕获。
strlen
的时间复杂度已经是 O(1),因为长度只是简单地存储为一个属性。
I know I can do this with strlen, but then the time complexity is O(n)
不知道是谁告诉你的,strlen
就是returns len
属性.
strlen的定义,它使用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));
}
以及ZSTR_LEN
的定义#define ZSTR_LEN(zstr) (zstr)->len