Nhảy chuyển đến

Z hàm số ( mở rộng KMP )

Ước định: Tự phù xuyến hạ tiêu lấyVì khởi điểm.

Định nghĩa

Đối với một cái chiều dài vìTự phù xuyến,Định nghĩa hàm sốTỏ vẻCùng( tức lấyMở đầu hậu tố ) dài nhất công cộng tiền tố ( LCP ) chiều dài, tắcĐược xưng làZ hàm số.Đặc biệt mà,.

Nước ngoài giống nhau đem tính toán nên số tổ thuật toán xưng làZ Algorithm,Mà quốc nội tắc xưng này vìMở rộng KMP.

Áng văn chương này giới thiệu ởThời gian phức tạp độ nội tính toán Z hàm số thuật toán cùng với này các loại ứng dụng.

Giải thích

Phía dưới bao nhiêu dạng lệ triển lãm đối với bất đồng tự phù xuyến Z hàm số:

Mộc mạc thuật toán

Z hàm số mộc mạc thuật toán phức tạp độ vì:

Thực hiện
1
2
3
4
5
6
7
vectorint>z_function_trivial(strings){
intn=(int)s.length();
vectorint>z(n);
for(inti=1;in;++i)
while(i+z[i]n&&s[z[i]]==s[i+z[i]])++z[i];
returnz;
}
1
2
3
4
5
6
7
defz_function_trivial(s):
n=len(s)
z=[0]*n
foriinrange(1,n):
whilei+z[i]nands[z[i]]==s[i+z[i]]:
z[i]+=1
returnz

Tuyến tính thuật toán

Giống như đại đa số tự phù xuyến chủ đề sở giới thiệu thuật toán, này mấu chốt ở chỗ, vận dụng tự động cơ tư tưởng tìm kiếm hạn chế điều kiện hạ trạng thái dời đi hàm số, khiến cho có thể mượn dùng phía trước trạng thái tới gia tốc tính toán tân trạng thái.

Ở nên thuật toán trung, chúng ta từĐếnLần lượt tính toánGiá trị (). Ở tính toánTrong quá trình, chúng ta sẽ lợi dụng đã tính toán tốt.

Đối với,Chúng ta xưng khu gianXứng đôi đoạn,Cũng có thể kêu Z-box.

Thuật toán trong quá trình chúng ta giữ gìn hữu điểm cuối nhất dựa hữu xứng đôi đoạn. Vì phương tiện, nhớ làm.Căn cứ định nghĩa,Tiền tố. Ở tính toánKhi chúng ta bảo đảm.Mới bắt đầu khi.

Ở tính toánTrong quá trình:

  • Nếu,Như vậy căn cứĐịnh nghĩa có,Bởi vậy.Lúc này:
    • Nếu,Tắc.
    • Nếu không,Lúc này chúng ta lệnh,Sau đó bạo lực cái cử tiếp theo cái tự phù mở rộngThẳng đến không thể mở rộng mới thôi.
  • Nếu,Như vậy chúng ta trực tiếp dựa theo mộc mạc thuật toán, từBắt đầu tương đối, bạo lực cầu ra.
  • Ở cầu raSau, nếu,Chúng ta liền yêu cầu đổi mới,Cho dù.

Có thể phỏng vấnCái này trang webTới xem Z hàm số bắt chước quá trình.

Thực hiện

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vectorint>z_function(strings){
intn=(int)s.length();
vectorint>z(n);
for(inti=1,l=0,r=0;in;++i){
if(ir&&z[i-l]r-i+1){
z[i]=z[i-l];
}else{
z[i]=max(0,r-i+1);
while(i+z[i]n&&s[z[i]]==s[i+z[i]])++z[i];
}
if(i+z[i]-1>r)l=i,r=i+z[i]-1;
}
returnz;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
defz_function(s):
n=len(s)
z=[0]*n
l,r=0,0
foriinrange(1,n):
ifirandz[i-l]r-i+1:
z[i]=z[i-l]
else:
z[i]=max(0,r-i+1)
whilei+z[i]nands[z[i]]==s[i+z[i]]:
z[i]+=1
ifi+z[i]-1>r:
l=i
r=i+z[i]-1
returnz

Phức tạp độ phân tích

Đối với nội tầngwhileTuần hoàn, mỗi lần chấp hành đều sẽ khiến choVề phía sau di ít nhấtVị, mà,Cho nên tổng cộng chỉ biết chấp hànhThứ.

Đối với ngoại tầng tuần hoàn, chỉ có một lần tuyến tính biến lịch.

Tổng phức tạp độ vì.

Ứng dụng

Chúng ta hiện tại tới suy xét ở bao nhiêu cụ thể dưới tình huống Z hàm số ứng dụng.

Này đó ứng dụng ở rất lớn trình độ thượng cùngTiền tố hàm sốỨng dụng cùng loại.

Xứng đôi sở hữu tử xuyến

Vì tránh cho lẫn lộn, chúng ta đemGọiVăn bản,ĐemGọiHình thức.Sở cấp ra vấn đề là: Tìm kiếm ở văn bảnTrung hình thứcSở hữu xuất hiện ( occurrence ).

Vì giải quyết này vấn đề, chúng ta cấu tạo một cái tân tự phù xuyến,Cũng tức chúng ta đemCùngLiên tiếp ở bên nhau, nhưng là ở bên trong đặt một cái phân cách tự phù( chúng ta đem như thế lựa chọn sử dụngKhiến cho này nhất định không xuất hiện ởCùngTrung ).

Đầu tiên tính toánZ hàm số. Kế tiếp, đối với ở khu gianTrung tùy ý,Chúng ta suy xét lấyVì mở đầu hậu tố ởTrung Z hàm số giá trị.Nếu,Như vậy chúng ta biết có một cáiXuất hiện ở vàoĐệVị trí, nếu không không cóXuất hiện ở vàoĐệVị trí.

Lúc đó gian phức tạp độ ( đồng thời cũng là này không gian phức tạp độ ) vì.

Bản chất bất đồng tử xuyến số

Cấp định một cái chiều dài vìTự phù xuyến,Tính toánBản chất bất đồng tử xuyến số lượng.

Suy xét tính toán tăng lượng, tức ở biết trước mặtBản chất bất đồng tử xuyến số dưới tình huống, tính toán ra ởCuối cùng tăng thêm một chữ phù sau bản chất bất đồng tử xuyến số.

LệnhVì trước mặtBản chất bất đồng tử xuyến số. Chúng ta tăng thêm một cái tân tự phùĐếnCuối cùng. Hiển nhiên, sẽ xuất hiện một ít lấyKết cục tân tử xuyến ( lấyKết cục thả phía trước chưa xuất hiện quá tử xuyến ).

Thiết xuyếnThế vai ( thế vai chỉ đem nguyên tự phù xuyến tự phù đảo ngược sắp hàng hình thành tự phù xuyến ). Chúng ta nhiệm vụ là tính toán có bao nhiêuTiền tố chưa ởĐịa phương khác xuất hiện. Suy xét tính toánZ hàm số cũng tìm được này cực đại.TắcChiều dài nhỏ hơn hoặc bằngTiền tố thế vai ởTrung là đã xuất hiện quá lấyKết cục tử xuyến.

Cho nên, đem tự phùTăng thêm đếnSau tân xuất hiện tử xuyến số lượng vì.

Thuật toán thời gian phức tạp độ vì.

Đáng chú ý chính là, chúng ta có thể dùng đồng dạng phương pháp ởThời gian nội, một lần nữa tính toán ở điểm cuối chỗ tăng thêm một chữ phù hoặc là xóa bỏ một chữ phù ( từ đuôi hoặc là đầu ) sau bản chất bất đồng tử xuyến số lượng.

Tự phù xuyến chỉnh chu kỳ

Cấp định một cái chiều dài vìTự phù xuyến,Tìm được này ngắn nhất chỉnh chu kỳ, tức tìm kiếm một cái ngắn nhất tự phù xuyến,Khiến choCó thể bị bao nhiêu cáiGhép nối mà thành tự phù xuyến tỏ vẻ.

Suy xét tính toánZ hàm số, tắc này chỉnh chu kỳ chiều dài vì nhỏ nhấtThừa tố,Thỏa mãn.

Nên sự thật chứng minh cùng ứng dụngTiền tố hàm sốChứng minh giống nhau.

Luyện tập đề mục


Bổn giao diện chủ yếu dịch tự bác vănZ-функция строки и её вычислениеCùng với tiếng Anh phiên dịch bảnZ-function and its calculation.Trong đó tiếng Nga bản bản quyền hiệp nghị vì Public Domain + Leave a Link; tiếng Anh bản bản quyền hiệp nghị vì CC-BY-SA 4.0.