Tôi vừa thực hiện một rất đơn giản thuật toán binarySearch trong C# cho việc tìm kiếm số nguyên trong một mảng số nguyên:Tại sao C# Array.BinarySearch quá nhanh?
Binary Search
static int binarySearch(int[] arr, int i)
{
int low = 0, high = arr.Length - 1, mid;
while (low <= high)
{
mid = (low+high)/2;
if (i < arr[mid])
high = mid-1;
else if (i > arr[mid])
low = mid+1;
else return mid;
}
return -1;
}
Khi so sánh nó với C# 's mẹ đẻ Array.BinarySearch()
Tôi có thể thấy rằng Array.BinarySearch()
là nhanh hơn gấp hai lần làm chức năng của tôi, mỗi lần duy nhất.
MSDN trên Array.BinarySearch:
tìm kiếm một mảng được sắp xếp một chiều toàn bộ cho một yếu tố cụ thể, sử dụng giao diện chung IComparable thực hiện bởi mỗi phần tử của mảng và đối tượng quy định.
Điều gì làm cho cách tiếp cận này quá nhanh? kết quả
mã kiểm tra
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
Random rnd = new Random();
Stopwatch sw = new Stopwatch();
const int ELEMENTS = 10000000;
int temp;
int[] arr = new int[ELEMENTS];
for (int i = 0; i < ELEMENTS; i++)
arr[i] = rnd.Next(int.MinValue,int.MaxValue);
Array.Sort(arr);
//Custom binarySearch
sw.Restart();
for (int i = 0; i < ELEMENTS; i++)
temp = binarySearch(arr, i);
sw.Stop();
Console.WriteLine($"Elapsed time for custom binarySearch: {sw.ElapsedMilliseconds}ms");
//C# Array.BinarySearch
sw.Restart();
for (int i = 0; i < ELEMENTS; i++)
temp = Array.BinarySearch(arr,i);
sw.Stop();
Console.WriteLine($"Elapsed time for C# BinarySearch: {sw.ElapsedMilliseconds}ms");
}
static int binarySearch(int[] arr, int i)
{
int low = 0, high = arr.Length - 1, mid;
while (low <= high)
{
mid = (low+high)/2;
if (i < arr[mid])
high = mid-1;
else if (i > arr[mid])
low = mid+1;
else return mid;
}
return -1;
}
}
thử nghiệm
+------------+--------------+--------------------+
| Attempt No | binarySearch | Array.BinarySearch |
+------------+--------------+--------------------+
| 1 | 2700ms | 1099ms |
| 2 | 2696ms | 1083ms |
| 3 | 2675ms | 1077ms |
| 4 | 2690ms | 1093ms |
| 5 | 2700ms | 1086ms |
+------------+--------------+--------------------+
Bạn có thể [xem qua] (http://referencesource.microsoft.com/#mscorlib/system/array.cs,b92d187c91d4c9a9) tại nguồn để biết các gợi ý. – Blorgbeard
Bạn có chạy thử nghiệm của mình trong Bản phát hành bên ngoài VS không? –
Tôi vừa làm, và trên máy tính của tôi, 'binarySearch' của bạn gấp 2,5 lần ** nhanh hơn ** so với' Array'. –