C#二进制搜索

时间:2016-01-17 15:14:19

标签: c# binary-search

所以我正在尝试学习和练习二进制搜索,但遗憾的是无法理解二进制搜索如何用于对象列表或仅用于字符串。处理数字时看起来并不复杂。但是你如何实际执行二进制搜索,例如对象列表,其中包含属性名称作为字符串值。

3 个答案:

答案 0 :(得分:1)

二进制搜索假设已排序的集合。因此,您必须提供compare(a,b)功能。作为比较结果,该函数将返回-1,0或1。数字或字符的函数实现是微不足道的。但是,您可以实现一个更复杂的逻辑,将一个或多个对象属性考虑在内。只要您提供该功能,就可以对任何对象集合进行排序,并且可以对该集合应用二进制搜索。

答案 1 :(得分:0)

您将以与数字相同的方式执行此操作,唯一的区别是,您访问正在查看的实例的属性。

例如items[x].Value代替items[x]

答案 2 :(得分:0)

假设您有一个使用Friend Class的朋友列表,并且您想使用二进制搜索来查找此列表中是否存在朋友。首先,二进制搜索仅应在排序列表上进行。使用lambda,您可以排序列表,然后将其更改为数组。在此示例中,我将在单击按钮然后进行二进制搜索之后从文本框(正在寻找朋友的名字)收集输入。 Friend类还必须实现IComparable。

class Friend : IComparable<Friend>
{
    public string Name { get; set; }
    public string Likes { get; set; }
    public string Dislikes { get; set; }
    public int Birthday { get; set; }

    //Used for the binary search
    public int CompareTo(Friend other)
    {
        return this.Name.CompareTo(other.Name);
    }
}

class MainWindow
{
    List<Friend> friends = new List<Friend>();

    //other functions here populated the list

    private void OnButtonClick(object sender, EventArgs e)
    {
        Friend[] sortedArray = friends.OrderBy(f => f.Name).ToArray();

        int index = Array.BinarySearch(sortedArray, new Friend() { Name = tb_binarySearch.Text });

        if (index < 0)
        {
            Console.WriteLine("Friend does not exist in list");
        } 
        else
        {
            Console.WriteLine("Your friend exists at index {0}", index);
        }

    }
}

如果索引返回为负数,则该对象不存在。否则它将是对象在已排序列表中的索引。