01/10/2018, 11:18
Nhờ tư vấn thuật toán
Em có cái này khó nghĩ quá nhờ các bác tư vấn giúp em.
VD: e có 2 bảng
a = {a1,a2}
b= {b1,b1]
Kết quả cần in ra là mảng
c = {a1b1, a1b2, a2b1, a2b2}
Cao hơn tí là 3 mảng
a = {a1,a2,a3}
b = {b1,b2,b3}
c = {c1,c2}
Kết quả cần in ra là mảng
d = {a1b1c1, a2b1c1, a3b1c1,…}
Chắc ví dụ thế dễ hiểu rồi ạ. Vấn đề bây giờ là em có n bảng và mỗi bảng có n giá trị khác nhau thì e phải nên làm thể nào giờ các bác tư vấn thuật toán giúp ạ.
Bài liên quan
nếu bạn dùng Python thì tìm hiểu các hàm Zip() của nó nhé.
Bạn định cho nạp dữ liệu ntn? 1 cho tất cả hay số tham số tùy chọn?
Cartesian product thì dùng đệ quy thôi.
^ zip() chỉ kết 1-1-… thôi.
Mình không rành Python cho lắm
Edit: Không thì tự viết một cái
cái này giống hàm nhân các đa thức có số mũ khác nhau thôi bạn, dùng vòng lặp mà giải quyết, độ phức tạp thì m^n rồi.
có n mảng A, mỗi mảng Ai có mi phần tử thì lặp
k
từ 0 tới m1 * m2 * m3 * … * mn rồi dựa vàok
mà đoán xem phần tử thứk
chứa A1[a1] nào, A2[a2] nào, …, An[an] nào. Hay từk
có thể tính ra a1, a2, …, antạo mảng p1…pn với pn = 1, pi = pi+1 * mi+1
ta có thể tính ai = k / pi % mi
đơn giản @_@
Đây là bản Polynomial product.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.polymul.html#numpy.polynomial.polynomial.polymul
ngon lành @_@
mảng {“A”, “B”}, {“1”, “2”, “3”}, {“a”, “b”, “c”, “d”} in ra
mảng {“1”, “2”, “3”}, {“a”, “b”, “c”, “d”}, {“A”, “B”} in ra
đếm số thôi ko có gì cao siu cả, xài thư viện chi mất công đọc doc còn lâu hơn viết ra
Thanks các bác đã nhiệt tình giúp đỡ.
Thực ra cái này em chỉ hỏi thuật toán thôi ạ.
Và tối qua em nghĩ ra được thuật toán là:
…
Giống như hàm tính 1+2+3+4+5+6+7+8+9+10+11+12+…
Không nghĩ dc thì khó, nghĩ ra được rồi thì thấy đơn giản vãi.
Thanks các bác!
Cách này không hay đâu vì tạo ra mảng trung gian.
Vả lại P x Q x S != (P x Q) x S :), ko giống phép cộng.
Em đang thắc mắc là cái này nó khác nhau ở trường hợp nào. Em nhân ma trận cũng không thấy nó khác Vì
PQS == (PQ)S == P(QS)
Phép nhân với phép cộng giống nhau mà bác.
Nếu k làm giống 1+2+3+4+5+6+7+8+9
thì làm theo kiểu 1x2x3x4x5x6x7x8x9
A, giờ mới để ý thấy:
Cái đề bài có vấn đề:
Như vậy, hàm này đếm a1 trước, khi đếm a1 thì đếm b1 rồi b2[quote=“Ha_Temwin, post:1, topic:53448”]
Cao hơn tí là 3 mảng
a = {a1,a2,a3}
b = {b1,b2,b3}
c = {c1,c2}
Kết quả cần in ra là mảng
d = {a1b1c1, a2b1c1, a3b1c1,…}
[/quote]
Ở đây thì lại đếm c1 trước, rồi đếm b1, rồi đếm a1, a2…
Thế rốt cuộc thì là đếm theo thứ tự nào để anh em còn code.
Nếu làm theo thứ tự 1 thì PQR = (PQ)R
Nhưng làm theo thứ tự 2 thì PQR != (PQ)R
Tính chất phân phối thì nó được ứng dụng trong tính toán song song.
Về cách giải của bác làm đúng, và cũng là cách hiện thực trong thư viện luôn. Tuy nhiên không phải làm từ trái sang phải , mỗi lần tính là có 1 mảng trung gian, mà thực hiện tính toán song song.
Ví dụ n đủ lớn, như 50. Lúc này chia ra làm 10 chunks, mỗi chunk gồm 5 mảng, chunk 0 từ mảng 0 đến 4, chunk 2 từ 5 đến 9,…
10 chunk được xử lý bởi 10 cluster. Trong 1 cluster thì tính toán nhân 5 mảng theo cách nào cũng được, thường là cách đơn giản, dễ đọc. 10 cluster sẽ chạy song song, cho ra kết quả 10 mảng.
10 mảng đó lại phân thành 2 chunk, chạy song song trên 2 cluster, ra 2 mảng. 2 mảng bỏ vào chunk mới rồi tính trên cluster tiếp ra kết quả cuối cùng.
Cluster mình nói có thể là CPU, GPU, hay đơn giản là 1 core trong CPU. Nên 1 máy tính có thể có 1 cluster hay nhiều cluster đều được.
Các bạn xem lại định nghĩa tích Cartesian vả lại ((1, 2), 3) != (1, 2, 3) nên (P x Q) x S != P x Q x S.
Nghe như tích đề các trong đại số tt vậy