2010-03-02 25 views
6

Tôi biết có một số câu hỏi trên tạo kết hợp các yếu tố, nhưng tôi nghĩ rằng điều này có một sự thay đổi nhất định để có giá trị một câu hỏi mới:Tất cả các kết hợp hợp lệ của các điểm, theo cách hiệu quả nhất (tốc độ)

Đối với một proejct thú cưng của tôi, tôi đã tính toán trước rất nhiều trạng thái để cải thiện hành vi thời gian chạy của ứng dụng sau này. Một trong những bước mà tôi phải vật lộn với điều này là:

Cho hai bộ dữ liệu N (cho phép gọi chúng từ đây trở đi, mặc dù chúng không nằm trong trường hợp sử dụng của tôi. Chúng gần đúng là X/Y) cần tính toán tất cả các kết hợp hợp lệ cho một quy tắc nhất định.

Nguyên tắc có thể là một cái gì đó giống như

  • "Mỗi điểm bao gồm không bao gồm tất cả các điểm khác với cùng X phối hợp"
  • "Mỗi điểm bao gồm không bao gồm tất cả các điểm khác với một X lẻ phối hợp"

Tôi hy vọng rằng điều này dẫn đến sự cải tiến trong quá trình lựa chọn, nhưng kỹ năng toán học của tôi chỉ được hồi sinh khi tôi nhập và tôi không thể đưa ra một thuật toán thanh lịch.

  • Tập hợp các điểm (N) bắt đầu nhỏ, nhưng triển nhanh hơn 64 sớm (đối với "sử dụng miễn là bitmask" giải pháp)
  • tôi đang làm điều này trong C#, nhưng giải pháp trong bất kỳ ngôn ngữ cần sử dụng tốt nếu nó giải thích ý tưởng cơ bản

Cảm ơn.


Cập nhật để đáp ứng với câu trả lời của Vlad:

Có lẽ ý tưởng của tôi để khái quát những câu hỏi là một xấu. Quy tắc của tôi ở trên đã được phát minh khi đang di chuyển và chỉ là trình giữ chỗ. Một nguyên tắc thực tế sẽ trông như thế này:

  • "Mỗi điểm bao gồm không bao gồm tất cả các điểm khác trong triagle trên điểm chọn"

Bằng quy tắc đó và bằng cách chọn (2,1) Tôi muốn loại trừ

  • (2,2) - trực tiếp trên
  • (1,3) (2,3) (3,3) - dòng tiếp theo
  • và vân vân

Vì vậy, các quy tắc được khắc phục, chứ không phải chung. Chúng không may phức tạp hơn các mẫu X/Y mà tôi đã đưa ra ban đầu.

+0

Sẽ rất hữu ích nếu bạn có thể liệt kê tất cả các quy tắc thực tế bạn định sử dụng. – Nixuz

Trả lời

0

Đối với một số loại quy tắc đặc biệt, nhiệm vụ của bạn có vẻ đơn giản. Ví dụ: đối với quy tắc mẫu số 1 của bạn, bạn cần phải chọn một tập hợp con của tất cả các giá trị có thể có của X và hơn cho mỗi giá trị từ tập hợp con gán một tùy ý Y.

Cho generic quy tắc Tôi nghi ngờ rằng có thể xây dựng một thuật toán hiệu quả mà không cần bất kỳ AI nào.

+0

Được rồi, tôi không có quy tắc chung (như trong: Kính gửi người dùng, hãy phát minh nhiều hơn khi đang bay). Chỉ có một vài cho đến nay cố định. Tôi sẽ cập nhật bài đăng với một ví dụ tốt hơn và thực tế hơn. –

+0

Đối với quy tắc từ bản cập nhật, thuật toán sau có thể được sử dụng. Hãy tạm thời xoay hệ tọa độ của chúng ta 45 độ. (Bây giờ hình tam giác của chúng ta có hai cạnh song song với các trục.) Rõ ràng là không có 2 điểm nào có thể trên cùng một đường thẳng đứng. Hơn nữa, nếu một điểm A là _left_ của một điểm B, nó phải là _higher_ so với B. Vì vậy quy tắc của chúng tôi là (1) chọn các đường thẳng tùy ý (trong các tọa độ cũ nó sẽ là các đường chéo song song tùy ý); (2) chọn một điểm trên mỗi dòng theo thứ tự giảm dần. (Các giá trị có thể tùy ý, chỉ cần thứ tự giảm dần là quan trọng.) – Vlad

+0

Như bạn thấy, thuật toán cho quy tắc đơn giản đã khá phức tạp. Đối với các quy tắc phức tạp hơn, nó sẽ phức tạp hơn, tôi cho là vậy. – Vlad

0

Sự hiểu biết của tôi về vấn đề là: Đưa ra phương pháp bool property(Point x) const, tìm tất cả các điểm mà tập hợp cho thuộc tính() là true. Điều đó có hợp lý không?

Phương pháp tiếp cận vũ phu là chạy tất cả các điểm qua property() và lưu trữ các điểm trả về đúng. Độ phức tạp của thời gian này là O(N) trong đó (a) N là tổng số điểm và (b) phương pháp property()O(1). Tôi đoán bạn đang tìm kiếm các cải tiến từ O(N). Có đúng không?

Đối với một số loại thuộc tính, có thể cải thiện từ O(N) cung cấp cấu trúc dữ liệu phù hợp được sử dụng để lưu trữ điểm và tính toán trước thích hợp (ví dụ: sắp xếp). Tuy nhiên, điều này có thể không đúng đối với bất kỳ tài sản tùy ý nào.

3

Làm thế nào về "tọa độ x của mỗi điểm được bao gồm là tổng chính xác của một số tập con của toạ độ y của các điểm khác". Nếu bạn có thể đưa ra một thuật toán nhanh cho vấn đề ràng buộc đơn giản, thì bạn sẽ trở nên rất nổi tiếng.

Vấn đề của tôi là vấn đề được nêu rõ quá mơ hồ như thừa nhận các vấn đề NP-complete hoặc NP-hard. Các vấn đề tối ưu hóa hạn chế là vô cùng khó khăn; nếu bạn không thể đặt các giới hạn cực kỳ chặt chẽ vào vấn đề thì nó sẽ nhanh chóng trở thành không thể phân tích bởi các máy trong thời gian đa thức.

+0

Cảm ơn câu trả lời. Tôi sẽ suy nghĩ lại về câu hỏi của tôi một lần nữa. Tôi đã cố gắng loại bỏ các chi tiết và yêu cầu một giải pháp chung cho vấn đề "Cho một tập hợp các mục, làm cách nào để tính toán tất cả các kết hợp theo cách hiệu quả nếu mọi lựa chọn loại bỏ một phần của tập hợp còn lại". Có lẽ đó là quá chung chung và tôi sẽ cố gắng để đến với một cái gì đó tốt hơn, xin lỗi. –

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