3.1.31

上次更新:2019-04-17
发现了题解错误/代码缺陷/排版问题?请点这里:如何:提交反馈

解答

性能测试方法构造如下:
先编写一个随机字符串方法,生成一个长度大于 50 的字符串(作为未命中访问)。
然后随机生成符合要求的字符串数组,将它们全部放入符号表中。
然后遍历 10 次生成的字符串数组,对于数组中的每个元素都进行一次命中查询。
同时在每次命中查询的同时都进行一次未命中查询即可。

测试结果:

代码

按照要求编写代码,在 SearchCompare 类里添加一个 Random random 成员,并添加如下方法:
随机字符串发生器:

public static string GetRandomString(int minLength, int maxLength)
{
    int length = random.Next(minLength, maxLength);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < length; i++)
    {
        double choice = random.NextDouble();
        if (choice < 0.333)
            sb.Append((char)random.Next('A', 'Z'));
        else if (choice < 0.666)
            sb.Append((char)random.Next('a', 'z'));
        else
            sb.Append((char)random.Next('0', '9'));
    }
    return sb.ToString();
}

生成随机字符串数组:

public static string[] GetRandomArrayString(int n, int minLength, int maxLength)
{
    string[] result = new string[n];
    for (int i = 0; i < n; i++)
    {
        result[i] = GetRandomString(minLength, maxLength);
    }
    return result;
}

测试方法:

public static long Performance(IST<string, int> st, int n, int averageHit)
{
    string[] keys = GetRandomArrayString(n, 2, 50);
    string keyNotExist = GetRandomString(51, 52);
    Stopwatch sw = Stopwatch.StartNew();
    // 构建
    for (int i = 0; i < n; i++)
        st.Put(keys[i], i);
    // 查询
    for (int i = 0; i < averageHit; i++)
    {
        for (int j = 0; j < n; j++)
        {
            st.Get(keys[j]);
            st.Get(keyNotExist);
        }
    }
    sw.Stop();
    return sw.ElapsedMilliseconds;
}

另请参阅

SymbolTable 库

上一题 下一题