Làm thế nào khó khăn là xáo trộn một chuỗi?


117

Việc xáo trộn hai chuỗi được hình thành bằng cách xen kẽ các ký tự thành một chuỗi mới, giữ các ký tự của mỗi chuỗi theo thứ tự. Ví dụ, MISSISSIPPIlà một sự xáo trộn của MISIPPSSISI. Hãy để tôi gọi một chuỗi vuông nếu nó là một chuỗi hai chuỗi giống nhau. Ví dụ, ABCABDCDlà hình vuông, bởi vì nó là sự xáo trộn của ABCDABCD, nhưng chuỗi ABCDDCBAkhông phải là hình vuông.

Có một thuật toán nhanh để xác định xem một chuỗi là hình vuông hay là NP-hard? Phương pháp lập trình động rõ ràng dường như không hoạt động.

Ngay cả các trường hợp đặc biệt sau đây cũng có vẻ khó: (1) chuỗi trong đó mỗi ký tự xuất hiện tối đa bốn sáu lần và (2) chuỗi chỉ có hai ký tự riêng biệt. Như Per Austrin chỉ ra dưới đây, trường hợp đặc biệt trong đó mỗi nhân vật xuất hiện tối đa bốn lần có thể giảm xuống còn 2SAT.


Cập nhật: Vấn đề này có một công thức khác có thể làm cho một bằng chứng độ cứng dễ dàng hơn.

Xét đồ thị G có các đỉnh là các số nguyên từ 1 đến n; xác định mỗi cạnh với khoảng thực giữa các điểm cuối của nó. Chúng ta nói rằng hai cạnh của G được lồng nhau nếu một khoảng đúng chứa khoảng kia. Ví dụ, các cạnh (1,5) và (2,3) được lồng nhau, nhưng (1,3) và (5,6) thì không, và (1,5) và (2,8) thì không. Khớp trong G không được lồng nếu không có cặp cạnh nào được lồng. Có một thuật toán nhanh để xác định xem G có khớp hoàn hảo không lồng nhau không, hay đó là vấn đề NP-hard?

  • Xáo trộn một chuỗi tương đương với việc tìm kiếm một kết hợp hoàn hảo không lồng nhau trong một liên kết rời rạc (có các cạnh giữa các ký tự bằng nhau). Cụ thể, việc xáo trộn một chuỗi nhị phân tương đương với việc tìm kiếm một kết hợp hoàn hảo không lồng nhau trong một liên kết rời rạc của hai cụm. Nhưng tôi thậm chí không biết vấn đề này là khó đối với các biểu đồ chung hay dễ đối với bất kỳ lớp biểu đồ thú vị nào.

  • Có một thuật toán đa thức thời gian dễ dàng để tìm ra các kết hợp không giao nhau hoàn hảo .


Cập nhật (ngày 24 tháng 6 năm 2013): Vấn đề đã được giải quyết! Hiện tại có hai bằng chứng độc lập xác định chuỗi vuông là NP-Complete.

Ngoài ra còn có một bằng chứng đơn giản hơn cho thấy việc tìm kiếm các kết hợp hoàn hảo không lồng nhau là NP-hard, do Shuai Cheng Li và Ming Li vào năm 2009. Xem " Về hai vấn đề mở của các mẫu 2 khoảng ", Khoa học máy tính lý thuyết 410 (24 Thay25 ): 2410 Vang2423, 2009.


2
Không phải chuỗi chỉ là A000984, "số lượng giá trị có thể có của số nhị phân bit 2 * n trong đó một nửa bit được bật và một nửa bị tắt"?
Travis Brown

5
@Travis, trừ khi tôi hiểu nhầm: Với n = 4, 10000111 là số nhị phân bit 2 * n trong đó một nửa bit được bật và một nửa bị tắt, nhưng không phải là một hình vuông, như được định nghĩa. Theo logic đó, vì hình vuông là một tập hợp con nghiêm ngặt của tập hợp tạo ra A000984, các giá trị cho hình vuông trên bảng chữ cái nhị phân nên thấp hơn ở các chỉ số bằng nhau thông qua chuỗi - không?
Daniel Apon

1
Quan sát: Sử dụng biểu thức chính thức của đồ thị, gọi 2n là số đỉnh trong G. Gọi G ′ là đồ thị thu được từ biểu đồ đường của G bằng cách thêm các cạnh giữa các đỉnh tương ứng với các cạnh được lồng của G. một bộ độc lập có kích thước n. Có nhiều loại biểu đồ khác nhau trong đó một tập độc lập tối đa có thể được tính thời gian đa thức. Nếu chúng ta đi theo con đường này, câu hỏi là: G có những tính chất tốt nào? (còn nữa)
Tsuyoshi Ito

2
@Radu: Tôi không nghĩ tỷ lệ hình vuông thành không hình vuông (trên bảng chữ cái nhị phân) hội tụ đến 1/3. Tôi đã thực hiện một số mô phỏng Monte-Carlo cho thấy tốc độ hội tụ chậm đến 1/2. Do đó trong giới hạn về cơ bản tất cả các chuỗi nhị phân có số chẵn 0 và 1 là hình vuông. Điều này là đáng ngạc nhiên đối với tôi, và có thể được khai thác trong một thuật toán. Đối với bảng chữ cái lớn hơn, tỷ lệ hình vuông dường như hội tụ về 0 nhanh chóng.
Martin Berger

8
Vì câu hỏi này được đề cập trong bài đăng trên blog ngày hôm nay, hãy xem liệu chúng ta có thể nhận được một số quan tâm mới trong việc giải quyết vấn đề này không. Đã một năm kể từ khi câu hỏi này được đưa ra và chúng tôi đã có được rất nhiều người dùng mới kể từ đó. Tôi đã đưa ra một khoản tiền thưởng 100 rep cho câu hỏi.
Alex ten Brink

Câu trả lời:


66

Michael Soltys và tôi đã thành công trong việc chứng minh rằng vấn đề xác định xem một chuỗi có thể được viết dưới dạng xáo trộn vuông hay không là NP hoàn chỉnh. Điều này áp dụng ngay cả trên một bảng chữ cái hữu hạn chỉ có ký hiệu riêng biệt, mặc dù bằng chứng của chúng tôi được viết cho một bảng chữ cái có ký hiệu. Câu hỏi này vẫn mở cho các bảng chữ cái nhỏ hơn, chỉ có ký hiệu. Chúng tôi đã không xem xét vấn đề theo giới hạn rằng mỗi biểu tượng chỉ xuất hiện lần (hay nói chung hơn là số lần không đổi); Vì vậy, câu hỏi vẫn còn mở.9 2 67926

Bằng chứng sử dụng giảm từ -Partition. Quá dài để đăng ở đây, nhưng một bản in lại, "Giải mã chuỗi là -hard", có sẵn từ các trang web của chúng tôi tại:NP3NP

http://www.math.ucsd.edu/~sbuss/ResearchWeb/Shuffle/

http://www.cas.mcmaster.ca/~soltys/#Papers .

Bài viết đã được công bố trên Tạp chí Khoa học Hệ thống Máy tính:

http://www.scTHERirect.com/science/article/pii/S002200001300189X


11
Tuyệt vời!! (Và với sự nhẹ nhõm to lớn của tôi, không nghiêm túc .)
Jeffε

15
Cảm ơn. StackExchange là nguồn của chúng tôi cho câu hỏi này. Đó là một nguồn tài nguyên tuyệt vời!
Sam Buss

9
@SamBuss một yêu cầu nhỏ: trong khi bạn trích dẫn câu hỏi của Jeff, bạn chỉ đề cập đến giải pháp của Per Austrin trong văn bản. Nếu bạn nhìn vào câu trả lời, có một cách để tạo ra một trích dẫn chính thức cho câu trả lời (nhấp vào nút chia sẻ và nhấn vào liên kết 'trích dẫn'). Theo cách đó, bạn cũng có thể tạo một trích dẫn thích hợp cho câu trả lời của Per. Tôi chỉ đề cập đến điều này để những người đóng góp chính thức trên trang web cũng có thể được công nhận chính thức. Cảm ơn ! và chúc mừng vì đã giải quyết vấn đề này
Suresh Venkat

2
@SureshVenkat. Cảm ơn vì lời khuyên: điều này rất hữu ích. Tôi đã thêm nó vào phiên bản trực tuyến của bài báo.
Sam Buss

Vấn đề nhận biết shuffle vuông hiện đã được chứng minh là khó ngay cả trên bảng chữ cái nhị phân: scTHERirect.com/science/article/pii/S0304397519300258
a3nm

58

Đối với trường hợp đặc biệt mà bạn đề cập khi mỗi nhân vật xuất hiện nhiều nhất bốn lần, có một mức giảm đơn giản thành 2-SAT (trừ khi tôi thiếu thứ gì đó ...), như sau:

Điểm cốt yếu là đối với mỗi nhân vật, có (nhiều nhất) hai cách hợp lệ phù hợp với sự xuất hiện của nhân vật (khả năng thứ ba sẽ được lồng vào nhau). Sử dụng một biến boolean để biểu thị cái nào trong hai khớp được chọn. Bây giờ, một phép gán cho các biến này cung cấp một chuỗi xáo trộn hợp lệ của chuỗi iff cho mỗi cặp cạnh được lồng, không phải cả hai đều được chọn. Điều kiện này có thể được mô tả chính xác bằng cách phân biệt các biến (có thể bị phủ định) tương ứng với hai ký tự liên quan.


Đẹp. Ý tưởng tương tự khái quát thành các chuỗi trong đó mỗi ký tự xuất hiện nhiều nhất sáu lần, nhưng kết quả là một ví dụ của 5-SAT. :-(
Jeffε

2
Câu trả lời này là yêu thích để giành được tiền thưởng.
Jeffε

Vì vậy, điều này dường như chứng minh vấn đề là NPC và tại sao chúng ta cần bằng chứng dài hạn của hội nghị và tạp chí?
T ....

@Turbo Rất muộn màng, nhưng điều này không chứng minh được vấn đề là NPC vì 2-SAT không phải là NPC; nó ở P.
Steven Stadnicki

Điều này có giảm xuống 2-SAT không nếu kích thước Bảng chữ cái không bị ràng buộc?
Mohammad Al-Turkistany

11

Đây là một thuật toán có thể có một số cơ hội chính xác mặc dù có vẻ khó để chứng minh và tôi sẽ không đặt cược ngôi nhà vào nó ...

Hãy để chúng tôi nói rằng được thanh lọc nếu với mọi cạnh e , tồn tại một kết hợp hoàn hảo (có thể lồng nhau) của G sử dụng e và không sử dụng bất kỳ cạnh nào có trong hoặc chứa e .GeGee

Thật dễ dàng để kiểm tra nếu bị thanh trừng và nếu không tìm thấy các cạnh vi phạm. Rõ ràng không có cạnh nào trong số các cạnh vi phạm này có thể được sử dụng trong kết hợp hoàn hảo không lồng nhau của G , vì vậy có thể loại bỏ chúng khỏi sự cân nhắc. Lặp lại quá trình này, chúng ta thu được một sơ đồ con được thanh lọc (duy nhất) của G có một kết hợp hoàn hảo không lồng nhau mà iff G có.GGGG

Bây giờ đến bước nhảy vọt của đức tin, mà có thể hoặc không có thể đúng: hy vọng là trong một đồ thị thanh lọc, nếu vẫn còn đỉnh của mức độ , chúng ta có thể thực hiện lựa chọn tham lam và phù hợp với ví dụ đầu tiên đỉnh để người hàng xóm đầu tiên (hoặc tương đương, loại bỏ các cạnh cho tất cả các hàng xóm khác của nó).>1

Sau khi lựa chọn tham lam, chúng tôi sẽ lọc lại biểu đồ, v.v. và quá trình kết thúc khi biểu đồ (hy vọng) là một kết hợp hoàn hảo không lồng nhau.

Lúc đầu, tôi nghĩ rằng điều này gần giống như có một cái nhìn nhỏ về phía trước trong thuật toán tham lam và không thực sự hiệu quả, nhưng tôi thấy thật khó để đưa ra một ví dụ điển hình.


Tôi nghi ngờ về giai đoạn tham lam thứ hai, nhưng làm sạch biểu đồ có vẻ hữu ích. Trong bối cảnh chuỗi ban đầu, trong đó biểu đồ là sự kết hợp rời rạc của các cụm, bạn có thể nói gì về cấu trúc của biểu đồ thanh trừng không? Có phải nó vẫn là một liên minh rời rạc? (Nói cách khác, bạn có thể phân vùng các lần xuất hiện của từng ký tự trong chuỗi đầu vào để các ký tự ở các phần khác nhau không thể khớp được không?)
Jeffε

2
Đối với câu hỏi thứ hai, hãy xem xét chuỗi 'aaaa'. Purging nó loại bỏ các cạnh 1-4 và 2-3, cho 4 chu kỳ. Hai biến thể của bước tham lam thứ hai cũng đủ và tôi không thể tìm thấy bất kỳ mẫu đối lập nào là: 1) Một biểu đồ thanh trừng có một kết hợp hoàn hảo không lồng nhau nếu nó có một kết hợp hoàn hảo (điều này dường như không thể so sánh với bước tham lam) . 2) Trong một biểu đồ được thanh lọc với kết hợp hoàn hảo không lồng nhau, mọi cạnh được sử dụng trong một số kết hợp hoàn hảo không lồng nhau (điều này mạnh hơn cả bước tham lam và mục đầu tiên nên dễ bị từ chối hơn).
Per Austrin

11

Giải pháp mà Sam Buss và tôi đã đề xuất vào tháng 11 năm 2012 (cho thấy việc xáo trộn một hình vuông trong NP-hard bằng cách giảm từ 3-Phân vùng) hiện là một bài báo được xuất bản trên Tạp chí Khoa học Hệ thống Máy tính:

http://www.scTHERirect.com/science/article/pii/S002200001300189X


2
Đây thực sự phải là một chỉnh sửa cho câu trả lời trước đó của Sam Buss, chứ không phải là một câu trả lời riêng biệt. Bạn có thể nhấp vào "chỉnh sửa" để đề xuất chỉnh sửa cho câu trả lời của người khác và chỉnh sửa của bạn sẽ được xem xét bởi những người dùng khác của trang web.
DW

11

Romeo Rizzi và Stéphane Vialette chứng minh rằng việc nhận ra các chuỗi vuông là NP hoàn chỉnh trong bài báo năm 2013 của họ " Về việc nhận ra các từ đó là bình phương cho sản phẩm xáo trộn ", bằng cách giảm từ vấn đề nhị phân dài nhất. Họ nói rằng sự phức tạp của việc xáo trộn một chuỗi nhị phân vẫn còn mở.

Một bằng chứng đơn giản hơn nữa cho thấy việc tìm kiếm kết hợp hoàn hảo không lồng nhau là NP-hoàn chỉnh được đưa ra bởi Shuai Cheng Li và Ming Li trong bài báo năm 2009 của họ " Về hai vấn đề mở của các mẫu 2 khoảng ". Tuy nhiên, họ sử dụng thuật ngữ được thừa hưởng từ tin sinh học. Thay vì "kết hợp không lồng nhau hoàn hảo", họ gọi đó là "vấn đề DIS-2-IP- ". Sự tương đương giữa hai vấn đề được mô tả bởi Blin, Fertin và Vialette :{<,}

Vấn đề 2-IP-DIS- có công thức ngay lập tức về các đối sánh bị ràng buộc trong các biểu đồ chung: Cho một đồ thị cùng với thứ tự tuyến tính của các đỉnh của , 2-IP -DIS- vấn đề tương đương với việc tìm một số lượng thẻ tối đa khớp với trong với thuộc tính cho bất kỳ hai cạnh khác biệt và của cũng không và cũng không{<,}GπG{<,}MG{u,v}{u,v}Mmin{π(u),π(v)}<min{π(u),π(v)}max{π(u),π(v)<max{π(u),π(v)}min{π(u),π(v)}<min{π(u),π(v)} và xảy ra.max{π(u),π(v)}<max{π(u),π(v)}

Cập nhật (ngày 25 tháng 2 năm 2019): Bulteau và Vialette đã chỉ ra rằng vấn đề quyết định xáo trộn chuỗi nhị phân là NP-đầy đủ trong bài báo của họ, Nhận ra hình vuông xáo trộn nhị phân là NP-hard .


Tôi không thấy kết nối và tôi không thấy các tác giả cho rằng việc xáo trộn một chuỗi tương đương với vấn đề của họ.
Suresh Venkat

2
Họ không nói nó tương đương với việc xáo trộn; đó là một vấn đề chung hơn.
Jeffε

@SureshVenkat Tôi đã chỉnh sửa câu trả lời của mình, tôi hy vọng nó rõ ràng hơn. Về cơ bản, những gì họ đang nói trong phần chú thích là bất kỳ hai cạnh nào trong phần khớp ( ) đều không được lồng nhau. M
Mohammad Al-Turkistany

Trong phiên bản được xuất bản thực tế, sự tương đương được nêu trong trang 320. Books.google.com/,
Mohammad Al-Turkistany

Chỉnh sửa để un chôn các lede .
Jeffε

9

7
Tham khảo tốt đẹp. Thật khó để xem kết quả sẽ áp dụng như thế nào cho vấn đề của tôi, nhưng có lẽ các kỹ thuật sẽ giúp ích. Thật dễ dàng để biết liệu một chuỗi X đã cho có phải là sự xáo trộn của hai bản sao của một chuỗi Y đã cho hay không. Bài báo đính kèm chứng minh rằng NP-hard có thể quyết định xem một chuỗi X đã cho có xáo trộn bất kỳ số lượng bản sao nào của một chuỗi Y đã cho hay không. Tôi muốn biết liệu một chuỗi X đã cho có phải là sự xáo trộn của hai bản sao của MỘT SỐ chuỗi UNKNOWN Y.
Jeffε

5

KHÔNG BAO GIỜ TỐI THIỂU, TRẢ LỜI NÀY SAU. Nó không thành công khi nhập "AABAAB": tham lam khớp hai chữ A đầu tiên với nhau khiến cho không thể khớp các ký hiệu còn lại. Tôi bỏ nó đi thay vì xóa nó để giúp người khác tránh mắc lỗi tương tự.

Đối với tôi, dường như luôn an toàn để khớp từng nhân vật kế tiếp của hình vuông được cho là tham lam với một nhân vật bình đẳng khác ở vị trí càng sớm càng tốt. Đó là, tôi nghĩ rằng thuật toán thời gian tuyến tính sau đây sẽ hoạt động:

Lặp lại qua từng vị trí i trong chuỗi đầu vào, i = 0, 1, 2, ... n. Đối với mỗi vị trí i, kiểm tra xem vị trí đó đã được khớp với một số vị trí trước đó trong chuỗi chưa. Nếu không, khớp nó với một ký tự bằng nhau xuất hiện sau vị trí đã khớp cuối cùng và càng sớm càng tốt trong chuỗi. Nếu không tìm thấy kết quả khớp cho một số ký tự, hãy khai báo rằng đầu vào không phải là hình vuông; mặt khác, nó là tập hợp các ký tự trong cặp đầu tiên của mỗi trận đấu.

Đây là Python.

def sqrt (S):
    trận đấu = []
    i, j = 0, 0
    trong khi tôi <len (S):
        if j <len (khớp) và khớp [j] [1] == i:
            tôi + = 1
            j + = 1
            tiếp tục
        nếu phù hợp:
            k = khớp [-1] [1] + 1
        khác:
            k = 1
        trong khi k <len (S) và S [k]! = S [i]:
            k + = 1
        nếu k> = len (S):
            nâng cao ngoại lệ ("Không phải hình vuông")
        trận đấu.append ((i, k))
        tôi + = 1
    trả về "" .join (S [a] cho a, b trong các trận đấu)

in sqrt ("ABCABDCD")

Ở đây i là biến vòng lặp chính (vị trí chúng ta đang cố khớp), j là một con trỏ vào mảng các cặp được khớp để tăng tốc độ kiểm tra xem vị trí i đã khớp chưa và k là chỉ mục được sử dụng để tìm kiếm nhân vật phù hợp với một ở vị trí i. Đó là thời gian tuyến tính bởi vì i, j và k đang tăng đơn điệu thông qua chuỗi và mỗi lần lặp vòng lặp bên trong làm tăng một trong số chúng.


4
Đã ở đó. Làm xong mà. :-)
Jeffε

5

Cập nhật: Không có ý nghĩa gì khi nói về khó khăn trong việc tìm kiếm kết hợp hoàn hảo không lồng nhau không giao nhau, khi các nhãn từ 1 đến n, vì chỉ có một như vậy. (Vâng, tôi đang tự đá mình.) Tuy nhiên, nó sẽ có ý nghĩa khi đưa ra một phạm vi lớn hơn trên nhãn ... vì vậy tôi vẫn thấy một số hy vọng, nhưng rốt cuộc nó có thể khá vô nghĩa. Tôi chắc chắn sẽ phải theo dõi điều này thêm một số.


Tôi có thể nghĩ về lý do tại sao có thể khó tìm thấy một kết hợp không lồng nhau không giao nhau. Hãy để tôi gọi một kết hợp như vậy là khớp nhau . Không chắc chắn mức độ này sẽ giúp gì, nhưng hãy để tôi trình bày lý do nào. (Tôi nên chỉ ra rằng lập luận của tôi, vì nó đứng ở đây, không đầy đủ, và chi tiết tôi bỏ qua có thể rất quan trọng. Tuy nhiên, tôi tưởng tượng rằng nó có thể là một cái gì đó bắt đầu.)

Tôi sẽ bắt đầu với một vấn đề hơi khác. Cho một đồ thị có các cạnh được tô màu bằng màu và các đỉnh được dán nhãn từ đến , có khớp nào khác nhau chứa chính xác một cạnh của mỗi màu không? Vấn đề này có vẻ là NP-hard (đối số cho điều này là đầy đủ và đơn giản - trừ khi tôi thiếu một cái gì đó). Việc giảm phát ra một biểu đồ là một sự kết hợp rời rạc của các nhóm.k 1 nGk1n

Việc giảm là từ các yếu tố rời rạc , một vấn đề hoàn chỉnh NP được giới thiệu trong [1]. Một ví dụ về các yếu tố rời rạc được đưa ra bởi một chuỗi trên một bảng chữ cái có kích thước , và câu hỏi là liệu có các yếu tố rời rạc không, trong đó một yếu tố là một chuỗi con bắt đầu và kết thúc bằng cùng một chữ cái; và hai yếu tố không khớp nhau nếu chúng không chồng chéo trong chuỗi (đặc biệt lưu ý rằng 'lồng nhau', đặc biệt, cũng không được phép).kkk

Hãy để tôi biểu thị bằng , các yếu tố của bảng chữ cái kích thước liên quan đến thể hiện các yếu tố phân biệt. ka1,,akk

Cho một ví dụ về các yếu tố rời rạc, nghĩa là một chuỗi có độ dài , tạo một biểu đồ có đỉnh với các nhãn đỉnh từ đến . Thêm một cạnh giữa các đỉnh và nếu các vị trí tương ứng có cùng chữ cái (giả sử ), và cũng tô màu cạnh bằng màu .n 1 n u v a i ( u , v ) inn1nuvai(u,v)i

Bằng chứng về việc giảm về cơ bản sau các định nghĩa. Với các yếu tố phân biệt , chúng ta rõ ràng có một kết hợp đầy màu sắc -disjoint, chỉ chọn các cạnh như được đưa ra bởi các yếu tố rời rạc, và dễ dàng nhận thấy rằng kết quả khớp vừa có màu sắc vừa rời rạc. Ngược lại, nếu có một kết hợp đầy màu sắc -disjoint, thì chúng ta có các yếu tố phân biệt k, một yếu tố cho mỗi chữ cái, bởi vì kết hợp có nhiều màu sắc (và do đó chọn một yếu tố cho mỗi chữ cái) và không khớp nhau (vì vậy các yếu tố tương ứng sẽ không trùng lặp ).k kkkk

Để loại bỏ màu sắc và làm cho kết hợp hoàn hảo, mặc dù trên phạm vi có thể lớn hơn , hãy thực hiện các sửa đổi sau cho biểu đồ do đó được tạo:

Đặt biểu thị tập hợp con của các đỉnh có nhãn là các vị trí được liên kết với chữ . Nếu có các đỉnh , sau đó thêm các đỉnh mới và tạo ra một đồ thị lưỡng cực hoàn chỉnh giữa và các đỉnh mới được thêm vào. Lặp lại, tất nhiên, cho mỗi chữ cái. a U a A ( A - 2 ) U aUaaUaA(A2)Ua

Nói một cách đơn giản, nếu đồ thị tạo ra một kết hợp hoàn hảo, các đỉnh mới được giới thiệu phải được khớp với các đỉnh của và chúng sẽ bão hòa tất cả trừ một cặp đỉnh và cạnh giữa các đỉnh còn lại sẽ tương ứng với hệ số rời rạc . Tôi đã không tìm ra những con số mà người ta phải liên kết với các đỉnh mới được thêm vào ... lưu ý rằng chúng phải sao cho khớp kết quả là rời rạc. Tôi chỉ có một cảm giác (đọc: hy vọng) rằng nó 'có thể được thực hiện'!Ua

[1] Về các vấn đề không có hạt nhân đa thức , Hans L. Bodlaender, Rodney G. Downey, Michael R. Fellows và Danny Hermelin, J. Comput. Hệ thống. Khoa học.


3
Tôi bối rối. Không phải (1,2), (3,4), (5,6), ..., (n-1, n) CHỈ phù hợp hoàn hảo?
Jeffε

Khi tôi chuyển sang kịch bản 'khớp hoàn hảo', tôi sửa đổi cấu trúc và thêm rất nhiều đỉnh mới (lưu ý rằng tôi thêm | U_a | -2 đỉnh mới cho mỗi a trong bảng chữ cái). Do đó, n sẽ nổ tung tương ứng - khoảng 2n-2k, cho một bảng chữ cái cỡ k. Tôi hy vọng tôi đã làm rõ rằng việc giảm chưa hoàn thành ở chỗ tôi chưa chỉ định những con số nào được phân bổ cho các đỉnh mới, nhưng tôi hy vọng rằng nó có thể được gia hạn mà không gặp quá nhiều khó khăn. Tuy nhiên, tôi chắc chắn phải suy nghĩ về nó một số trước khi tôi có thể nói thêm bất cứ điều gì.
Neeldhara

1
Tôi nghĩ rằng quan điểm của nhận xét của JeffE là rất dễ tìm thấy một kết hợp hoàn hảo không lồng nhau và không giao thoa (hoặc báo cáo sự vắng mặt của nó) bởi vì chỉ có một khả năng.
Tsuyoshi Ito

2
Tôi không nói về nội dung ý tưởng bằng chứng của bạn, nhưng tôi đang nói về câu đầu tiên trong câu trả lời của bạn: Tôi có thể nghĩ tại sao có thể khó tìm được một kết hợp hoàn hảo không lồng nhau và không giao thoa. Nhiệm vụ này dễ dàng vì lý do JeffE viết.
Tsuyoshi Ito

2
Nếu không có ràng buộc về màu sắc được đặt ra bởi vấn đề yếu tố rời rạc (nhiều nhất là một cạnh của mỗi màu), việc tìm kiếm các kết hợp tách rời tối đa cũng dễ dàng.
Jeffε

1

Cách tiếp cận không hiệu quả: phân tách một hình vuông bị xáo trộn bằng cách lấy ra hai chữ cái trùng khớp không dẫn đến hình vuông bị xáo trộn ... Xem bình luận của Radu bên dưới.


Một đề xuất sử dụng Phạm vi Concatenation ngữ pháp (RCGs, xem http://hal.inria.fr/inria-00073347/en/ ): Tôi 'm đã theo ấn tượng rằng RCG đơn giản sau đây nhận của bạn 'xáo trộn hình vuông' ngôn ngữ trên một hữu hạn bảng chữ cái , EDITED sau nhận xét đầu tiên của Radu: trong đó phạm vi trên và biểu thị khoảng trống chuỗi.S ( X Y )Σ

S(XY)A(X,Y)(1)A(aX1,aX2Y1Y2)A(X1,Y1)A(X2,Y2)(2)A(ε,ε)ε(3)
aΣε

Ngữ pháp kiểm tra với vị từ thứ hai rằng nó khớp với một chữ cái từ lần xuất hiện từ đầu tiên với cùng một chữ cái trong lần xuất hiện từ thứ hai. Sau đó, nó đoán làm thế nào để khớp với phần còn lại của các chữ cái đầu tiên còn lại, tức là với một chuỗi con của phần còn lại, cụ thể là . Do đó, mọi thứ trước thuộc về từ đầu tiên; chúng tôi gọi nó là và chúng tôi đoán rằng nó phù hợp với một số hậu tố bắt đầu từ . Lưu ý rằng và có thể chứa các chữ cái từ cả hai phiên bản của từ, nhưng và chỉ chứa các chữ cái từ phiên bản đầu tiên.X1Y1Y1X2Y2Y1Y2X1X2

Ví dụ, đây là một dẫn xuất có thể có của chuỗi của bạn : abcabdcd

S(abcabdcd)A(abc,abdcd)(by 1,X=abc,Y=abdcd)A(bc,bdcd)A(ε,ε)(by 2,X1=bc,Y1=bdcd,X2=Y2=ε)A(c,c)A(d,d)A(ε,ε)(by 2)A(ε,ε)A(ε,ε)A(d,d)A(ε,ε)(by 2)A(ε,ε)A(d,d)A(ε,ε)(by 3)A(d,d)A(ε,ε)(by 3)A(ε,ε)A(ε,ε)A(ε,ε)(by 2)3εi.e. success

Đối với , 0011

S(0011)A(0,011)A(ε,ε)A(1,1)A(1,1)ε

Bây giờ, Boullier cho thấy trong bài báo được liên kết trước đó rằng có một thuật toán thời gian đa thức lập trình động cho RCG, trả lời câu hỏi của bạn nếu ngữ pháp trên chính xác. Ý tưởng là, mặc dù tôi đã trình bày bên trên các biến thể của các biến , , v.v. dưới dạng các chuỗi, chúng thực sự là các khoảng bên trong chuỗi đầu vào, có thể được lập bảng đúng.YXY


Có một dẫn xuất nào đưa S (0011) đến không? (Nên có một cái.)ϵ
Radu GRIGore

Tôi không nghĩ vậy.
Serge Gaspers

Ngoài ra, A (10.011010) -> A (0,101) A (0,0) -> , nhưng tôi tin rằng 10011010 không phải là một hình vuông. ϵ
Radu GRIGore

Cảm ơn đã trả lại; Tôi đã thay đổi ngữ pháp một chút, và thậm chí có một trực giác nhỏ về nó có thể hoạt động.
Sylvain

3
Không có gì. Thêm nữa, về ngữ pháp được cập nhật :) A (00,000110) -> A (0,011) A (0,0) -> , nhưng 00000110 không phải là hình vuông. Ngoài ra, dường như không có đạo hàm cho 100110101010, đó là một hình vuông. ϵ
Radu GRIGore

1

Cập nhật: Như Tsuyoshi Ito đã chỉ ra trong các bình luận, thuật toán này có thời gian chạy theo cấp số nhân.

Bài gốc:

Đây là cách tôi sẽ lập trình điều này trong Thế giới thực.

Chúng tôi được cung cấp một chuỗi S = (S [1], ..., S [n]). Đối với mỗi tiền tố S_r = (S [1], ..., S [r]), có một tập hợp {(T_i, U_i)} của các cặp chuỗi, sao cho S_r là một sự xáo trộn của (T_i, U_i), và T_i là tiền tố của U_i (tức là U_i 'bắt đầu bằng' T_i). Bản thân S_r là một hình vuông khi và chỉ khi tập hợp này chứa một cặp (T_i, U_i) với T_i = U_i.

Bây giờ, chúng ta không cần phải tạo tất cả các cặp này; chúng ta chỉ cần tạo hậu tố V_i của mỗi chuỗi U_i thu được bằng cách xóa bản sao T_i của nó. Điều này sẽ loại bỏ một số lượng trùng lặp không liên quan (có thể theo cấp số nhân). Bây giờ S_r là một hình vuông khi và chỉ khi tập hợp hậu tố này chứa chuỗi rỗng. Vì vậy, thuật toán trở thành:

Initialise: SuffixSet = {<empty string>} ; r = 0
Loop: while (r < n) {
  r = r + 1
  NextSuffixSet = {}
  for each V in SuffixSet {
    if (V[1] == S[r]) Add V[2...] to NextSuffixSet // Remove first character of V
    Add V||S[r] to NextSuffixSet // Append character S[r] to V
    }
  SuffixSet = NextSuffixSet
  }
Now S is a square if and only if SuffixSet contains the empty string.

Chẳng hạn, nếu S là AABAAB:

r=0: SuffixSet = {<empty string>}
r=1: S[r] = A; SuffixSet = {A}
r=2: S[r] = A; SuffixSet = {<empty string>, AA}
r=3: S[r] = B; SuffixSet = {B, AAB}
r=4: S[r] = A; SuffixSet = {BA, AB, AABA}
r=5: S[r] = A; SuffixSet = {BAA, B, ABA, AABAA}
r=6: S[r] = B; SuffixSet = {AA, BAAB, <empty string>, BB, ABAB, AABAAB}

Chúng ta có thể loại bỏ tất cả các hậu tố dài hơn một nửa chuỗi đầu vào, vì vậy điều này đơn giản hóa thành:

r=0: SuffixSet = {<empty string>}
r=1: S[r] = A; SuffixSet = {A}
r=2: S[r] = A; SuffixSet = {<empty string>, AA}
r=3: S[r] = B; SuffixSet = {B, AAB}
r=4: S[r] = A; SuffixSet = {BA, AB}
r=5: S[r] = A; SuffixSet = {BAA, B, ABA}
r=6: S[r] = B; SuffixSet = {AA, <empty string>, BB}

Tôi đã lập trình điều này trong C ++ và nó hoạt động trên tất cả các ví dụ được đưa ra ở đây. Tôi có thể gửi mã, nếu có ai quan tâm. Câu hỏi là: kích thước của Suffixset có thể tăng nhanh hơn đa thức không?


3
Tôi cũng đã thử điều này, nhưng các thí nghiệm cho thấy kích thước của Suffixset dường như tăng theo cấp số nhân trong n nếu chuỗi gốc là (AB) ^ n.
Tsuyoshi Ito

1

EDIT: Đây là một câu trả lời không chính xác.


Sylvain đề xuất một RCG không may không phù hợp với những "ô vuông xáo trộn" này. Tuy nhiên, tôi nghĩ có một (EDIT: không phải RCG, xem bình luận của Kurt bên dưới!) , Trông như sau:

S(Y)A(ϵ,Y)(1)A(X,ZY)A(XZ,Y)(2)A(aX,aY)A(X,Y) for every aΣ(3)A(ϵ,ϵ)ϵ(4)

aabbabab(1,2)(3)(2)

100110101010

S(100110101010)A(ϵ,100110101010)(1)A(1001,10101010)(2)A(01,101010)(3)A(011,01010)(2)A(1,010)(3)A(10,10)(2)A(ϵ,ϵ)(3)ϵ(4)

Tôi đã không đưa ra một bằng chứng chính thức nào cho thấy ngữ pháp này thực sự nắm bắt chính xác các "ô vuông xáo trộn" nhưng nó không quá khó. Sylvain đã đề cập rằng vấn đề quyết định cho RCG là đa thức.


A(x,ϵ)23

5
@DaniCL, Về ý nghĩ thứ hai ... Các tham số trong RHS của quy tắc sản xuất có cần phải nằm trong phạm vi tiếp giáp của đầu vào không? Tôi đã không thấy điều đó được nêu rõ ràng trong định nghĩa trong bài báo Boullier, nhưng dường như đó là cách nó được sử dụng. Trong phân tích thời gian chạy của thuật toán phân tích cú pháp, nó nói rằng số lượng các đối số có thể có của các mệnh đề là O (n ^ 2h) trong đó h là độ chính xác tối đa của các mệnh đề và n là độ dài đầu vào. Trong ngữ pháp của bạn, XZ nói chung sẽ không liền kề trong đầu vào ban đầu.
Kurt

3
@Kurt, tôi nghĩ bạn đã tìm thấy lỗ hổng. Trong một bài viết khác ("Số tiếng Trung, MIX, Scrambled và Phạm vi nối ngữ phạm vi"), Boullier tuyên bố rõ ràng: "Tất nhiên, chỉ các phạm vi liên tiếp mới có thể được nối vào các phạm vi mới. được cho là bị ràng buộc trong phạm vi bởi một cơ chế thay thế. " Điều này có lẽ có nghĩa là ngữ pháp của tôi không phải là một RCG hợp lệ, sự nghi ngờ của Radu là hợp lý và cách tiếp cận này cũng không hiệu quả.
DaniCL

2
@Kurt đúng. Nếu không có sự hạn chế liên tục, tôi khá chắc chắn rằng mình có thể tạo ra một bộ quy tắc sản xuất nhận ra ngôn ngữ hoàn chỉnh NP UNary 3PARTATION. Bất kỳ tập hợp số nguyên không âm nào cũng có thể được mã hóa bằng một chuỗi bằng ngôn ngữ (1 * 0) ^ *. UNary 3PARTATION là tập hợp tất cả các chuỗi như vậy mà tập hợp được mã hóa có thể được phân chia thành các tập hợp con 3 phần tử, tất cả đều có cùng một tổng. (Xem en.wikipedia.org/wiki/3-partition_probols .)
Jeffε

1
Ngữ pháp cho ĐƠN VỊ 3 BÀI: S (X0Y0Z) -> A (e, X0, Y0, Z); A (W, 1X, Y, Z), A (W, X, 1Y, Z), A (W, X, Y, 1Z) -> A (W1, X, Y, Z); A (W, 0X, 0Y, 0Z) -> B (W, XYZ); B (W, e) -> e; B (W, X0Y0Z) -> C (W, W, X0, Y0, Z); C (W, 1V, 1X, Y, Z), C (W, 1V, X, 1Y, Z), C (W, 1V, X, Y, 1Z) -> C (W, V, X, Y, Z); C (W, e, X, Y, Z) -> B (W, XYZ)
Radu GRIGore
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.