-1

我不知道要使用哪种迭代方法来提高效率,这里我列出了我尝试过的解决方案。有没有其他的迭代方式,我的意思是任何特殊的方法或方式?

方法一:

这里我使用了两个 for 循环,所以迭代进行了 2N 次

public void CountChar()
{
    String s = Ipstring();
    int[] counts = new int[256];
    char[] c = s.ToCharArray();
    for (int i = 0; i < c.Length; ++i)
    {
        counts[c[i]]++;
    }

    for (int i = 0; i < c.Length; i++)
    {
        Console.WriteLine(c[i].ToString() + " " + counts[c[i]]);
        Console.WriteLine();
    }
}

方法二:

public void CountChar()
{
    _inputWord = Ipstring();
    char[] test = _inputWord.ToCharArray();
    char temp;
    int count = 0, tcount = 0;
    Array.Sort(test);
    int length = test.Length;
    temp = test[0];

    while (length > 0)
    {
        for (int i = 0; i < test.Length; i++)
        {
            if (temp == test[i])
            {
                count++;
            }
        }

        Console.WriteLine(temp + " " + count);
        tcount = tcount + count;

        length = length - count;
        count = 0;
        if (tcount != test.Length)
            temp = test[tcount];
        //atchutharam. aaachhmrttu
    }
}

方法三:

public void CountChar()
{
    int indexcount = 0;
    s = Ipstring();
    int[] count = new int[s.Length];
    foreach (char c in s)
    {
        Console.Write(c);
        count[s.IndexOf(c)]++;
    }

    foreach (char c in s)
    {
        if (indexcount <= s.IndexOf(c))
        {
            Console.WriteLine(c);
            Console.WriteLine(count[s.IndexOf(c)]);
            Console.WriteLine("");
        }

        indexcount++;
        ////atchutharam
    }
}
4

3 回答 3

1

您可以使用 LINQ 方法对字符进行分组并计算它们:

public void CountChar() {
  String s = Ipstring();
  foreach (var g in s.GroupBy(c => c)) {
    Console.WriteLine("{0} : {1}", g.Key, g.Count());
  }
}
于 2013-10-16T13:04:59.840 回答
0

您的循环不是嵌套的,因此您的复杂性不是 N*N (O(n^2)) 而是 2*N 给出 O(N) 因为您总是可以忽略常量:

for(){}
for(){} // O(2N) = O(N)

for()
{
    for(){}
} // O(N*N) = O(N^2)

如果您真的想知道这 3 种解决方案中的哪一种在特定环境中执行时间最快,请进行基准测试。

如果你想要一个最干净和可读的(你应该几乎总是以此为目标),只需使用 LINQ :

String s = Ipstring();
int count = s.Count();

它也将在 O(N) 中执行。

于 2013-10-16T12:57:07.220 回答
0

如果您需要数组中的结果:

var groups = s.GroupBy(i => i ).OrderBy( g => g.Key );
var chars = groups.Select(g => g.Key).ToArray();
var counts = groups.Select(g => g.Count()).ToArray();

否则:

var dict = s.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count());

foreach (var g in dict)
{
    Console.WriteLine( "{0}: {1}", g.Key, g.Value );
}
于 2013-10-16T13:08:37.987 回答