从char数组中获取当前单词的最有效方法

时间:2011-03-04 11:13:38

标签: c optimization string-search

假设我有一个字符串“text”,一个插入位置“插入符号”,然后想要找到当前的单词(按空格分隔)。

我目前的做法似乎效率低下,我想知道是否有人有效率的做法?

const char* text;
int caret;
int initpos;
int start;
int count = 0;
char word[256];

// text and caret values assigned here.

initpos = caret;
while(caret > 0 && text[caret] != ' ') // get start
{
    caret--;
    count++;
}
start = caret;
caret = initpos;

while(text[caret] && text[caret] != ' ') // get end
{
    caret++;
    count++;
}

word = strsub(text, start, count);

3 个答案:

答案 0 :(得分:5)

“似乎效率低下”,您是说代码看起来对您来说效率低下还是测量并且发现它对您来说太慢了?

您的方法采用O( n )步骤,其中 n 是输入中最长单词的长度。除非你的单词具有DNA字符串的大小,否则这个速度非常快。

对于某些数据集,更快的方法是使用单词开始和结束位置的索引。存储间隔的二叉搜索树符合此法案,但代价是O(lg N )检索时间,其中<​​em> N 是输入中的字数。可能不值得。

答案 1 :(得分:1)

我认为这是一种有效的方法。我只是建议检查字符是否是字母,而不是它是否是空格:

while(caret > 0 && ((text[caret]>='A' && text[caret]<='Z') || (text[caret]>='a' && text[caret]<='z')))

这会抓住其他情况,例如:当单词以点,数字,括号等终止时。

答案 2 :(得分:0)

#include <ctype.h>

...
// Other definitions from above.
char *p = word;
char *q = text + caret;
while(q >= text && !isblank(*q)) {
   q--;
}
if (q < text) q++; // All non-blanks.
while (*q && !isblank(*q)) {
   *p++ = *q++;
}
*p = '\0';
// word now has nul terminated non-blank characters, p points to EOL or blanks.