在非常长的字符串中查找频率的最佳方法

时间:2015-10-08 05:15:02

标签: c algorithm data-structures lookup-tables

我必须找到一种非常优化的方法来查找包含单词的非常长的文件中的字符频率(使用C / C ++时忽略大小写,应该统计小写和大写)。 我已经知道这是一个(这里我正在读取终端用户的输入,但在我的情况下,我将从文件中读取,所以请不要去get()函数,请关注我的主要目标是获得一个比这更优化的方式(如果可能的话)):

int main()
{
   char string[100];
   int c = 0, count[26] = {0};

   printf("Enter a string\n");
   gets(string);

   while (string[c] != '\0')
   {
      /** Considering characters from 'a' to 'z' only
          and ignoring others */

      if (string[c] >= 'a' && string[c] <= 'z') 
         count[string[c]-'a']++;

      c++;
   }

   for (c = 0; c < 26; c++)
   {
      /** Printing only those characters 
          whose count is at least 1 */

      if (count[c] != 0)
         printf("%c occurs %d times in the entered string.\n", c + 'a', count[c]);
   }

   return 0;
}

但是我想要比它更优化它,因为它必须适用于包含很多单词的非常长的文件,有人可以给我任何建议或想法吗?感谢。

1 个答案:

答案 0 :(得分:2)

渐近复杂度没有变得更好,一般来说算法已经基本上处于最低限度。

您可以做的最重要的改变是调用较少的IO功能(并且将真正调用fread);使用count并读入一个大的(比如4 KB)缓冲区 - 较大的大小通常没有用处。

根据CPU和缓存的不同,如果你已经将整个字符串放在内存中,那么你可以获得一些东西,只需要if 256个元素,并避免使用{{1}}字母字符(少交易一个)用于更大缓存占用的分支预测点)。但我怀疑这可能是可测量的 - 您的代码现在应该完全受IO限制,与等待磁盘读取相比,处理所需的CPU时间完全可以忽略不计。