2010-02-27 46 views
11

Tôi được cung cấp số N và cho chúng áp dụng các quy tắc M về thứ tự của chúng. Các quy tắc được thể hiện trong một cặp các chỉ mục và mỗi cặp (A, B) nói rằng số có chỉ số A (số thứ A) phải sau SAU số thứ B - nó không phải là bên cạnh anh ta .Tìm tất cả các hoán vị phù hợp với một bộ quy tắc

Ex: N = 4 
    1 2 3 4 
    M = 2 
    3 2 
    3 1 

Output: 1234, 4213, 4123, 2134, 2143, 2413, 1423 ...Maybe there are even more:) 

Thuật toán nên cung cấp cho tôi tất cả các hoán vị có sẵn mà không phá vỡ các quy tắc, như trong ví dụ - 3 phải luôn sau 2 và sau 1.

tôi đã cố gắng bruteforcing nhưng nó didn' t làm việc (mặc dù bruteforce nên làm việc ở đây, N là trong phạm vi (1,8).)

Bất kỳ ý tưởng?

+0

Bạn có thể giải thích cách các số N đi vào điều này? Câu trả lời sẽ là gì nếu N's {1, 2, 3, 4}? –

+0

Từ những gì tôi có thể thấy, số N bạn đã cung cấp không liên quan đến câu hỏi bạn đang hỏi. Điều này có đúng không? – sykora

+0

N là bao nhiêu số, trong trường hợp này N = 4 vì có bốn số, 1..4. – VaioIsBorn

Trả lời

9

Giống như gợi ý.

Bạn có thể xem bộ quy tắc của mình dưới dạng biểu đồ. Mỗi chỉ mục là một đỉnh, mỗi quy tắc là một cạnh chỉ đạo.

Bất kỳ trật tự chính xác của những con số (ví dụ: một hoán vị thỏa mãn các quy tắc) tương ứng với cái gọi là topological ordering của đồ thị trên. Để tạo ra tất cả thứ tự hợp lệ của các số của bạn, bạn cần tạo tất cả các thứ tự topo có thể có của biểu đồ đó.

P.S. Thuật toán đầu tiên cho thứ tự topo được đưa ra tại trang Wikipedia được liên kết đã cho phép một giải pháp khá đơn giản liệt kê tất cả các hoán vị hợp lệ. Nó sẽ mất một số nỗ lực và một số chăm sóc để thực hiện, nhưng nó không phải là khoa học tên lửa.

+0

Như là một bước trước khi đi đến một loại topo đầy đủ, bạn có thể ít nhất tạo ra các mảnh vỡ theo thứ tự để đơn giản hóa các brute-buộc. Ví dụ, nếu các quy tắc ưu tiên là: 3,4 4,5 5,8 Bạn biết bạn có thể hoán vị [3458] với prepends, chèn và gắn thêm các số nguyên của bạn không bị giới hạn bởi các quy tắc ưu tiên (này khái quát quá trình vào trên) –

4

Buộc bắt buộc sẽ là going through every permutation, là O (N!) Và cho mỗi hoán vị chỉ lặp qua mọi quy tắc để xác nhận rằng chúng là aplpy, là O (M). Điều này kết thúc O (N! M) mà là loại vô lý, nhưng nó không nên "không làm việc" cho một tập nhỏ như vậy.

+0

thực sự anh ta có thể kiểm tra các quy tắc, trong khi tạo hoán vị. Điều này sẽ giảm đáng kể thời gian, và anh ta sẽ kết thúc với một kết quả. – Kugel

+0

Tôi đồng ý. Nếu N = 8 là cao nhất mà bạn cần để có thể xử lý, sau đó nó có lẽ không phải là giá trị thời gian của bạn để đến với một cái gì đó tốt hơn so với lực lượng vũ phu cho một cái gì đó như thế này. –

+0

Vâng, chắc chắn có rất nhiều cách tối ưu hóa dễ dàng được thực hiện cho một giải pháp bạo lực, nhưng anh ta đề cập đến việc anh ấy đang gặp vấn đề với điều đó. – Tanzelax

1

Thành thật mà nói, đặt cược tốt nhất của bạn là quay trở lại và nhận giải pháp lực lượng vũ phu hoạt động. Khi đã xong (và nếu bạn vẫn còn thời gian, vv) bạn có thể tìm kiếm một thuật toán tốt hơn.

CHỈNH SỬA cho người bỏ phiếu xuống. Học sinh (phải là) cố gắng hoàn thành bài tập về nhà vào thời gian. Bằng những âm thanh của nó, bài tập về nhà của anh ấy là một bài tập lập trình, nơi một giải pháp brute-force sẽ là đủ. Giúp anh ta tìm ra một thuật toán hiệu quả không giải quyết vấn đề REAL của anh ta. Trong trường hợp này, ông đã thử phương pháp tiếp cận bạo lực đơn giản (mà mọi người đồng ý phải làm việc cho các giá trị N nhỏ) và từ bỏ nó sớm để thử cái gì đó có lẽ khó khăn hơn. Bất kỳ nhà phát triển có kinh nghiệm nào cũng sẽ cho bạn biết rằng đây là một ý tưởng tồi. Học sinh cần và xứng đáng được nói như vậy, và nếu anh ấy là hợp lý, anh ấy sẽ chú ý. Nhưng rõ ràng, đó là sự lựa chọn của mình ...

+0

@serial_downvoter: Đã hủy bạn. Ha ha! –

Các vấn đề liên quan