Bằng chứng về tính chính xác của thuật toán để xác định xem các phần tử của một mảng có được lặp lại với số lần bằng nhau không


7

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ố Bcó 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ử Bcó 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( falsenế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.


2
Làm thế nào về (3 + 2 + 4) / 3 = 3?
Yuval Filmus

@YuvalFilmus Tôi không hiểu ý bạn. Tôi đoán bạn bằng cách nào đó hiểu sai câu hỏi của tôi.
Alessandro

Câu trả lời:


11

Không, thuật toán của bạn không hoạt động. Xem xét nếu mảng A là

A = [1 1 1 1 1 2 2 3 3 3 3 3 3].

Thì mảng B sẽ là

B = [5 5 5 5 5 2 2 6 6 6 6 6 6].

Tổng của B sẽ là 65 và độ dài của B sẽ là 13, vì vậy sau khi chia, chúng ta sẽ nhận được số 5. ​​Điều này bằng với phần tử đầu tiên của B, vì vậy thuật toán của bạn sẽ xuất ra "Có". Tuy nhiên, không phải tất cả các yếu tố của B đều giống nhau và câu trả lời đúng là "Không". Vì vậy, thuật toán của bạn đưa ra đầu ra sai trong trường hợp này.

Rất cố gắng nhưng! Tìm ra cách xây dựng B có lẽ là phần khó nhất của vấn đề này.


Làm thế nào tôi tìm thấy điều này: Tôi không thể tìm thấy một ví dụ mẫu có hai số riêng biệt, vì vậy tiếp theo tôi đã thử với ba số riêng biệt. Để chou,v,wbiểu thị mức độ thường xuyên của mỗi số đó xuất hiện. Sau đó, mảng sẽ có chiều dàiu+v+wvà B sẽ chứa giá trị u lặp đi lặp lại u lần, giá trị v lặp đi lặp lại v lần và w lặp đi lặp lại w lần, do đó tổng các phần tử của B là u2+v2+w2. Chúng ta có thể tìm thấy một ví dụ mẫu nếu chúng ta có thể tìm một giải pháp trên các số nguyên dương cho phương trình Diophantine

u2+v2+w2u+v+w=u

như vậy mà vu hoặc là wu. Điều này tương đương với

u2+v2+w2=u(u+v+w),

Ở đâu u,v,w là các số nguyên dương và vu hoặc là wu. Sau đó tôi chọn một vài giá trị nhỏ củauvà đã thử giải phương trình Diophantine này bằng Wolfram Alpha. Giải pháp đầu tiên tôi tình cờ gặp làu=5, v=2, w=6, nhưng có nhiều người khác là tốt. Nhìn lại, tôi đoán tôi có thể đơn giản hóa hơn nữa để

v2+w2=uv+uw

nhưng tôi đã không chú ý và hóa ra không thành vấn đề.


Cám ơn vì đã giải thích! Tôi đã hiểu mọi thứ. (Buồn :()
Alessandro

5

[2,2,5,5,5,5,5,6,6,6,6,6,6] là một ví dụ mẫu.

Làm thế nào tôi tìm thấy rằng: (Bước cuối cùng của điều này là một tập lệnh Python.) Để chúng không bằng nhau, cần phải có ít nhất hai số riêng biệt xuất hiện. Tuy nhiên, trung bình hoàn toàn nằm giữa min và max, vì vậy để vượt qua tiêu chí của bạn, phải có ít nhất ba số khác nhau. Tôi chỉ đơn giản là hình dung nên có một ví dụ chỉ có ba số riêng biệt. Vì lý do tôi đã đưa ra hai câu trước, chỉ với ba số riêng biệt, người ta chỉ cần kiểm tra xem có hay không trung bình là số giữa. Với sự quan sát đó, tôi đã viết một tập lệnh Python để thử ba lần theo thứ tự từ vựng của [tổng, lớn nhất, trung bình, nhỏ nhất] và mảng tôi đưa ra tương ứng với ví dụ mẫu nhỏ nhất mà tập lệnh tìm thấy.


Đẹp! Điều này có vẻ đúng và hữu ích. Tôi thích lời giải thích về cách bạn tìm thấy nó; Điều đó có vẻ thực sự hữu ích. Tôi hy vọng việc xóa chỉ là tạm thời - nếu bạn chọn hủy xóa, tôi sẵn sàng nâng cấp nó.
DW

(Tôi đã xóa của tôi bởi vì nó dường như không thêm bất cứ điều gì như của bạn.)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.