Có bao nhiêu chuỗi gần với một chuỗi các chuỗi đã cho?


7

Câu hỏi này đã được nhắc nhở bởi các cấu trúc dữ liệu hiệu quả để xây dựng trình kiểm tra chính tả nhanh .

Với hai chuỗi , chúng tôi nói rằng họ -close nếu họ Damerau-khoảng cách levenshtein ¹ là nhỏ, tức là cho một cố định . Một cách không chính thức, là số lần xóa, chèn, thay thế và (hàng xóm) tối thiểu cần thiết để chuyển đổi thành . Nó có thể được tính trong bằng lập trình động. Lưu ý rằng là một số liệu , đặc biệt đối xứng.u,vkLD(u,v)kkNLD(u,v)uvΘ(|u||v|)LD

Câu hỏi quan tâm là:

Cho một tập hợp gồm chuỗi trên có độ dài tối đa , giá trị của cardinality là bao nhiêuSnΣm

Sk:={wΣvS. LD(v,w)k} ?

Vì thậm chí hai chuỗi có cùng độ dài có số chuỗi -cold khác nhau², một công thức / cách tiếp cận chung có thể khó tìm (không thể?). Do đó, chúng tôi có thể phải tính toán số lượng rõ ràng cho mỗi cho , dẫn chúng tôi đến câu hỏi chính:kS

Độ phức tạp (thời gian) của việc tìm kiếm tính chính xác của tập hợp đối với (tùy ý) gì?{w}kwΣ

Lưu ý rằng số lượng mong muốn là số mũ theo, vì vậy liệt kê rõ ràng là không mong muốn. Một thuật toán hiệu quả sẽ là tuyệt vời.|w|

Nếu có ích, có thể giả định rằng chúng ta thực sự có một chuỗi (lớn) , đó là chúng ta giải quyết câu hỏi được tô sáng đầu tiên.S


  1. Các biến thể có thể bao gồm sử dụng khoảng cách Levenshtein thay thế.
  2. Xét và . Các tập hợp chuỗi bao gồm là (8 từ) và (10 từ), tương ứng.aaab1{a,b}{a,aa,ab,ba,aaa,baa,aba,aab}{a,b,aa,bb,ab,ba,aab,bab,abb,aba}

Không phải là câu hỏi nổi bật về cơ bản là một tìm kiếm hàng xóm gần nhất k? Cụ thể hơn là tôi đang nghĩ về các chỉ số không gian. Có các cấu trúc dữ liệu hỗ trợ các truy vấn k-NN hiệu quả với số liệu tùy ý (với một số ràng buộc) như M-tree và các biến thể của nó. Tôi đang thiếu một cái gì đó hoặc bạn nghĩ rằng điều này sẽ làm việc?
Juho

@mrm Chắc chắn, điều đó sẽ hiệu quả - nếu tôi viết ra tất cả các từ theo cấp số nhân theo chiều dài (mà tôi không muốn làm), hãy tính tất cả các sắp xếp theo cặp (mà tôi muốn phá vỡ) và sau đó xây dựng cây .
Raphael

1
@mrm: Bây giờ tôi nghĩ về nó, việc tìm hàng xóm gần nhất không giải quyết được vấn đề. Chúng tôi muốn tìm tất cả hàng xóm (tối đa một khoảng cách cố định). k
Raphael

Phải, đó là một tìm kiếm truy vấn phạm vi sau đó. Tôi nghĩ rằng có khá nhiều nghiên cứu về chủ đề này, với lượng dữ liệu khổng lồ và cơ sở dữ liệu lớn. Nhưng bất kể, tôi thấy quan điểm của bạn bây giờ. Có lẽ có một cách thông minh hơn :)
Juho

Một vài quan sát khá dễ dàng: (1) nếu chỉ cho phép xóa, thì vấn đề (thứ hai) là đa thức; (2) một ràng buộc cho số lượng làO((|w|+k)k).
rgrig

Câu trả lời:


1

Xem bài viết của Levenshtein . Nó chứa các giới hạn trên các chuỗi số thu được từ việc chèn và xóa một chuỗi. Nếun là độ dài của chuỗi và chuỗi là nhị phân, sau đó số lượng lân cận gần nhất trong khoảng cách Levenshtein là Θ(n2). Thật khó để nói bất cứ điều gì vềk- hàng xóm thấp nhất, nhưng người ta có thể bị giới hạn. Chúng sẽ cung cấp cho bạn một ước tính về sự phức tạp.


Cảm ơn, nhưng đây không phải là số liệu chính xác, cũng không phải là một bảng chữ cái nhị phân là đủ (mặc dù kích thước bảng chữ cái có thể không có tác động về chất). Tôi không nói tiếng Nga nên tôi không thể kiểm tra kết quả có thể được chuyển dễ dàng như thế nào.
Raphael

Giới hạn có vẻ dễ tìm, nhưng câu hỏi yêu cầu đếm chính xác. Tôi có sai không @Raphael?
rgrig

Có một phiên bản tiếng Anh của giấy Levenshtein mà bạn sẽ có thể tìm thấy; nó cũng chứa giới hạn cho bảng chữ cái chung.
Ankur

@rgrig: Câu hỏi yêu cầu số chính xác, nhưng giới hạn (tốt) sẽ được đánh giá cao.
Raphael

0

Nếu là của bạn k đã được sửa và bạn được phép xử lý trước, đây là thứ bạn có thể thử

  1. Xây dựng một biểu đồ sao cho các nút là các từ và một cạnh tồn tại giữa hai nút nếu khoảng cách giữa hai từ đó là 1.
  2. Lấy ma trận kề tương ứng với biểu đồ đó (giả sử M)
  3. Tính toán Mk

Bây giờ, bạn có thể sử dụng ma trận cuối cùng để trả lời tất cả các truy vấn. Nếu bạn có thể lưu trữM,M2,M4,Msố 8Giáo dục vv Bạn có thể trả lời cho phạm vi lớn hơn của k thay vì cố định k, tất nhiên người ta sẽ trả ở đây với chi phí nhân ma trận.


Đây là một thủ tục khá ngây thơ, phải không? Tính toán tất cả các khoảng cách theo cặp và thực hiện tìm kiếm theo chiều rộng đầu tiên đến độ sâukđã hiệu quả hơn
Raphael

Tôi giả sử rằng bạn có nghĩa là tìm kiếm đầu tiên theo chiều rộng trong biểu đồ được xây dựng ở trên. Trong trường hợp đó, bạn sẽ thực hiện tìm kiếm cho mọi truy vấn bạn làm. Điều đó sẽ không tốt hơn liệt kê (mà bạn đã chỉ định trong câu hỏi mà bạn không muốn làm). Trong bài trả lời của tôi ở trên, tôi tính toánMknhư một bước tiền xử lý, phải được thực hiện chỉ một lần. Sau đó, đối với mỗi truy vấn, người ta chỉ cần đi qua một hàng / cột của ma trận đó, do đó cho thời gian phản hồi nhanh hơn.
TenaliRaman

1
Chà, cả hai cách đều có thể che giấu nỗ lực "thực sự" của họ là tiền xử lý. Lưu ý rằngM lớn theo cấp số nhân n, vì vậy "chỉ cần đi qua một hàng / cột" là không hiệu quả. Tự tính toán khoảng cách không phải là nút cổ chai ở đây. (Bạn sẽ cầnΣTôi= =1kMTôi, nhân tiện.)
Raphael

Thực ra Mchỉ là num_words x num_words. Ngoài ra, nó là boolean và có thể rất thưa thớt. Bạn có thấy tại sao không?
TenaliRaman

Có và không. Skchứa tất cả các từ gần và có nhiều từ theo cấp số nhân, nghĩa lànum_words = =2m. Tôi chỉnh sửa câu hỏi để làm rõ.
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.