繁体   English   中英

计算BinarySearch的比较次数

[英]Count number of comparisons made for BinarySearch

我的任务是创建两个单独的程序,一个我已经完成的线性搜索程序,以及一个二进制搜索程序。 这些程序还必须计算在搜索过程中进行的比较次数。 我的线性搜索程序已经计算了我的二进制搜索程序不能进行的比较次数。 二进制搜索的代码如下所示:

using System;
using System.Collections.Generic;

public class Example
{
public static void Main()
{

    Console.WriteLine("Input number you would like to search for");

    String Look_for = Console.ReadLine();

    int Lookfor;

    int.TryParse(Look_for, out Lookfor);

    {
        List<int> numbers = new List<int>();

        numbers.Add(1); 
        numbers.Add(2); 
        numbers.Add(3); 
        numbers.Add(4); 
        numbers.Add(5); 
        numbers.Add(6); 
        numbers.Add(7); 
        numbers.Add(8); 

        Console.WriteLine();
        foreach (int number in numbers)
        {
            Console.WriteLine(number);
        }

        int answer = numbers.BinarySearch(Lookfor);

        Console.WriteLine("The numbers was found at:");

        Console.WriteLine(answer);

    }
 }
}

如果有人可以告诉我如何修改它来计算比较,将不胜感激。

非常感谢,马修。

实现计算比较的IComparer<int>

private class CountComparer : IComparer<int> {

  public int Count { get; private set; }

  public CountComparer() {
    Count = 0;
  }

  public int Compare(int x, int y) {
    Count++;
    return x.CompareTo(y);
  }

}

然后在BinarySearch的重载中使用它作为比较器, 它采用比较器

CountComparer comparer = new CountComparer();
int answer = numbers.BinarySearch(Lookfor, comparer);

比较器然后包含计数:

Console.WriteLine("The binary search made {0} comparisons.", comparer.Count);

额外奖励:任何类似类型的通用计数比较器:

private class CountComparer<T> : IComparer<T> where T : IComparable<T> {

  public int Count { get; private set; }

  public CountComparer() {
    Count = 0;
  }

  public int Compare(T x, T y) {
    Count++;
    return x.CompareTo(y);
  }

}

您可以编写一个自定义IComparer<int>来计算它的使用次数,然后在搜索方法中使用它。 (或者我猜想你的线性搜索的自定义IEqualityComparer<int> 。)

您可以使用此扩展方法(基于此答案的代码)

public static class ListEx
{
    public static Tuple<int, int> BinarySearchWithCount<T>(
        this IList<T> list, T key)
    {
        int min = 0;
        int max = list.Count - 1;
        int counter = 0;

        while (min <= max)
        {
            counter++;
            int mid = (min + max) / 2;
            int comparison = Comparer<T>.Default.Compare(list[mid], key);
            if (comparison == 0)
            {
                return new Tuple<int, int>(mid, counter);
            }
            if (comparison < 0)
            {
                min = mid + 1;
            }
            else
            {
                max = mid - 1;
            }
        }

        return new Tuple<int, int>(~min, counter);
    }
}

//Which returns a tuple with the item and a number of comparisons. 
//Here is how you can use it:

class Program
{
    static void Main(string[] args)
    {
        var numbers = new List<int>();
        numbers.AddRange(Enumerable.Range(0, 100000));

        var answer = numbers.BinarySearchWithCount(2);
        Console.WriteLine("item: " + answer.Item1);   // item: 2
        Console.WriteLine("count: " + answer.Item2);  // count: 15

    }
}

这是某种功课吗? List<T>.BinarySearch方法不提供此类信息。

如果您需要比较次数,您必须编写自己的IComparer二进制搜索,或者仍然使用.NET方法并根据列表的长度和元素的位置计算计数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM