我目前正在构建一个可以搜索和排序不同类型数据的控制台应用程序。正如问题所示;我需要帮助为字符串列表制作二进制搜索算法。 我必须指出我无法使用像list.binarysearch这样的内置c#函数,算法必须从头开始编码。此列表还包含多个具有相同字符串值的项目,因此我也需要查找所有这些项目。我已经按字母顺序对列表进行了排序,因此我将使用algorthims来查找正在搜索的字符串值的上限和下限。
我将首先展示如何格式化列表。
var list = new List<Demo>
{
new Demo {Col = "Blue", S1 ="88", S2 ="Yes"},
new Demo {Col = "Green", S1 ="43", S2 ="Yes"},
new Demo {Col = "Green", S1 ="216", S2 ="No"},
new Demo {Col = "Yellow", S1 ="100", S2 ="No"}
};
列表已按“Col”值的字母顺序排序。该列表实际上比这大得多,但你明白了。二进制搜索需要搜索所有'Col'值并找到特定的字符串值。
下面我将展示我的二进制搜索算法,该算法适用于int数组。
public static int BinarySearch_R(int key, int[] array, int low, int high)
{
if (low > high) return -1;
int mid = (low + high) / 2;
if (key == array[mid])
{
return mid;
}
if (key < array[mid]) {
return BinarySearch_R(key, array, low, mid - 1);
} else {
return BinarySearch_R(key, array, mid + 1, high);
}
}
我想在上面的列表中调整此算法。
最后,我将向您展示搜索上限和下限的代码。
public static int lower_bound(int key, int[] arr , int low, int high)
{
if (low > high)
//return -1;
return low;
int mid = low + ((high - low) >> 1);
//if (arr[mid] == key) return mid;
//Attention here, we go left for lower_bound when meeting equal values
if (arr[mid] >= key)
return lower_bound(key, arr, low, mid - 1);
else
return lower_bound(key, arr, mid + 1, high);
}
public static int upper_bound(int key, int[] arr, int low, int high)
{
if (low > high)
//return -1;
return low;
int mid = low + ((high - low) >> 1);
//if (arr[mid] == key) return mid;
//Attention here, we go right for upper_bound when meeting equal values
if (arr[mid] > key)
return upper_bound(key, arr, low, mid - 1);
else
return upper_bound(key, arr, mid + 1, high);
}
我知道我已经要求做很多事情,所以即使你只是帮助我解决部分问题,我也会感激不尽。如果您需要更多信息或代码,请询问。
答案 0 :(得分:0)
首先,我想指出,您正在将一个数组传递给您的函数。那么,你为什么要使用这个列表呢?
同样,据我所知,二进制搜索仅在数组排序时才有效。所以,我建议,事先对你的清单进行排序。虽然我找不到任何搜索自定义列表的解决方案(使用二进制搜索),即使在排序后也是如此。
我希望这些观点对您有所帮助。可能是,你已经知道了。我是StackOverflow的新手,所以,请告诉我我的答案是否对您有所帮助。