Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux VI编辑器中搜索功能背后的算法是什么_Linux_Vi - Fatal编程技术网

Linux VI编辑器中搜索功能背后的算法是什么

Linux VI编辑器中搜索功能背后的算法是什么,linux,vi,Linux,Vi,即使当我打开一个新文件时,search命令的运行速度也非常快,即使是在一个非常大的文件上? 用于实现它的算法是什么 我只是好奇?这只是您常规的正则表达式实现 首先,将模式编译成正则表达式(vim_regcomp) 接下来,使用vim_regexec{u multi,{u nl,{u both}执行它。它通过一步一步地处理各种原子来实现(有一个明确的回溯堆栈) 现在,正则表达式的叶节点仅由以下函数处理 vim\u strbyte vim\u strchr cstrhr;作为一个例子,这说明了实现

即使当我打开一个新文件时,search命令的运行速度也非常快,即使是在一个非常大的文件上? 用于实现它的算法是什么


我只是好奇?

这只是您常规的正则表达式实现

首先,将模式编译成正则表达式(
vim_regcomp

接下来,使用
vim_regexec{u multi,{u nl,{u both}
执行它。它通过一步一步地处理各种原子来实现(有一个明确的回溯堆栈)

现在,正则表达式的叶节点仅由以下函数处理

  • vim\u strbyte
  • vim\u strchr
  • cstrhr
    ;作为一个例子,这说明了实现是多么的“简单”(特别是,如果你看一个更简单的例子,没有定义
    FEAT_MBYTE

现在的短篇故事是:

  • 涉及regex实现(因为它支持许多特性,比如Unicode大小写折叠)
  • src/regexp.c
    中的实现运行5966 LoC(7652包括注释和空格)
然而,如果你在寻找“复杂”的算法(比如Boyer Moore),你不会找到它,因为坦白说,在单个文件中查找文本并不需要它

现在,如果你想看看性能最好的搜索算法,你可能想看看GNU
grep
的源代码,而不是…:)



所有计数都基于debian软件包归档中的vim-7.3.547,这只是您的常规正则表达式实现

首先,将模式编译成正则表达式(
vim_regcomp

接下来,使用
vim_regexec{u multi,{u nl,{u both}
执行它。它通过一步一步地处理各种原子来实现(有一个明确的回溯堆栈)

现在,正则表达式的叶节点仅由以下函数处理

  • vim\u strbyte
  • vim\u strchr
  • cstrhr
    ;作为一个例子,这说明了实现是多么的“简单”(特别是,如果你看一个更简单的例子,没有定义
    FEAT_MBYTE

现在的短篇故事是:

  • 涉及regex实现(因为它支持许多特性,比如Unicode大小写折叠)
  • src/regexp.c
    中的实现运行5966 LoC(7652包括注释和空格)
然而,如果你在寻找“复杂”的算法(比如Boyer Moore),你不会找到它,因为坦白说,在单个文件中查找文本并不需要它

现在,如果你想看看性能最好的搜索算法,你可能想看看GNU
grep
的源代码,而不是…:)


所有计数基于debian软件包归档中的vim-7.3.547

/*
* cstrchr: This function is used a lot for simple searches, keep it fast!
*/
    static char_u *
cstrchr(s, c)
    char_u  *s;
    int     c;
{
    char_u  *p;
    int     cc;

    if (!ireg_ic
#ifdef FEAT_MBYTE
            || (!enc_utf8 && mb_char2len(c) > 1)
#endif
            )
        return vim_strchr(s, c);

    /* tolower() and toupper() can be slow, comparing twice should be a lot
    * faster (esp. when using MS Visual C++!).
    * For UTF-8 need to use folded case. */
#ifdef FEAT_MBYTE
    if (enc_utf8 && c > 0x80)
        cc = utf_fold(c);
    else
#endif
        if (MB_ISUPPER(c))
        cc = MB_TOLOWER(c);
    else if (MB_ISLOWER(c))
        cc = MB_TOUPPER(c);
    else
        return vim_strchr(s, c);

#ifdef FEAT_MBYTE
    if (has_mbyte)
    {
        for (p = s; *p != NUL; p += (*mb_ptr2len)(p))
        {
            if (enc_utf8 && c > 0x80)
            {
                if (utf_fold(utf_ptr2char(p)) == cc)
                    return p;
            }
            else if (*p == c || *p == cc)
                return p;
        }
    }
    else
#endif
        /* Faster version for when there are no multi-byte characters. */
        for (p = s; *p != NUL; ++p)
            if (*p == c || *p == cc)
                return p;

    return NULL;
}