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());
即可。