3.1.34

3.1.34 #

解答 #

在上一题的基础上进行修改即可。

调和级数 $H_n = 1+\frac{1}{2}+\frac{1}{3} + \cdots+\frac{1}{n}$ 。

查询数组变为前 1/2 为 key[0],随后的 1/3 为 key[1],以此类推。

和上一题中的序列进行比较即可,注意删除最后的打乱步骤。

实验结果如下:

代码 #

首先建立一个数组计算调和级数,就像这样:

// 调和级数
var harmonicNumber = new double[n * (int)Math.Pow(10, multiplyBy10)];
harmonicNumber[0] = 1;
for (var i = 1; i < harmonicNumber.Length; i++)
{
    harmonicNumber[i] = harmonicNumber[i - 1] + 1 / (i + 1);
}

然后修改构造查询的代码:

// 构造查询
Array.Sort(keys);
var queryZipf = new string[10 * n];
int queryIndex = 0, keyIndex = 0;
while (queryIndex < queryZipf.Length)
{
    var searchTimes = (int)Math.Ceiling(queryZipf.Length / (harmonicNumber[keyIndex + 1] * (i + 1)));

    for (var j = 0; j < searchTimes && queryIndex < queryZipf.Length; j++)
    {
        queryZipf[queryIndex++] = keys[keyIndex];
    }

    keyIndex++;
}

另请参阅 #

SymbolTable 库