Tôi xin lỗi vì tiêu đề dài, nhưng tôi thực sự không biết cách viết nó khác biệt mà không thiếu thông tin về nội dung.
Gần đây tôi đã có một kỳ thi đại học về Thuật toán song song. Một bài tập yêu cầu tôi viết một thuật toán để xác định xem các phần tử của một mảng, hãy gọi nó A
, được lặp lại với số lần bằng nhau.
Ví dụ:
1) A = 1 8 8 1 8 1 1 8
: câu trả lời là có, mỗi số được lặp lại 2 lần.
2) A = 7 8 8 5 5 4 7 8
: câu trả lời là không.
Tôi đã phải viết thuật toán cho một mô hình điện toán song song cụ thể, PRAM: mô hình yêu cầu tôi sử dụng một số kỹ thuật để tránh xung đột đọc / ghi và các vấn đề khác, nhưng điều này không liên quan. Những gì tôi đã kết thúc là một mảng mới, hãy gọi nó B
, mà tôi có thể định nghĩa như sau:Given the array A, B[i] contains the number of repetitions of the element A[i] within A.
Ví dụ:
1) A = 1 8 8 1 8 1 1 8
B = 4 4 4 4 4 4 4 4
2)A = 7 8 8 5 5 4 7 8
B = 2 3 3 2 2 1 2 3
Như bạn có thể nghĩ và mong đợi, điều duy nhất còn lại phải làm là kiểm tra xem mọi yếu tố B
có bằng nhau hay không, nhưng .. hóa ra tôi là masochist, và áp lực của kỳ thi (cộng với tôi có một chút nhiệt độ) dẫn tôi đi một con đường khác. Hơn nữa, so sánh các yếu tố của một mảng không phải là ngay lập tức sử dụng mô hình điện toán này.
Vì vậy, để kiểm tra xem tất cả các phần tử B
có giống nhau không, tôi đã tổng hợp tất cả chúng và chia kết quả cho số phần tử của B
: nếu kết quả bằng với một phần tử của B (ví dụ đầu tiên, B[0]
) thì thuật toán trả về true
( false
nếu không).
Lấy ví dụ trên:
1) sum = 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 = 32
-> 32 / 8 = 4 = B[0]
-> Có.
2) sum = 2 + 3 + 3 + 2 + 2 + 1 + 2 + 3 = 18
-> 18 / 8 ≠ 2 = B[0]
-> Không.
Tôi biết điều đó thật vô lý, nhưng đó là những gì tôi nghĩ ra.
Tôi đã kiểm tra phương pháp này với rất nhiều kết hợp mảng / số khác nhau và dường như nó hoạt động. Điều đó là, tôi đang gặp khó khăn trong việc tìm kiếm một bằng chứng (toán học) rằng thuật toán này là chính xác. Bên cạnh kết quả của kỳ thi mà tôi vẫn chưa biết, tôi rất muốn biết liệu có bằng chứng / giải thích toán học nào cho biết cách tiếp cận này là đúng hay không, và đó là lý do tôi cần sự giúp đỡ.
Tôi hy vọng tôi đã đăng câu hỏi trong trang web StackExchange đúng. Nếu không, xin vui lòng chuyển hướng tôi đến đúng trang web.
Cảm ơn bạn trước.