Hôm qua StackOverflow đã ngừng hoạt động trong nửa giờ. Sau đó, họ đã viết một bài đăng trên blog về nó , chi tiết rằng vấn đề bắt nguồn từ sự phức tạp cao bất ngờ của kết hợp biểu thức chính quy.
Nói tóm lại, biểu thức chính quy a+b
, khi chạy trên chuỗi aaaaaaaaaaaaaac
, chạy trong thời gian trong đó là số lượng ký tự, vì nó sử dụng quay lui.a
Bạn có thể tái tạo sự cố với mã Python sau, trên máy tính của tôi, mất hơn 4 giây để chạy:
import re, time
start = time.time()
re.findall(r'\s+$', ' '*20000 + 'x')
print(time.time() - start)
Điều này rất đáng ngạc nhiên đối với tôi; Tôi đã nghĩ rằng một công cụ đối sánh regex hoạt động hiệu quả hơn, ví dụ: bằng cách xây dựng một DFA từ regex và sau đó chạy chuỗi mong muốn thông qua nó, mà tôi đã nghĩ sẽ là (không bao gồm việc xây dựng DFA).
(Ví dụ, cuốn sách Giới thiệu về thuật toán của Cormen, Leiserson, Rivest trải qua một thuật toán tương tự trên đường giới thiệu thuật toán Knuth-Morris-Pratt).
Câu hỏi của tôi: Có điều gì đó vốn đã khó khăn trong việc khớp biểu thức chính quy không cho phép thuật toán hoặc chúng ta chỉ đơn giản nói về việc triển khai không hiệu quả (trong Python, trong bất kỳ điều gì StackOverflow sử dụng, v.v.)?