Mat*_*gan 4 c# algorithm search count
我的任务是创建两个单独的程序,一个我已经完成的线性搜索程序,以及一个二进制搜索程序.这些程序还必须计算在搜索过程中进行的比较次数.我的线性搜索程序已经计算了我的二进制搜索程序不能进行的比较次数.二进制搜索的代码如下所示:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人可以告诉我如何修改它来计算比较,将不胜感激.
非常感谢,马修.
实施一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在比较器的重载中BinarySearch使用它作为比较器:
CountComparer comparer = new CountComparer();
int answer = numbers.BinarySearch(Lookfor, comparer);
Run Code Online (Sandbox Code Playgroud)
比较器然后包含计数:
Console.WriteLine("The binary search made {0} comparisons.", comparer.Count);
Run Code Online (Sandbox Code Playgroud)
额外奖励:任何类似类型的通用计数比较器:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用此扩展方法(基于此答案的代码)
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1790 次 |
| 最近记录: |