• ASP.NET从字符串中查找字符出现次数的方法


    今天在一场“特殊的讨论”中引入了一个问题,如何在C#求出字符串中某字符的出现次数,比如求“ADSFGEHERGASDF”中“A”出现的次数。首先想到的方法当然是从头遍历字符串并统计:
    程序代码
    c1=0;
    for(inti=0;i {
    if(str[i]==.A.)
    {
    c1++;
    }
    }
    第二种方法也很容易想到,将字符串中所有要查找的字符去除,然后比较去除前后的字符串长度即可。这种方法遭到了某人的鄙视,据说性能很差而且多占空间。
    程序代码
    c2=str.Length-str.Replace("A",String.Empty).Length;
    接下来某人又提出了第三种方法,是用要查找的字符为分隔符,将原字符串分隔为多个子串,然后求子串的数目即可。在C#中这是一个写起来很短的方法:
    程序代码
    c3=str.Split(newchar[]{.A.}).Length-1;
    我们从原理可以推断出三者性能的顺序,但究竟差距是多少呢,还是要动手试验一下。这是非常经典的测试代码:
    程序代码
    stringstr="SADTHDGSAFSDGTGHRDGSADFADDRHDFSGASDAA";
    Stopwatchsw=newStopwatch();
    longt;
    intc=0;
    GC.Collect();
    Application.DoEvents();
    sw.Start();
    for(inti=0;i<100000;i++)
    {
    c=三种算法
    }
    sw.Stop();
    t=sw.ElapsedMilliseconds;
    首先我们确保正确性,经测试三种方法都能正确处理多种情况,包括首尾、连续出现、不出现或串长度为0等,我所取的字符串是一个很普通的串。编译为Release版,预运行10次后获得以下结果:
    遍历统计:13毫秒
    替换后比较长度:112毫秒
    断开字符串后计数:233毫秒
    这里已经体现出差异,遍历统计比替换后比较要快10倍,断开字符串又要慢一些。接下来我又做了如下两个测试:
    1、不改变字符串的长度,增加或减少要查找字符串的个数。
    2、不改变要查找字符出现的频率,但增长字符串的长度。
    结果发现,三种方法都随字符串长度增加线性变慢,而后两种方法还随要查找的字符增加而变慢。

    转自:娃酷分类网 http://www.waaku.com 原文地址:http://www.waaku.com/InfoView124056.html


    作者:水木    
     
  • 相关阅读:
    友盟上报 IOS
    UTF8编码
    Hill加密算法
    Base64编码
    Logistic Regression 算法向量化实现及心得
    152. Maximum Product Subarray(中等, 神奇的 swap)
    216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
    77. Combinations(medium, backtrack, 重要, 弄了1小时)
    47. Permutations II(medium, backtrack, 重要, 条件较难思考)
    3.5 find() 判断是否存在某元素
  • 原文地址:https://www.cnblogs.com/hsapphire/p/1669729.html
Copyright © 2020-2023  润新知