3.1.30

3.1.30 #

解答 #

官方实现:https://algs4.cs.princeton.edu/31elementary/BinarySearchST.java.html

首先在 BinarySearchST 中添加如下方法。

/// <summary>
/// 检查符号表结构是否有效。
/// </summary>
/// <returns>检查通过则返回 <c>true</c>,否则返回 <c>false</c>。</returns>
private bool Check() => IsSorted() && RankCheck();

/// <summary>
/// 检查 <see cref="_keys"/> 数组是否有序。
/// </summary>
/// <returns>如果 <see cref="_keys"/> 有序则返回 <c>true</c>,否则返回 <c>false</c>。</returns>
private bool IsSorted()
{
    for (var i = 1; i < Size(); i++)
        if (_keys[i].CompareTo(_keys[i - 1]) < 0)
            return false;
    return true;
}

/// <summary>
/// 检查 Rank(Select(i)) = i 是否成立。
/// </summary>
/// <returns>成立则返回 <c>true</c>,否则返回 <c>false</c>。</returns>
private bool RankCheck()
{
    for (var i = 0; i < Size(); i++)
        if (i != Rank(Select(i)))
            return false;
    for (var i = 0; i < Size(); i++)
        if (_keys[i].CompareTo(Select(Rank(_keys[i]))) != 0)
            return false;
    return true;
}

然后在 Put()Delete() 方法的末尾添加:Debug.Assert(Check()); 即可。

另请参阅 #

SymbolTable 库