gpt4 book ai didi

c# - 自定义类字符串列表的二进制搜索算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:24 24 4
gpt4 key购买 nike

基本上,我需要帮助调整我的二进制搜索算法以处理我的字符串列表,如下所示。 注意,我必须使用书面的二进制搜索算法,不使用内置的 c# 函数,如 .BinarySearch。

我现在将向您展示列表的格式以及列表本身:

// This class formats the list, might be useful to know

public class Demo
{
public string Col;
public string S1;
public string S2;
public string S3;

public override string ToString()
{
return string.Format("Col: {0}, S1: {1}, S2: {2}, S3: {3}", Col, S1, S2, S3);
}
}

// The list itself

var list = new List<Demo>
{
new Demo {Col = "Blue", S1 ="88", S2 ="Yes"},
new Demo {Col = "Green", S1 ="43", S2 ="Yes"},
new Demo {Col = "Red", 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);
}
}

我需要帮助调整我的 BinarySearch 算法以适用于上面的列表。如果你们有任何问题,或者需要查看我的更多代码,请尽管提问。

最佳答案

具体答案:针对特定情况调整您的方法非常容易。

让我们首先更新您现有的方法以使用更通用的方法(用于比较的 IComparable<T>.CompareTo 而不是 int 运算符:

public static int BinarySearch_R(int key, int[] array, int low, int high)
{
if (low > high) return -1;
int mid = (low + high) / 2;
int compare = key.CompareTo(array[mid]);
if (compare == 0)
{
return mid;
}
if (compare < 0)
{
return BinarySearch_R(key, array, low, mid - 1);
}
else {
return BinarySearch_R(key, array, mid + 1, high);
}
}

然后你只需要复制/粘贴上面的方法,替换int keystring key , int[] arrayList<Demo> arrayarray[mid]array[mid].Col :

public static int BinarySearch_R(string key, List<Demo> array, int low, int high)
{
if (low > high) return -1;
int mid = (low + high) / 2;
int compare = key.CompareTo(array[mid].Col);
if (compare == 0)
{
return mid;
}
if (compare < 0)
{
return BinarySearch_R(key, array, low, mid - 1);
}
else {
return BinarySearch_R(key, array, mid + 1, high);
}
}

扩展答案:虽然您可以执行上述操作,但您需要对需要此类功能的任何其他属性/类执行相同的操作。

一个更好的方法是泛化代码。例如,int[]List<Demo>可以概括为 IReadOnlyList<T> , int/string key作为TKey key , Demo.Col作为Func<T, TKey> , CompareTo作为IComparer<TKey>.Compare ,所以最终的泛型方法可能是这样的:

public static class MyAlgorithms
{
public static int BinarySearch<T, TKey>(this IReadOnlyList<T> source, Func<T, TKey> keySelector, TKey key, IComparer<TKey> keyComparer = null)
{
return source.BinarySearch(0, source.Count, keySelector, key, keyComparer);
}

public static int BinarySearch<T, TKey>(this IReadOnlyList<T> source, int start, int count, Func<T, TKey> keySelector, TKey key, IComparer<TKey> keyComparer = null)
{
// Argument validations skipped
if (keyComparer == null) keyComparer = Comparer<TKey>.Default;
int lo = start, hi = start + count - 1;
while (lo <= hi)
{
int mid = lo + (hi - lo) / 2;
int compare = keyComparer.Compare(key, keySelector(source[mid]));
if (compare < 0)
hi = mid - 1;
else if (compare > 0)
lo = mid + 1;
else
return mid;
}
return -1;
}
}

现在您可以对任何数据结构使用单一方法。例如,搜索您的 List<Demo>通过 Col会是这样的:

int index = list.BinarySearch(e => e.Col, "Red");

关于c# - 自定义类字符串列表的二进制搜索算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36663681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com