【问题标题】:Most memory efficient way for searching within a string in C在 C 中的字符串中搜索的最节省内存的方法
【发布时间】:2010-09-17 19:56:36
【问题描述】:

在 ANSI C 中搜索字符串最节省内存的方法是什么? (把代码放上去)

一个需要这样做的例子是在可用内存非常短但现在具有合理时钟周期的嵌入式设备中。

【问题讨论】:

  • 在字符串中搜索什么?另一个字符串?一个字符?
  • 要代码?这有点胡思乱想。
  • @Vlion:在编程问答网站上索要代码很无聊?
  • 是的。你应该征求意见,然后自己把它们写成代码。
  • @ephemient:借调。我们不是来为您做繁重的工作;我们在这里帮助您了解如何自己做。

标签: c performance algorithm


【解决方案1】:

这取决于您要查找的内容...但 strchr() 或 strstr() 通常是合适的。而且它们的内存效率非常高,因为它们不使用额外的内存。

【讨论】:

    【解决方案2】:

    如果您正在寻找子字符串,那么 strstr 非常节省内存。对于 char,strchr 也非常节省内存。两者都不需要额外的存储空间。

    我不确定您是否还有其他需要。

    【讨论】:

      【解决方案3】:

      我想这取决于您要搜索的内容,但是线性搜索/比较使用的内存不超过两个字符串(“主机”和“令牌”)。例如:

      char host[] = "this is my string to search";
      char token[] = "y st";
      int k = 0;
      while(host[k] != '\0'){
        for(int t=0; (token[t]!='\0' && host[k+t]!='\0');){
          if(host[k] == token[t]){
            t++;  // we matched the first char of token, so advance
          }
          else{   // no match yet, reset the token counter and move along the host string
            k++;
            t = 0;
          }
        }
        k++;
      }
      

      (我在实现上可能略有偏差,但希望你能明白我的想法。)

      像 strstr 这样的库函数也应该值得一看。

      【讨论】:

      • 我知道有人会有比我想出的更短的版本:)
      【解决方案4】:

      一次前进一个字符是 Θ((n-m+1) m)。检查Boyer-MooreKnuth-Morris-Pratt 算法以更有效地搜索子字符串——两者都低至 O(n)。你方便的算法教科书应该讨论它们。标准 C 库 strstr 函数实现了一个或两个,所以使用它而不是自己滚动。

      【讨论】:

      • 好的指针,但我正在寻找 内存 效率,而不是与复杂性相关的效率......这对我来说只是次要问题。如果处理器有一个小缓存(比如 2kB),你可能不想做任何内存操作,而只使用 CPU 提供的寄存器。
      • @Barry:你确定 strstr() 曾经实现过 BM 或 KMP 搜索吗?这些通常需要预先计算来加快搜索速度,而直接这样做很少是合理的 - 蛮力在许多情况下效果更好。
      • 你是对的;自从上次我的算法课以来,事情可能已经发生了变化。 glibc 中的 strstr.c 不使用 BM 或 KMP,也不使用朴素算法。
      • strstr() 的作用取决于您的编译器 - Digital Mars 使用 BM,VC9 有一组直接的嵌套 while 循环。
      • @Mike B:有趣的反馈-谢谢。我在 SunOS 上的一个古老版本的 strstr() 中遇到了一个错误(Solaris 之前 - 那个古老的!);它在每次迭代时对搜索字符串计算 strlen(),这很关键,因为我正在搜索 64 KB 的文本块。 Sun 修复了它(也许不是因为我)。
      【解决方案5】:

      根据搜索的类型和边界条件,有大量不同的算法用于搜索字符串中的子字符串。 大量收藏可在此处获得:http://www-igm.univ-mlv.fr/~lecroq/string/index.html

      【讨论】:

        【解决方案6】:

        Karp Rabin 只使用四个整数,并且具有线性平均时间。它只是计算搜索字符串的哈希值,并使用一些数学技巧来快速获取下一个子字符串的哈希值,给定它之前的子字符串的哈希值。

        标准版本遇到了麻烦,因为大多数语言不进行真正的数学模运算,但 Gonnet 和 Baeza-Yate 的 Handbook of Data Structures and Algorithms 有一个 version,它使用字长作为隐式模数(它也更快)。

        【讨论】:

          【解决方案7】:

          我最近遇到了这个问题,只是想分享一下我的想法。

          “内存效率”正如我所解释的那样,它是在仅给定 N 可用内存量 M > N 的情况下搜索大小为 M 的长字符串的能力。这是有效使用字符串中每个可用字符的内存的替代方法搜索。而且我觉得可能与原发帖人的嵌入式环境(可能有很大的存储空间)更相关。

          无论您使用哪种算法进行比较(当然效率越高越好),我会选择使用循环缓冲区(它应该大于您要搜索的字符串,至少可能是 2 倍? ) 并在搜索算法推进时不断将字符流加载到缓冲区。搜索算法必须能够知道如何环绕循环缓冲区(或添加一个间接级别以对搜索算法隐藏循环缓冲区)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-07
            • 1970-01-01
            • 1970-01-01
            • 2011-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多