sách gpt4 ăn đã đi

Ghi chú: Đánh giá KMP

In lại Tác giả: Tôi là chú chim nhỏ Thời gian cập nhật: 2023-08-01 22:31:33 28 4
mua khóa gpt4 giày nike

Ghi

Một thuật toán chuỗi quan trọng, đây là lần xem xét thứ ba.

Tóm lại, tôi nghĩ sở dĩ một thuật toán nào đó luôn quên là do não không bao giờ nhận ra logic của thuật toán này (tức là mạch não).

Bài viết này chủ yếu giải thích các kịch bản ứng dụng KMP, kiến ​​thức về thuật toán và các ví dụ.

Chủ yếu

Có hai chuỗi \(A, B\). Tìm số lần \(A\) xuất hiện trong \(B\). Phạm vi: Độ dài chuỗi là \(\leq 1e6 + 10\).

Thực chất, nói một cách đơn giản, KMP tối ưu hóa vòng lặp kép để giải quyết vấn đề khớp chuỗi.

Vì vậy, để tổng hợp lại, nếu bạn gặp phải vấn đề về chuỗi, nếu không thể sử dụng dp, hãy xem xét băm và KMP.

Về mặt toán học, chúng ta đi từ đặc biệt đến chung, vậy nên ở đây chúng ta đi từ bạo lực đến tối ưu hóa.

Lấy \(A = abab, B = abababaaabb\) làm ví dụ. Cách tiếp cận chung là vòng lặp kép và độ phức tạp về thời gian là \(O(n ^ 2)\).

Hãy xem cách thực hiện cụ thể điều này.

Mỗi lần một điểm ban đầu được liệt kê, và sau đó từng điểm một được đánh giá xem chúng có giống nhau hay không. Nếu chúng giống nhau, tiếp tục đánh giá cho đến khi; nếu chúng khác nhau, thoát ra và chọn điểm tiếp theo làm điểm ban đầu.

Trước hết, nếu xét thấy có gì đó không ổn ở vị trí \(k\)thì không phải là hoàn toàn không thể khắc phục được. Nếu tiền tố và hậu tố của chuỗi con này từ \(1 .. k - 1\) không giống nhau, chẳng hạn như \(abcfd\), thì các bit được đánh giá không cần phải đánh giá lại vì chúng đã được di chuyển trở lại Tất cả đều bị so le nên chúng ta tiếp tục lùi lại để xác định xem điểm bắt đầu có giống nhau hay không. Nếu chúng giống nhau, hãy bắt đầu đánh giá từng điểm một. Nếu là loại \(abcabc\) thì sẽ dễ dàng xử lý vì chúng ta có thể thực hiện các thao tác sau.

                        
                          abcabcbdde abcabcd

                        
                      

Lúc này người thứ bảy phát hiện có vấn đề, có nên bỏ qua không? Tất nhiên là không.

                        
                          abc|abcbdde |abcabcd

                        
                      

Chỉ cần bắt đầu lại với cùng một tiền tố. Nhưng rõ ràng nó vẫn không khớp trong trường hợp này.

                        
                              đối với (int i = 1, j = 0; i <= m; i ++ ) { trong khi (j && b[i] != a[j + 1]) j = ne[j]; nếu (b[i] == a[j + 1]) j ++ ; nếu (j == n) { cout << i - n << ' '; j = ne[j]; } }

                        
                      

Thông qua ý tưởng này, bạn chỉ cần duyệt qua chuỗi gốc mỗi lần và độ phức tạp về thời gian là \(O(n)\).

Trước khi so khớp, cần tính toán tiền tố và hậu tố dài nhất tương ứng với từng chữ số trong chuỗi con và ghi lại chữ số cuối cùng của tiền tố.

                        
                              đối với (int i = 2, j = 0; i <= n; i ++ ) { trong khi (j && a[i] != a[j + 1]) j = ne[j]; nếu (a[i] == a[j + 1]) j ++ ; ne[i] = j; }

                        
                      

ví dụ

xe đạp.

Bằng cách sử dụng các thuộc tính của mảng ne, bạn có thể ngay lập tức nhận được tiền tố và hậu tố giống hệt nhau dài nhất của một chuỗi. Quan sát cho thấy có những chuỗi có phần vòng lặp:

  • dangdi \(Tôi\) Bit tồn tại \(i \mod{(i - ne_i)} = 0\) , thì phần chu trình của anh ta phải là \(i - ne_i + 1 ... i\) , số đó là \(i / (i - ne_i)\)

Cái này tôi tự soạn thảo nên sẽ không nói nhiều nữa.

mã số.

Cuối cùng, bài viết về ghi chú: Đánh giá KMP kết thúc tại đây. Nếu bạn muốn biết thêm về ghi chú: Đánh giá KMP, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

28 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress