Dưới đây là một phiên bản nhanh hơn của Ergwun's excellent answer:
static int SearchBytes(byte[] haystack, byte[] needle) {
var len = needle.Length;
var limit = haystack.Length - len;
for(var i = 0; i <= limit; i++) {
var k = 0;
for(; k < len; k++) {
if(needle[k] != haystack[i+k]) break;
}
if(k == len) return i;
}
return -1;
}
Trong một thử nghiệm ngắn với một đống cỏ khô 11MB và 9 byte kim, đây là nhanh hơn khoảng ba lần.
Các tối ưu là:
- Không có chức năng cuộc gọi mỗi lần thông qua các vòng ngoài.
- Độ dài của kim và giới hạn tìm kiếm được lưu trong bộ nhớ cache.
- Kiểm tra độ dài dư thừa ở đầu
match()
bị xóa.
Tất nhiên đối với mảng byte dài bạn muốn sử dụng cái gì đó như tìm kiếm Boyer-Moore, nhưng với nhiều mục đích, một thuật toán đơn giản như thế này đủ tốt và có đặc điểm ngắn gọn và dễ hiểu và xác minh.
Nguồn
2014-11-12 06:19:13
Tôi nghĩ chúng tôi cần thêm thông tin. Bạn đang cố gắng tìm một chuỗi byte trong một mảng byte? Bạn có thể đưa ra một ví dụ? – Andrew
Xem, ví dụ: thuật toán [Knuth-Morris-Pratt] (http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm). – jason