请帮助我理解这个" BinarySearchCountAll"我书中的方法

时间:2016-03-28 00:47:36

标签: c# algorithm binary-search-tree

我的书C# 3.0 Cookbook by O'Reilly有以下示例让我感到困惑。 (下面的确切转录。)

// Count the number of times an item appears in the sort List<T>.
public static int BinarySearchCountAll<T>(this List<T> myList, T searchValue)
{
   // Search for the first item.
   int center = myList.BinarySearch(searchValue);
   int left = center;
   while (left < 0 && myList[left-1].Equals(searchValue))
   {
     left -= 1;
   }
   int right = center;
   while (right < (myList.Count - 1) && myList[right+1].Equals(searchValue))
   {
     right += 1;
   }    
   return (right - left) + 1;
}

特别是,我从

开始感到困惑
int center = myList.BinarySearch(searchValue);
int left = center;
while (left < 0 && myList[left-1].Equals(searchValue))

片段。根据{{​​3}}方法,left是元素的索引。那么条件如何

left < 0 && myList[left-1].Equals(searchValue)
while循环中的

有意义吗?由于短路,如果left < 0,则评估右侧myList[left-1].Equals(searchValue),但myList[left-1]正在访问负索引!正确?

如果找不到元素,我确实阅读了关于BinarySearch中发生的事情的部分

  

负数,是指数的按位补码   大于项目的下一个元素,如果没有更大的元素   element,Count的按位补码。

我无法弄清楚我的书中的这种方法是否试图利用这一事实。看起来像一个非常混乱的写作方式应该是一个简单的方法,否则我没有正确理解它。因为如果我正确理解BinarySearch返回找到的任意第一个匹配元素,那么我就不能理解为什么该方法不能

// Count the number of times an item appears in the sort List<T>.
public static int BinarySearchCountAll<T>(this List<T> myList, T searchValue)
{
   int count = 0,
   int center = myList.BinarySearch(searchValue);
   if ( center < 0 ) return count; 
   for ( int k = center + 1; k < myList.Length - 1 && myList[k] = searchValue; ++k ) 
      ++count;  
   for ( int k = center - 1; k >=0 && myList[k] = searchValue; --k ) 
      ++count;
   return count; 
}

1 个答案:

答案 0 :(得分:0)

你是对的

final Dialog dialog = new Dialog(EditTextActivity.this);
        dialog.setContentView(R.layout.registration_picker_dialog);
        dialog.setTitle("Edit Year");

应该是

while (left < 0 && myList[left-1].Equals(searchValue)) 

代替。 注意右边的对称性:while(右边&lt;(myList.Count - 1)....自然暗示它应该比左边更大。

BinarySearchCountAll方法找到索引“center”,其中center = searchValue。由于列表已排序,因此它可以简单地遍历相邻元素,直到它们不等于“中心”。然后,它返回相等“中心”元素的数量