Boyer–Moore thuật toán
Trước trí tri thức:Tiền tố hàm số cùng KMP thuật toán.
KMP thuật toán đem tiền tố xứng đôi tin tức dùng tới rồi cực hạn,
Mà BM thuật toán sau lưng cơ bản tư tưởng là thông qua hậu tố xứng đôi đạt được so tiền tố xứng đôi càng nhiều tin tức tới thực hiện càng mau tự phù nhảy chuyển.
Dẫn vào
Tưởng tượng một chút, nếu chúng ta hình thức tự phù xuyến
Ở chỗ này làm định nghĩa, sau này không lắm lời:
Nếu chúng ta đã biết
Quan sát 1
Nếu chúng ta biết
Quan sát 2
Càng giống nhau mà,Nếu xuất hiện ở
Như vậy liền có thể không cần xứng đôi, trực tiếp đem
Bởi vậy trừ phi
Chú ý: Hiển nhiên cái này biểu chỉ cần tính toán đến
Hiện tại giả thiết
Nếu là, liền tiếp tục hồi lui thẳng đến toàn bộ hình thức xuyến
Hoặc là, chúng ta cũng có thể sẽ ở xứng đôi xong
Quan sát 3(a)
ỞQuan sát 2Trung nhắc tới, đương xứng đôi xong
Yêu cầu đem
Mà
Cho nên chúng ta lực chú ý hẳn là dọc theo
Nhưng mà, chúng ta có cơ hội nhảy qua càng nhiều tự phù, thỉnh tiếp tục xem đi xuống.
Quan sát 3(b)
Nếu chúng ta biết
Chúng ta còn biết ở
Khiến cho thất xứng tự phù
Giả thiết lúc này
Giả định
Cho nên có:
Vì thế chúng ta ở thất xứng khi, có thể đem đem
Quá trình
Mũi tên chỉ hướng thất xứng tự phù
Căn cứQuan sát 2,Chúng ta yêu cầu đem
Hiện tạichar:
Căn cứQuan sát 3(a),
Lúc này
Hiển nhiên trực quan thượng xem, lúc này căn cứQuan sát 3(b),Đem
Mà từ hình thức hóa logic xem, lúc này,
Hiện tại chúng ta phát hiện
Thuật toán thiết kế
Lúc ban đầu xứng đôi thuật toán
Giải thích
Hiện tại xem như vậy một cái lợi dụng
Nếu mặt trên thuật toán
Sau đó làm chúng ta càng tinh tế mà miêu tả hạ tính toán
Căn cứ trước văn định nghĩa,
Nói cách khác yêu cầu tìm được một cái tốt nhất
- Đương
Khi, tương đương với ở Phía trước bổ sung một đoạn giả thuyết tiền tố, trên thực tế cũng phù hợp Nhảy chuyển nguyên lý. - Đương
Khi, nếu ,Tắc cái này Không thể làm Hợp lý tái hiện. Nguyên nhân là Bản thân là thất xứng tự phù, cho nên Trượt xuống dưới động Cái tự phù sau, ở phía sau chuế xứng đôi trong quá trình vẫn cứ sẽ ở Chỗ thất xứng.
Còn phải chú ý hai cái hạn chế điều kiện:
.Bởi vì đương Khi, có ,Ở Thượng thất xứng tự phù cũng sẽ ở Thượng thất xứng.- Suy xét đến
,Cho nên quy định .
Quá trình
Bởi vì lý giải
Đối với
Đối với
Đối với
Đối với
Đối với
Đối với
Đối với
Đối với
Đối với
Hiện tại lại xem một chút một cái khác ví dụ:
Đối với
Đối với
Đối với
Đối với
Đối với
Đối với
Đối với
Đối với
Đối với
Đối xứng đôi thuật toán một cái cải tiến
Cuối cùng, thực tiễn trong quá trình suy xét đến tìm tòi trong quá trình phỏng chừng có 80% thời gian dùng ởQuan sát 1Nhảy chuyển thượng, cũng chính là
Vì thế, có thể vì thế tiến hành đặc biệt ưu hoá:
Chúng ta định nghĩa một cái
Dùng
Trong đó
Trải qua cải tiến, so với nguyên thuật toán, ở làmQuan sát 1Nhảy chuyển khi không cần mỗi lần tiến hành
delta2 xây dựng chi tiết
Dẫn vào
Ở 1977 năm 10 nguyệtCommunications of the ACMThượng, Boyer, Moor luận văn1Trung chỉ miêu tả
Cấu tạo
Mộc mạc thuật toán
Ở giới thiệu Knuth
- Đối với
[0, patlen)
Khu gian mỗi một vị tríi
,Căn cứsubpat
Chiều dài xác định này tái hiện vị trí khu gian, cũng chính là[-subpatlen, i]
; - Khả năng tái hiện vị trí dựa theo từ hữu đến tả tiến hành trục tự phù tương đối, tìm kiếm phù hợp
Yêu cầu nhất bên phải Tái hiện vị trí; - Cuối cùng đừng quên lệnh
.
Thực hiện
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
Đặc biệt mà, đối Rust ngôn ngữ đặc tính tiến hành tất yếu mà giải thích, hạ không lắm lời:
usize
Cùngisize
Là cùng nội tồn kim đồng hồ cùng byte số vô ký hiệu số nguyên cùng có ký hiệu số nguyên, ở 32 vị cơ thượng tương đương vớiu32
Cùngi32
,64 vị cơ thượng tương đương vớiu64
Cùngi64
.- Hướng dẫn tra cứu số tổ, vector, phân vùng khi sử dụng
usize
Loại hình con số ( bởi vì ở làm nội tồn thượng tùy cơ phỏng vấn hơn nữa hạ tiêu không thể vì giá trị âm ), cho nên nếu yêu cầu xử lý giá trị âm phải dùngisize
,Mà tiến hành hướng dẫn tra cứu khi lại phải dùngusize
,Này liền nhìn đến sử dụngas
Mấu chốt tự tiến hành hai người chi gian hiện thức thay đổi. impl PartialEq
Chỉ là dùng làm phiếm hình, có thể đồng thời duy trìUnicode
Mã hóachar
Cùng cơ số haiu8
.
Hiển nhiên, nên bạo lực thuật toán thời gian phức tạp độ vì
Hiệu suất cao thuật toán
Phía dưới chúng ta muốn giới thiệu chính là thời gian phức tạp độ vì
Tuy rằng 1977 năm Knuth đưa ra cái này xây dựng phương pháp, nhưng mà hắn nguyên thủy phiên bản xây dựng thuật toán tồn tại một cái khuyết tật, trên thực tế đối với nào đó
Rytter ở 1980 nămSIAM Journal on ComputingThượng phát biểu văn chương3Đối này đưa ra tu chỉnh, dưới là
Đầu tiên suy xét đến
Dựa theo tái hiện vị trí từ xa đến gần, cũng chính là chếch đi lượng từ lớn đến tiểu, phân thành như sau mấy loại:
Toàn bộ
Tái hiện vị trí hoàn toàn ở Bên trái, tỷ như ,Lúc này ; Tái hiện có một bộ phận ở Bên trái, có một bộ phận là Phần đầu, tỷ như ,Lúc này ;Chúng ta đem Hoàn toàn ở Phần đầu giới hạn tình huống cũng phân loại ở chỗ này ( đương nhiên căn cứ thực hiện cũng có thể phân loại tại hạ biên ), tỷ như ,Lúc này ; Tái hiện hoàn toàn ở Trung, tỷ như ,Lúc này .
Hiện tại tới thảo luận như thế nào hiệu suất cao mà tính toán này ba loại tình huống:
Đệ nhất loại tình huống
Đây là đơn giản nhất tình huống, chỉ cần một lần biến lịch hơn nữa có thể thuận tiện đem
Đệ nhị loại tình huống
Chúng ta quan sát khi nào sẽ xuất hiện
Tỷ như phía trước ví dụ:
Trên thực tế đối đệ nhị loại cùng loại thứ ba tình huống tính toán mấu chốt đều yêu cầu tiền tố hàm số tính toán cùng cùng ứng dụng
Như vậy chỉ cần
Mà đương
Có thể tính toán lúc này
Thiết lúc này này đối bằng nhau trước sau chuế chiều dài vì
Mà
Sau đó mặt khả năng sẽ có bao nhiêu đối bằng nhau tiền tố cùng hậu tố, tỷ như:
Ở
Knuth thuật toán khuyết tật là chỉ suy xét dài nhất kia một đôi tình huống, nhưng trên thực tế chúng ta muốn suy xét sở hữu
Lợi dụng tiền tố hàm số cùng nghịch hướng vận dụng tính toán tiền tố hàm số trạng thái dời đi phương trình:
Như thế liền hoàn thành đệ nhị loại tình huống
Loại thứ ba tình huống
Nếu dùng BM thuật toán giải quyết, chúng ta phải tới rồi một cái BM đệ quy thực hiện loại thứ ba tình huống, kết thúc điều kiện là
Hơn nữa căn cứ
Này liền tốt lắm dẫn dắt chúng ta, có thể sử dụng cùng loại với tính toán tiền tố hàm số quá trình tính toán loại thứ ba tình huống, chẳng qua là tả hữu trái lại tiền tố hàm số:
- Hai cái kim đồng hồ phân biệt chỉ hướng tử xuyến tả điểm cuối cùng tử xuyến dài nhất công cộng trước sau chuế “Tiền tố” vị trí, từ hữu hướng tả di động, ở phát hiện chỉ hướng hai chữ phù bằng nhau khi tiếp tục di động, lúc này tương đương với “Tiền tố” biến đại;
- Đương hai chữ phù không bằng nhau khi, phía trước bằng nhau bộ phận liền thỏa mãn
Đối tái hiện yêu cầu, hơn nữa hồi lui chỉ hướng “Tiền tố” vị trí kim đồng hồ thẳng đến cấu thành tân tự phù bằng nhau hoặc là ra ngoài.
Cùng tiền tố hàm số giống nhau, yêu cầu một cái phụ trợ số tổ, dùng cho hồi lui, có thể sử dụng phía trước tính toán đệ nhị loại tình huống sở sinh thành tiền tố số tổ không gian.
Thực hiện
Kể trên thực hiện
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
|
Galil quy tắc đối nhiều lần xứng đôi khi nhất hư tình huống cải thiện
Về hậu tố xứng đôi thuật toán nhiều lần xứng đôi vấn đề
Phía trước tìm tòi thuật toán chỉ đề cập đến ở
Như thế nào lợi dụng phía trước xứng đôi thành công tự phù tin tức, đem nhất hư dưới tình huống thời gian phức tạp độ hàng vì tuyến tính.
Ở nguyên thủy thành công xứng đôi sau, đơn giản
Tỷ như một cái cực đoan ví dụ:
Đối này Knuth nói ra một cái phương pháp là dùng một cái “Số lượng hữu hạn” trạng thái tập hợp tới ký lục
Phía dưới giới thiệu ý nghĩ đơn giản thả không cần thêm vào dự xử lý chi tiêu Galil thuật toán4.
Galil quy tắc
Giả định một cái
Tỷ như,
Ở tìm tòi trong quá trình, nếu chúng ta
Vì tính toán cái này ngắn nhất chu kỳ chiều dài, chúng ta giả thiết đã biết
Khi chúng ta biết
Mà dài nhất bằng nhau trước sau chuế chiều dài,
Kết hợp kể trên ưu hoá BM tìm tòi thuật toán cuối cùng thực hiện
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
|
Nhất hư tình huống ở thực tiễn trung tính có thể ảnh hưởng
Từ thực tiễn góc độ thượng nói, lý luận thượng nhất hư tình huống cũng không dễ dàng ảnh hưởng tính năng biểu hiện, cho dù là rất nhỏ chỉ có 4 tự phù tập tùy cơ văn bản thí nghiệm hạ loại này nhất hư tình huống ảnh hưởng cũng nhỏ đến khó có thể quan sát.
Cũng bởi vậy nếu không có tốt lắm thiết kế, sử dụng Galil pháp tắc sẽ liên lụy một chút bình quân tính năng biểu hiện, nhưng đối với một ít cực đoan đặc thù
Cải tiến thuật toán
Simplified Boyer–Moore thuật toán
BM thuật toán nhất phức tạp địa phương liền ở chỗ
Boyer–Moore–Horspol thuật toán
Horspol thuật toán đồng dạng là căn cứ vào hư tự phù quy tắc, ở cùng
Thực hiện
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Boyer–Moore–Sunday thuật toán
Sunday thuật toán đồng dạng là lợi dụng hư tự phù quy tắc, chẳng qua so sánh với Horspool nó càng tiến thêm một bước, trực tiếp chú ý
Thực hiện nó chỉ cần hơi chút sửa chữa
Sunday thuật toán thông thường dùng làm trong tình huống bình thường thực hiện đơn giản nhất hơn nữa bình quân biểu hiện tốt nhất chi nhất thực dụng thuật toán, thông thường tính năng so Horspool cùng BM muốn hảo một chút.
Thực hiện
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
BMHBNFS thuật toán
Nên thuật toán kết hợp Horspool cùng Sunday, là CPython thực hiệnstringlib
Mô khối khi dùng đếnfind
Thuật toán5,Dưới tên gọi tắt B5S.
B5S cơ bản ý nghĩ là:
Dựa theo hậu tố xứng đôi ý nghĩ, đầu tiên tương đối
Vị trí đối ứng tự phù hay không bằng nhau, nếu bằng nhau liền tương đối Đối ứng vị trí tự phù hay không bằng nhau, nếu vẫn cứ bằng nhau, như vậy liền phát hiện một cái xứng đôi;Nếu bất luận cái gì một cái giai đoạn phát sinh không xứng đôi, liền tiến vào nhảy chuyển giai đoạn;
Ở nhảy chuyển giai đoạn, đầu tiên quan sát
Vị trí tiếp theo cái tự phù hay không ở Trung, nếu không ở, trực tiếp hướng hữu hoạt động ,Đây là Sunday thuật toán lớn nhất lợi dụng;Nếu cái này tự phù ở
Trung, đối Chỗ tự phù lợi dụng Tiến hành Horspool nhảy chuyển.
Mà căn cứ thời gian tiết kiệm vẫn là không gian tiết kiệm vì mục tiêu đệ nhất, thuật toán sẽ có khác biệt thật lớn bất đồng thực hiện.
Thời gian tiết kiệm phiên bản
Thực hiện
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
|
Nên phiên bản B5S tính năng biểu hiện phi thường lý tưởng, trước mắt trước giới thiệu hậu tố xứng đôi hệ liệt thuật toán trung là trong tình huống bình thường là nhanh nhất.
Không gian tiết kiệm phiên bản
Đồng dạng ở CPythonstringlib
Trung thực hiện, sử dụng hai cái số nguyên xấp xỉ thay thế được tự phù biểu cùng
Dùng một cái đơn giản Bloom lọc khí thay thế được tự phù biểu ( Alpha bet )
Thực hiện
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
pubstructBytesBloomFilter{ mask:u64, } implBytesBloomFilter{ pubfnnew()->Self{ SimpleBloomFilter{ mask:0, } } fninsert(&mutself,byte:&u8){ (self.mask)|=1u64(byte&63); } fncontains(&self,char:&u8)->bool{ (self.mask&(1u64(byte&63)))!=0 } }
Bloom lọc khí thiết thiết kế thông qua hy sinh chuẩn xác suất ( thực tế còn có vận hành thời gian ) tới cực đại mà tiết kiệm tồn trữ không gian
Set
Loại hình số liệu kết cấu, nó đặc điểm là sẽ đem tập hợp trung không tồn tại hạng ngộ phán vì tồn tại ( False Positives, tên gọi tắt FP ), nhưng sẽ không đem tập hợp trung tồn tại hạng phán đoán vì không tồn tại ( False Negatives, tên gọi tắt FN ), bởi vậy sử dụng nó khả năng sẽ bởi vì FP mà không có được đến lớn nhất tự phù nhảy chuyển, nhưng sẽ không bởi vì FN mà nhảy qua bổn ứng xứng đôi tự phù.Lý luận thượng phân tích, kể trên “Bloom lọc khí” thực hiện ở
Chiều dài ở 50 cái Bytes khi, FP xác suất ước vì 0.5, mà Chiều dài ở 10 cái Bytes khi, FP xác suất ước vì 0.15.Tuy rằng này không phải một cái tiêu chuẩn Bloom lọc khí, đầu tiên nó trên thực tế không có sử dụng một cái chân chính ha hi hàm số, trên thực tế nó chỉ là một chữ phù chiếu rọi, đem 0-255 byte chiếu rọi vì nó trước sáu vị cấu thành số.
Nhưng suy xét đến chúng ta ở bên trong tồn thượng tiến hành tự phù tìm tòi, loại này đơn giản hoá liền trọng yếu phi thường, cho dù dùng trước mắt đã biết nhanh nhất phi mã hóa ha hi thuật toánxxHash,Tính toán sở yêu cầu thời gian vẫn so nó cao một số lượng cấp.
Mặt khác đương pat ở 30 byte dưới khi, vì đạt tới tốt nhất FP xác suất, yêu cầu không ngừng một cái ha hi hàm số. Nhưng làm như vậy ý nghĩa không lớn, bởi vì dùng trang có hai cái
u128
Con số số tổ cũng đã có thể xây dựng tự phù biểu toàn tự phù tập.Sử dụng
Thay thế toàn bộQuan sát
,Nhất thường sử dụng chỗ chính là hậu tố xứng đôi khi cái thứ nhất tự phù liền không xứng đôi là nhất thường thấy không xứng đôi tình huống, vì thế lệnhskip = delta1(pat[patlastpos])
,Ở đệ nhất giai đoạn không xứng đôi khi, trực tiếp trượt xuống dưới động
skip
Cái tự phù; nhưng đương đệ nhị giai đoạn không xứng khi, bởi vì khuyết thiếu toàn bộ Tin tức, chỉ có thể trượt xuống dưới động một chữ phù.Thực hiện
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
pubstructB5SSpacePatterna>{ pat_bytes:&'a[u8], Alpha bet:BytesBloomFilter, skip:usize, } impla>B5SSpacePatterna>{ pubfnnew(pat:&'astr)->Self{ assert_ne!(pat.len(),0); letpat_bytes=pat.as_bytes(); let(Alpha bet,skip)=B5SSpacePattern::build(pat_bytes); B5SSpacePattern{pat_bytes,Alpha bet,skip} } fnbuild(p:&'a[u8])->(BytesBloomFilter,usize){ letmutAlpha bet=BytesBloomFilter::new(); letlastpos=p.len()-1; letmutskip=p.len(); foriin0..p.len()-1{ Alpha bet.insert(&p[i]); ifp[i]==p[lastpos]{ skip=lastpos-i; } } Alpha bet.insert(&p[lastpos]); (Alpha bet,skip) } pubfnfind_all(&self,string:&'astr)->Vecusize>{ letmutresult=vec![]; letstring_bytes=string.as_bytes(); letpat_last_pos=self.pat_bytes.len()-1; letpatlen=self.pat_bytes.len(); letstringlen=string_bytes.len(); letmutstring_index=pat_last_pos; whilestring_indexstringlen{ ifstring_bytes[string_index]==self.pat_bytes[pat_last_pos]{ if&string_bytes[string_index-pat_last_pos..string_index]==&self.pat_bytes[..patlen-1]{ result.push(string_index-pat_last_pos); } ifstring_index+1==stringlen{ break; } if!self.Alpha bet.contains(&string_bytes[string_index+1]){ string_index+=patlen+1;// sunday }else{ string_index+=self.skip;// horspool } }else{ ifstring_index+1==stringlen{ break; } if!self.Alpha bet.contains(&string_bytes[string_index+1]){ string_index+=patlen+1;// sunday }else{ string_index+=1; } } } result } }
Cái này phiên bản thuật toán tương so với phía trước hậu tố xứng đôi thuật toán không đủ mau, nhưng chênh lệch không lớn, tính năng vẫn cứ trội hơn KMP, đến ích với nó nhiều nhất hai cái
u64
Số nguyên ưu tú không gian phức tạp độ.
Lý luận phân tích
Dưới là giống nhau tự phù tập hạ các thuật toán biểu hiện, tung độ cùng loại với chấp hành chi tiêu ( cost chỉ xứng đôi thành công m cái tự phù sau thất xứng khi đại giới, skip chỉ phát sinh thất xứng khi trượt xuống dưới động k cái tự phù xác suất ), càng nhỏ tính năng càng tốt. Tọa độ ngang vì hình thức tự phù xuyến pat chiều dài:
Ở nhỏ lại tự phù tập ( DNA {A, C, T, G} kiềm cơ đối danh sách ) trung biểu hiện:
Tổng thượng, ở trọng đại tự phù tập, tỷ như hằng ngày tìm tòi trong quá trình, BoyerMoore hệ liệt thuật toán ưu việt biểu hiện, trong đó chủ yếu ỷ lại
Về phương diện khác, ở nhỏ lại tự phù tập,
Nếu có nhất định giàu có không gian dưới tình huống, hoàn chỉnh không gian phức tạp độ vì
Tham khảo tư liệu cùng chú thích
Bổn giao diện gần nhất đổi mới:2024/9/30 17:33:48,Đổi mới lịch sử
Phát hiện sai lầm? Tưởng cùng nhau hoàn thiện?Ở GitHub thượng biên tập này trang!
Bổn giao diện cống hiến giả:minghu6,c0nstexpr,CCXXXI,Chrogeek,Early0v0,Enter-tainer,githuu5y5u,iamtwz,ksyx,megakite,Tiphereth-A,wineee,Xeonacid
Bổn giao diện toàn bộ nội dung ởCC BY-SA 4.0CùngSATAHiệp nghị chi điều khoản hạ cung cấp, phụ gia điều khoản cũng khả năng ứng dụng