Tìm đảo chữ thú vị


31

Nói rằng b 1 b 2 ... b n là hai chuỗi có cùng chiều dài. Một anagramming của hai chuỗi là một ánh xạ song ánh p : [ 1 ... n ] [ 1 ... n ] như vậy mà một i = b p ( i ) cho mỗi i .a1a2anb1b2bnp:[1n][1n]ai=bp(i)i

Có thể có nhiều hơn một đảo chữ cho cùng một chuỗi. Ví dụ: Nếu `abcab` và b = chúng ta có p 1 [ 1 , 2 , 3 , 4 , 5 ] [ 4 , 5 , 1 , 2 , 3 ]p 2 [ 1 , 2 , 3 , 4 , 5 ] [ 2 , 5 , 1a=b=cababp1[1,2,3,4,5][4,5,1,2,3] , trong số những người khác.p2[1,2,3,4,5][2,5,1,4,3]

Chúng ta sẽ nói rằng trọng số của một đảo chữ p là số lần cắt mà người ta phải thực hiện trong chuỗi đầu tiên để có được các đoạn có thể được sắp xếp lại để có được chuỗi thứ hai. Chính thức, đây số lượng các giá trị của i [ 1 ... n - 1 ]p ( i ) + 1 p ( i + 1 ) . Nghĩa là, nó là số điểm mà tại đó p nào không tăng bằng ví dụ chính xác 1.For, w ( pw(p)pi[1n1]p(i)+1p(i+1)p w ( p 2 ) = 4 , vì p 1 cắtmột lần, vào các khốivàvà p 2 cắtbốn lần, thành năm khối.w(p1)=1w(p2)=4p11234512345p212345

Giả sử tồn tại đảo chữ cho hai chuỗi b . Sau đó, ít nhất một đảo chữ phải có trọng lượng ít nhất. Hãy nói điều này là nhẹ nhất . (Có thể có nhiều đảo chữ nhẹ nhất; Tôi không quan tâm vì tôi chỉ quan tâm đến trọng lượng.)ab

Câu hỏi

Tôi muốn một thuật toán, đưa ra hai chuỗi có đảo chữ tồn tại, mang lại hiệu quả chính xác trọng lượng của đảo chữ nhẹ nhất trong hai chuỗi. Sẽ ổn thôi nếu thuật toán cũng mang lại hiệu ứng đảo chữ nhẹ nhất, nhưng không cần.

Đây là một vấn đề khá đơn giản để tạo ra tất cả các đảo chữ và cân chúng, nhưng có thể có nhiều, vì vậy tôi thích một phương pháp tìm trực tiếp đảo chữ cái.


Động lực

Lý do vấn đề này được quan tâm là như sau. Nó rất dễ dàng để làm cho máy tính tìm kiếm từ điển và tìm đảo chữ, cặp từ có chứa chính xác cùng một chữ cái. Nhưng nhiều đảo chữ được sản xuất là không thú vị. Chẳng hạn, các ví dụ dài nhất được tìm thấy trong Từ điển quốc tế thứ hai của Webster là:

cholecystoduodenostomy
duodenocholecystostomy

Vấn đề phải rõ ràng: đây là không thú vị vì họ thừa nhận một anagramming rất nhẹ mà chỉ đơn giản trao đổi các cholecysto, duedenostomyphần, đối với một trọng lượng 2. Mặt khác, ví dụ ngắn hơn nhiều này là nhiều hơn đáng ngạc nhiên và thú vị:

bờ biển
cắt

Ở đây, đảo chữ nhẹ nhất có trọng lượng 8.

Tôi có một chương trình sử dụng phương pháp này để xác định vị trí các đảo chữ thú vị, cụ thể là các chương trình mà tất cả các đảo chữ có trọng lượng cao. Nhưng nó thực hiện điều này bằng cách tạo và cân tất cả các đảo chữ có thể, chậm.


Vì tò mò, làm thế nào để bạn tìm thấy các cặp đảo chữ? Bạn có thực hiện tìm kiếm brute-force trong tất cả các từ có cùng độ dài không? O(n2)
Pedro

4
Tất nhiên là không rồi. Bạn chuyển đổi từng từ thành một hình thức chính tắc có cùng các chữ cái theo thứ tự bảng chữ cái. (Ví dụ: dạng chính tắc cholecystoduodenostomyccddeehlmnooooossttuyy.) Hai từ là đảo chữ khi và chỉ khi chúng có cùng dạng chính tắc. Bạn lưu trữ các từ trong bảng băm, được khóa bởi các hình thức chính tắc của chúng và bất cứ khi nào bạn tìm thấy một sự va chạm, bạn có một đảo chữ cái.
Đánh dấu Dominus

Bây giờ tôi có một lượng lớn thông tin liên quan ít nhiều về điều này trên blog của mình: (α) (β) (γ) (δ)
Mark Dominus

Câu trả lời:


21

Vấn đề này được gọi là sự cố phân vùng chuỗi tối thiểu phổ biến của Google. (Chính xác hơn, câu trả lời trong vấn đề phân vùng chuỗi chung tối thiểu bằng với câu trả lời trong vấn đề của bạn cộng với 1.) Thật không may, đó là NP-hard, ngay cả với hạn chế là mỗi chữ cái xuất hiện nhiều nhất hai lần trong mỗi chuỗi đầu vào, như được chứng minh bởi Goldstein, Kilman và Zheng [GKZ05]. Điều này có nghĩa là không tồn tại thuật toán đa thức thời gian trừ khi P = NP. (Tất nhiên, nếu mỗi chữ cái xảy ra nhiều nhất một lần, thì vấn đề là không đáng kể vì chỉ có một đảo chữ.)

Về mặt tích cực, các tác giả tương tự [GKZ05] đưa ra thuật toán xấp xỉ 1.1037 thời gian đa thức theo cùng một hạn chế. ( Thuật toán xấp xỉ 1.1037- thuật toán có nghĩa là thuật toán có thể không đưa ra câu trả lời đúng A nhưng được đảm bảo tạo ra giá trị B sao cho AB 1.1037 A. ) Họ cũng đưa ra thuật toán xấp xỉ 4 thời gian tuyến tính theo hạn chế yếu hơn là mỗi chữ cái xuất hiện nhiều nhất ba lần trong mỗi chuỗi đầu vào.

[GKZ05] Avraham Goldstein, Petr Kolman và Jie Zheng. Vấn đề phân vùng chuỗi tối thiểu phổ biến: Độ cứng và xấp xỉ. Tạp chí điện tử của Combinatorics , 12, bài viết R50, 2005. http://www.combinatorics.org/ojs/index.php/eljc/article/view/v12i1r50



9

Đây là phần tiếp theo câu trả lời của Tsuyoshi Ito ở trên , tóm tắt phần có liên quan nhất của bài báo GKZ05 mà ông đã trích dẫn.

Bài viết chứng minh giảm vấn đề Tập hợp độc lập tối đa ( MIS ). Xây dựng đồ thị có các đỉnh là các cặp ( i , j ) sao cho a i = b ja i + 1 = b j + 1 . Đỉnh Connect ( i , j )( k , ) (trong đó i k ) với một cạnh bất cứ khi nào nó là không thể mà một anagramming có thể lập bản đồ tất cả các iG(i,j)ai=bjai+1=bj+1(i,j)(k,)ik i + 1 j + 1 k k + 1 + 1 . Điều này rất dễ phát hiện; một ánh xạ như vậy là không thể chính xác nếu một trong những điều sau đây:iji+1j+1kk+1+1

  1. j i=kj
  2. k + 1 i+1=kj+1
  3. { j , j + 1 } tách rời khỏi { , + 1 }i+1<k{j,j+1}{,+1}

Giả sử đồ thị kết quả có tập kích thước độc lập tối đa s . Khi đó trọng lượng đảo chữ tối thiểu chính xác là n - s - 1 , trong đó n là độ dài của chuỗi ab . (Converse cũng giữ: một đảo chữ có trọng lượng thấp chuyển trực tiếp thành một MIS lớn cho G. Để biết chi tiết, xem trang 4.Gsns1nabG

yttrioustouristyouriououriris=2y|t|t|ri|ou|st|ou|ri|s|t|y

Mặt khác, xem xét deratertreader. Lần này đồ thị có ba đỉnh:

  1. DErater + treaDEr
  2. dERater + treadER
  3. deratER + treadER

s=2der|a|t|e|rt|r|e|a|der


2
Cảm ơn bạn đã theo dõi bài viết, nhưng đây không phải là bằng chứng về sự hoàn thiện NP của vấn đề của bạn. Để chứng minh tính đầy đủ NP của vấn đề của bạn, bạn phải giảm một số vấn đề hoàn thành NP đã biết đối với vấn đề của bạn và đó là Định lý 2.2 của [GKZ05]. Những gì bạn trình bày ở đây (Bổ đề 1.1 của [GKZ05]) là sự giảm theo hướng ngược lại.
Tsuyoshi Ito

Đây là một cải cách tốt đẹp. Một thay đổi nhỏ đó là một sự đơn giản hóa nhỏ về mặt khái niệm (ít nhất là đối với tôi): thay vì vẽ các cạnh giữa các cặp không tương thích và yêu cầu tập hợp độc lập tối đa, chúng ta có thể vẽ các cạnh giữa các cặp tương thích và yêu cầu phân cụm tối đa. (Tôi thấy dễ dàng hơn khi nghĩ về "số lượng cặp tối đa chúng ta có thể giữ cùng nhau".)
ShreevatsaR

2

Nó không bao gồm thuật toán chính xác mà bạn có trong đầu ( câu trả lời của Tsuyoshi Ito ), nhưng cố gắng giải quyết vấn đề cơ bản của việc tìm kiếm các đảo chữ "thú vị" ...

Suy nghĩ đầu tiên của tôi là sử dụng một số biến thể về khoảng cách chỉnh sửa, trong đó các thay đổi nguyên tử được tính theo "tính thú vị" của chúng thay vì trọng số "khó khăn" hay "khó hiểu" thông thường. Tất nhiên, có vẻ như bạn không thể mã hóa hiệu quả các biến đổi thực sự thú vị theo cách này, vì chúng có khả năng không phải là cục bộ và do đó gặp phải các vấn đề hoàn chỉnh NP của MIS, v.v.

Vì vậy, suy nghĩ thứ hai sẽ là xây dựng sự liên kết giữa các chữ cái giữa các từ (sắp xếp bản dịch máy), và sau đó tự chấm điểm cho sự phù hợp cho "sự thú vị" (ví dụ: đếm các cách sắp xếp các chữ cái liền kề thành không các chữ cái liền kề, hoặc có bao nhiêu cách sắp xếp mỗi chữ cái chéo, v.v ... và sau đó kết hợp tất cả chúng thông qua mô hình loglinear hoặc như vậy).

Ý tưởng thứ ba là từ bỏ hoàn toàn việc nhìn vào cấu trúc của chính đảo chữ, và thay vào đó hãy nhìn vào ngữ nghĩa của các từ. Thông thường những gì làm cho một đảo chữ "thú vị" là sự không thống nhất giữa ý nghĩa của các từ liên quan. Vì vậy, hãy thử một cái gì đó như tính toán khoảng cách của họ trong WordNet, hoặc tương tự.


0

Vấn đề có thể được diễn đạt theo các nhóm hoán vị .

Bây giờ một nhóm hoán vị chứa tất cả các "chuyển động đảo chữ", cả nguyên thủy (hoán đổi hai chữ cái) và tổng hợp các chuỗi các bước di chuyển nguyên thủy. Có vẻ như bạn chỉ quan tâm đến một tập hợp con của các hoán vị có thể. Tôi sẽ cố gắng xác định những điều này.

Đầu tiên, nhớ lại ký hiệu cho hoán vị, cụ thể là ký hiệu chu kỳ :

  • ()
  • (1)
  • (12)
  • (123)
  • và vì vậy một

Những "chu trình" đơn giản này được sáng tác để mô tả các hoán vị phức tạp hơn.

n

  • (12)
  • (a b)(a+1 b+1)a>0b<a+1b+1n
  • ...
  • (a b)(a+1 b+1)(a+i1 b+i1)a>0a+i1bb+i1n

Những động thái này tạo thành cơ sở cho thuật toán của bạn. Điều bạn quan tâm là tìm ra chuỗi nhỏ nhất của những động thái này để chuyển từ một từ sang từ tiếp theo.

Tôi không biết bất kỳ thuật toán nào để tính toán điều này, ngoài việc tìm kiếm vũ phu, nhưng ít nhất bây giờ có một mô tả rõ ràng hơn (tôi hy vọng) về những bước di chuyển nguyên thủy là gì. (Và có lẽ một số nhà lý thuyết nhóm trong số chúng ta có thể chỉ ra một thuật toán thích hợp.)


1
Cảm ơn. Có lẽ tôi đang bi quan, nhưng dường như cách tiếp cận này sẽ khó khăn. Tôi không nghĩ rằng một cách tiếp cận lý thuyết nhóm sẽ mang lại kết quả trừ khi trước tiên chúng ta tìm ra nhóm hoán vị nào là mối quan tâm và điều đó thay đổi tùy thuộc vào chuỗi đầu vào. Tôi nghĩ rằng đại diện hiệu quả của các nhóm hữu hạn là một vấn đề cực kỳ sâu sắc và phong phú. Nhưng tôi muốn bị nhầm lẫn.
Đánh dấu Dominus

1
Điều mà bạn quan tâm là tìm ra chuỗi nhỏ nhất của những động tác này để chuyển từ một từ sang từ tiếp theo. Tôi không nghĩ rằng điều này là chính xác. Ví dụ: nếu n = 4, hoán đổi (1 2) có trọng số 2, nhưng hoán đổi (2 3) có trọng số 3. Cách đếm của bạn không phân biệt hai loại này.
Tsuyoshi Ito

Tôi trả lời vào đêm khuya. Tôi đã không hiểu chính xác số đo cân nặng. Thực tế, tôi không hiểu nó bây giờ. Tôi mặc dù bạn muốn cho phép di chuyển các khối chữ cái, đó là lý do tại sao tôi gặp phải tất cả những rắc rối khi xác định các nguyên thủy này. Câu trả lời của tôi có thể cung cấp nguồn cảm hứng, vì vậy tôi sẽ bỏ nó, mặc dù nó sai.
Dave Clarke

0

Đối với cholecystoduodenostomy / duodenocholecystostome, tôi nhận thấy rằng nếu bạn chỉ định một số cho mỗi ký tự mô tả số lượng nó đã được di chuyển như một delta, bạn sẽ có một số thứ như 7 7, sau đó 8-7, sau đó là 6 0. Điều đó là không đúng bởi vì một số ký tự có thể đã được lặp lại (c thứ hai chỉ di chuyển về phía trước 2, không quay lại 7), v.v. nhưng vẫn rất "chạy được mã hóa chiều dài" bởi vì bạn thấy các đồng bằng tương tự trong một hàng.

So sánh với đường bờ biển / mặt cắt, nơi bạn thấy một cái gì đó như (+2) (+ 5) (+ 5) (- 3) (- 1) (+ 3) .... ít hơn "chạy theo chiều dài mã hóa".

Có lẽ sự ngẫu nhiên của đồng bằng có thể cho bạn một "điểm số" như thế nào là đảo chữ thú vị?

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.