我读过的话题:如何计算大O符号以下代码
Big O, how do you calculate/approximate it?
而且我不知道以下功能的大O符号是什么:
static int build_nspaces_pattern(const char * const value, char *pattern,
size_t sz_pattern) {
static char val_buffer[1025];
char *ptr, *saveptr;
size_t szptrn;
ptrdiff_t offset;
val_buffer[0] = '\0';
strncat(val_buffer, value, sizeof(val_buffer) - 1);
val_buffer[sizeof(val_buffer) - 1] = '\0';
pattern[0] = '^'; pattern[1] = '('; pattern[2] = '\0';
for (ptr=strtok_r(val_buffer, ",", &saveptr);
ptr!=NULL;
ptr=strtok_r(NULL, ",", &saveptr)
) {
szptrn = sz_pattern - strlen(pattern) - 1;
if (sanitize(ptr) != 0) {
return -1;
}
strncat(pattern, ptr, szptrn);
szptrn -= strlen(ptr);
strncat(pattern, "|", szptrn);
}
offset = strlen(pattern);
pattern[offset-1] = ')'; pattern[offset] = '$'; pattern[offset+1] = '\0';
return 0;
}
Sanitize是O(n),但for循环将运行k次(k是字符串中的逗号数)。所以,k * O(n)仍然是O(n),它会是O(n^2),O(k.n)还是别的吗?
谢谢。
如果您提供算法的简化伪代码版本,此问题将更容易回答。 – 2010-11-10 22:09:19
不要忘记考虑字符串操作 - 它们可能会或可能不会影响您的计算(例如strtok,strlen,strncat等)使用pascal字符串的 – MahlerFive 2010-11-10 22:12:07