惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
About on SuperTechFans
Y
Y Combinator Blog
V
V2EX
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
博客园 - 叶小钗
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
H
Help Net Security
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
B
Blog
G
Google Developers Blog
J
Java Code Geeks
博客园 - 三生石上(FineUI控件)
IT之家
IT之家
N
Netflix TechBlog - Medium
腾讯CDC

博客园 - 沧海一声笑

关于UltraWinGrid选中行只读设置 关于chrome 插件PageMonitor 安装及使用步骤 关于UNICODE字符串的匹配问题 关于string的indexof方法的试验 C# 字符转ASCII码,ASCII码转字符 [转一下] 抉择 随记一下 关于域用户的AD验证 关于命令模式的一些理解 关于异步委托的部分理解 基于深度优先搜索的蜘蛛程序 观察者模式的简单实现与讨论 下拉框自动回发! 国庆前生活学习计划 2007年总结 看完色戒有感 年前工作计划 Psytopic性格测试! 求助? 关于购买开发用途笔记本的配置 及推荐品牌和型号! 谢谢! 转帖:真爱 就不要等
关于字符串效率问题
沧海一声笑 · 2009-08-14 · via 博客园 - 沧海一声笑

   最近开始着手研究一下字符串的效率问题,大致了解了一下常规提高性能的方法。现在考虑以前碰到的一个题目:有一个很长的字符串,需要统计其中字母的出现频率。
我的大致思路是:
     1  不管怎么样,都得循环一遍,最好能保证循环一遍就统计完
     2  在循环的时候,涉及到对比的情况
         比如,循环碰到字符f,起码f当前的次数有个存储的地方,另外就是要更新当前的出现次数,首先在缓存的地方找到对应的位置
     按照我的想法,主要在2里面提高效率了。正常写法,每循环一个字符,然后在对比26遍(假设主要小写字母,然后更新当前字符出现的频率!
     目前我想到的就是用哈希表,相当于直接定位,统计! 程序性能如下:
                                
     大约是 543w的字符长度,用了375毫秒,测试代码如下:

       public static void Test()
        {
            DateTime a
=DateTime.Now;
            Console.WriteLine(
string.Concat("开始",a.ToString("yyyy-MM-dd hh:mm:ss")));
            
int lenght;
            
string strFilePath="c:\\11.txt";
            StreamReader reader
=null

            reader

=new StreamReader(strFilePath);string str =reader.ReadToEnd();//增加点长度
            str = string.Concat(str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str);
            lenght
=str.Length;
            System.Collections.Hashtable ha 
= new System.Collections.Hashtable();for (int k = 0; k < 26;k++)
                ha.Add(
97+k, 0);
       
            
for (int k = 0; k < str.Length; k++)
            {
                
if (ha.ContainsKey(Asc(str[k].ToString())))
                    ha[Asc(str[k].ToString())] 
= int.Parse(ha[Asc(str[k].ToString())].ToString()) + 1
            }
int max=int.Parse(ha[97].ToString());
            
string cs = "a";
           
            
for (int k = 0; k < 26; k++)
            {
                
if (int.Parse(ha[97+k].ToString()) > max)
                {
                    max 
= int.Parse(ha[97 + k].ToString());
                    cs 
= Chr(97 + k);
                }
            }

            DateTime b

=DateTime.Now;
            Console.WriteLine(
string.Concat("结束:", b.ToString("yyyy-MM-dd 24hh:mm:ss")));

            Console.WriteLine(

string.Concat("总长为", lenght.ToString(), "的字符串中出现次数最多的字符是", cs, "次数为", max.ToString(), "用时", b.Subtract(a).Milliseconds.ToString(), "毫秒"));
            Console.ReadLine();
        }


     估计应该还有更好得算法。