Tôi muốn tính toán trước một số giá trị cho từng kết hợp trong một tập hợp các kết hợp. Ví dụ, khi lựa chọn 3 số 0-12, tôi sẽ tính toán một số giá trị cho mỗi một:Tính toán xếp hạng kết hợp?
>>> for n in choose(range(13), 3):
print n, foo(n)
(0, 1, 2) 78
(0, 1, 3) 4
(0, 1, 4) 64
(0, 1, 5) 33
(0, 1, 6) 20
(0, 1, 7) 64
(0, 1, 8) 13
(0, 1, 9) 24
(0, 1, 10) 85
(0, 1, 11) 13
etc...
Tôi muốn để lưu trữ các giá trị trong một mảng để cho sự kết hợp, tôi có thể tính toán của mình và nhận được giá trị. Ví dụ:
>>> a = [78, 4, 64, 33]
>>> a[magic((0,1,2))]
78
Điều gì sẽ magic
?
Ban đầu tôi nghĩ chỉ lưu trữ dưới dạng ma trận 3 chiều có kích thước 13 x 13 x 13, vì vậy tôi có thể dễ dàng lập chỉ mục theo cách đó. Trong khi điều này là tốt cho 13 chọn 3, điều này sẽ có cách quá nhiều chi phí cho một cái gì đó như 13 chọn 7.
Tôi không muốn sử dụng một dict vì cuối cùng mã này sẽ được trong C, và một mảng sẽ được hiệu quả hơn nhiều.
CẬP NHẬT: Tôi cũng có vấn đề tương tự, nhưng sử dụng kết hợp với lặp lại, vì vậy bất kỳ câu trả lời nào về cách xếp hạng thứ hạng sẽ được đánh giá cao =).
CẬP NHẬT: Để làm rõ, tôi đang cố gắng tiết kiệm không gian. Mỗi kết hợp này thực sự lập chỉ mục vào một thứ chiếm nhiều không gian, giả sử 2 kilobyte. Nếu tôi sử dụng một mảng 13x13x13, đó sẽ là 4 megabyte, trong đó tôi chỉ cần 572 kilobyte sử dụng (13 chọn 3) điểm.
Trong hoán vị, kết hợp và phân vùng, thuật ngữ văn học là "xếp hạng" thay vì "chỉ mục". Tìm kiếm "thuật toán kết hợp xếp hạng". :) Đây là một trang thực sự tốt: http://home.hccnet.nl/david.dirkse/math/rank/ranking.html –
Khi bạn nói "Tôi không muốn sử dụng một dict" ... hiện nó có nghĩa là bạn không muốn sử dụng một bảng băm? –
@belisarius: yep, xin lỗi cho thuật ngữ python – Claudiu