LẬP TRÌNH PHÂN tán

28 914 0
LẬP TRÌNH PHÂN tán

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

LẬP TRÌNH PHÂN tán

LẬP TRÌNH PHÂN TÁN NHÓM 1 TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP.HỒ CHÍ MINH KHOA CÔNG NGHỆ THÔNG TIN GVHD: Huỳnh Thái Học SVTH: Nhóm 1 1. Nguyễn Trung Hiếu 09070301 2. Trịnh Quang Huy 09072881 3. Huỳnh Văn Hiền 09071611 4. Trịnh Trường Thọ 09073251 TÍNH BIỂU THỨC SỐ LỚN 1 LẬP TRÌNH PHÂN TÍNH BIỂU THỨC SỐ LỚN Tp.HCM, ngày 6 LẬP TRÌNH PHÂN TÁN NHÓM 1 MỤC LỤC TÍNH BIỂU THỨC SỐ LỚN 2 LẬP TRÌNH PHÂN TÁN NHÓM 1 LỜI NÓI ĐẦU Trong thời đại hiện nay với sự phát triển ngày càng lớn mạnh của công nghệ thông tin thì nhu cầu xử lí dữ liệu với những con số cực lớn (từ 10000 chữ số trở lên) đang rất cần thiết, đặc biệt trong các ngành khoa học như Toán học như tìm các số nguyên tố lớn, tìm giai thừa của một số cực lớn, v.v nhưng việc tính toán các giá trị ấy hiện nay vẫn chưa được hỗ trợ, trong đó kiểu Integer chỉ cho phép tính toán đến 2 32 (khoảng 9 chữ số) và kiểu Long cho phép tính toán đến 2 64 số (khoảng 18 chữ số). Vì vậy chúng ta cần phải tạo ra một chương trình có thể thỏa mãn điều này nhầm tạo điều kiện cho sự phát triển của Công nghệ thông tin trên toàn thế giới cũng như các ngành khoa học khác. Mặc dù những bài toán với số lớn này hiện nay đã có cách giải tuy nhiên việc tính toán rất phức tạp và rất mất thời gian, đặc biệt khi máy chủ được yêu cầu quá nhiều bài toán cùng một lúc, rất may thay với sự hỗ trợ của Lập trình theo hướng phân tán, ta có thể tạo nên một ứng dụng theo hướng phân tán giúp ta có thể giảm thiểu được giời gian xử lí bài toán cũng như có thể tính toán đồng thời nhiều biểu thức cùng một lúc. TÍNH BIỂU THỨC SỐ LỚN 3 LẬP TRÌNH PHÂN TÁN NHÓM 1 1 PHÂN TÍCH BÀI TOÁN 1.1 PHÂN TÍCH CẤU TRÚC DỮ LIỆU. Để giải quyết bài toán tính đa thức với các chữ số lớn này trước hết chúng ta cần xây dựng một Class với các phương thức tính toán đơn giản bao gồm các phép tính Cộng, Trừ và Nhân các số lớn. Như chúng ta đã biết các kiểu dữ liệu Integer và Long trong java không thể xử lí các phép tính của các số có từ 18 chữ số trở lên nên chúng ta không thể lưu dữ liệu dưới dạng Integer hay Long được mà sẽ lưu với một dạng khác đó chính là kiểu String, ở dạng kiểu String chúng ta sẽ có thể lưu thoải mái số lượng chữ số cần thiết. Từ đây chúng ta sẽ chia các phép toán ra thành từng phần và xử lí chúng: 1.1.1 Phép toán Cộng: Để cộng 2 chuỗi số với nhau chúng ta cần chia chuỗi này thành các chuỗi con mỗi chuỗi gồm có 3 chữ số, ta chuyển kiểu chuỗi này sang kiểu Integer và lưu vào một mảng mới kiểu Integer theo thứ tự từ sau ra trước. Ví dụ ta có một chuỗi sau: 7128793451 Ta sẽ chia chuỗi này ra thành từng nhóm, mỗi nhóm có 3 chữ số từ sau ra phía trước: 7|128| 793|451. Sau đó ta sẽ chuyển đổi kiểu của từng cụm số ra kiểu Integer và lưu vào một mảng mới kiểu Integer theo thứ tự từ sau ra trước, ta sẽ có mảng kiểu integer sau: {451, 793, 128, 7} Giả sử chúng ta cần tính tổng giá trị của 2 số: 7128793451 và 495674968. Trước hết chúng ta cần phải phân tích cả 2 số này trở về kiểu mảng Integer như đã nói ở trên, sau khi phân tích ra ta sẽ được 2 mảng sau: {451, 793, 128, 7} {968, 674, 495} Ta sẽ lần lượt cộng theo thứ tự từ vị trí 0 đến n với n là chiều dài của mảng dài nhất, nếu có dư ta sẽ dùng một biến để lưu số dư này lại rồi cộng dồn cho các giá trị sau. Ta sẽ được một mảng kết quả là: {419, 468, 624, 7} Việc còn lại là ta chỉ cần ghép các số này theo chiều ngược lại ta sẽ có kết quả cần tìm là: 7624468419. 1.1.2 Phép toán trừ: Tương tự như phép toán cộng ta đã phân tích ở trên ta có phép toán trừ của 2 số lớn được thực hiện như các bước sau: TÍNH BIỂU THỨC SỐ LỚN 4 LẬP TRÌNH PHÂN TÁN NHÓM 1 Ví dụ ta muốn trừ 2 số: 7128793451 và 495674968. Trước tiên ta vẫn phân tích 2 số này thành các mảng số nguyên như trên: {451, 793, 128, 7} {968, 674, 495} Ta sẽ lần lượt trừ theo thứ tự từ 0 đến n với n là chiều dài của mảng dài nhất trong 2 mảng trên, nếu số trên nhỏ hơn số ở dưới chúng ta sẽ cộng cho số ở trên cho 1000 và trừ như bình thường như cần phải có một biến để lưu giá trị ta “mượn” này. Sau khi trừ ta sẽ được một mảng kết quả như sau: {483, 118, 633, 6} Cũng tương tự như phép cộng, ta chỉ đơn giản ghép các số này lại theo thứ tự từ sau ra trước để có một kết quả hoàn chỉnh: 6633118483. Chú ý: Nếu số hạng thứ nhất nhỏ hơn số hạng thứ 2 thì ta sẽ lấy số thứ 2 trừ cho số thứ nhất và trong kết quả ta sẽ gán thêm một dấu trừ phía trước kết quả. 1.1.3 Phép nhân. Thông thường để thực hiện một phép nhân phức tạp chúng ta sẽ cộng lần lượt các số lại với nhau để cho ra kết quả cuối cùng, tuy nhiên phương pháp này sẽ mất rất nhiều thời gian và công sức. Ví dụ nếu ta nhân 2 con số 7128793451 và 495674968 lại với nhau theo phương pháp này thì chúng ta phải thực hiện 495674968 lần phép cộng số 7128793451 vào kết quả hiện tại!! Rõ ràng thuật toán này sẽ tốn của chúng ta rất nhiều thời gian để xử lí cũng như bộ nhớ. Để thực hiện phép nhân hai số lớn ta sẽ không thực hiện theo phương pháp đã nêu ở trên mà sẽ sử dụng một phương pháp khác sẽ được trình bày ở dưới đây: Ví dụ ta có 2 con số cần tính tích của chúng: 7128793451 và 495674968 Trước hết ta vẫn sẽ phân tích 2 con số này ra thành các mảng số nguyên: A = {451, 793, 128, 7} B = {968, 674, 495} Chúng ta có một nhận xét như sau: Nếu ta nhân một số ở vị trí i và một số ở vị trí j thì kết quả của nó sẽ nằm ở vị trí i + j trong mảng kết quả. Vì vậy mảng kết quả sẽ có số lượng phần tử là n + m - 1 hoặc n + m nếu có dư với n là số lượng phần tử trong mảng 1 và m là số lượng phần tử trong mảng 2. Ta sẽ cho 2 vòng lập for chạy lòng vào nhau và lần lượt cho từng phần tử trong 2 mảng nhân với nhau, nghĩa là A[0] sẽ nhân lần lượt với B[0], B[1], , B[m - 1] kết quả sẽ lưu vào mảng T[n + m]. Ta sẽ có kết quả sau: T = {436568, 1071598, 881631, 485583, 68078, 3465} TÍNH BIỂU THỨC SỐ LỚN 5 LẬP TRÌNH PHÂN TÁN NHÓM 1 Ta sẽ cộng dồn kết quả lại sao cho mỗi phần tử chỉ có 3 chữ số, nếu vượt quá 3 chữ số ta sẽ lưu lại và cộng cho phần tử tiếp theo, kết quả sẽ là: T = {568, 34, 703, 465, 564, 533, 3} Tương tự như 2 phép toán ở trên ta sẽ ghép các số này lại theo thức tự từ phải sang trái. Kết quả nhận được là: 3533564465703034568. Như ta thấy thì bài toán trên độ phức tạp chỉ là (độ dài xâu 1 * độ dài xâu 2) / 9. Bài toán được xử lí nhanh hơn rất nhiều so với phương pháp thông thường. 1.1.4 Tổng kết class BigNum. Như đã phân tích ở trên ta thấy các hàm cần thiết để thực hiện 3 phép toán trên chính là các hàm sau đây:  Hàm int[] convertToArray(String a): Dùng để chuyển một kiểu chuỗi sang một kiểu mảng integer.  Hàm String Plus(String a, String b): Dùng để cộng 2 số kiểu chuỗi và trả về kết quả kiểu chuỗi.  Hàm String Subtract(String a, String b): Dùng để trừ 2 số kiểu chuỗi và trả về kết quả kiểu chuỗi.  Hàm String Multi(String a, String b): Dùng để nhân 2 số kiểu chuỗi và trả về kết quả kiểu chuỗi.  Hàm String modify(int[] A): Dùng để ghép các số trong mảng kết quả lại thành kiểu chuỗi. 1.2 PHÂN TÍCH BÀI TOÁN ĐA THỨC THEO HƯỚNG PHÂN TÁN. Để giải một bài toán đa thức theo hướng phân tán trước hết chúng ta cần phải chia bài toán lớn ra thành các bài toán con và đưa các bài toán con này cho các máy khác xử lí. Ví dụ ta có bài toán nhỏ sau: 3*4+5*(7+8). Ta thấy trong bước đầu tiền khi phân tích đa thức này sẽ tồn tại 2 bài toán con cần xử lí đầu tiên là 3 * 4 và 7 + 8. Ta sẽ đưa 2 bài toán con này cho các máy con khác xử lí vào được kết quả là tạo thành một đa thức mới: 12 + 5 * 15. Từ đây lại sinh ra thêm một bài toán con nữa chính là 5 * 15. Ta lại có một đa thức mới là 12 + 75. Tương tự cho đến khi đa thức này không còn phép tính nào cả thì ta sẽ được kết quả cuối cùng là 87. Để có thể phân tích một đa thức ra thành các đơn thức con như trình bày ở trên ta cần phải sử dụng thuật toán Kí pháp Ba Lan để xử lí nó. Khi sử dụng thuật toán kí pháp Ba Lan cho một đa thức ta sẽ phân tích đa thức đó thành một mảng các chuỗi được sắp xếp theo độ ưu tiên của phép toán, ví dụ như chuỗi ở trên sẽ cho ra kết quả: 3 4 * 5 7 8 + * Các phép toán nào gần 2 số liên tiếp sẽ được xử lí trước và cho ra kết quả mới. Tương tự cho đến khi kết quả cuối cùng chỉ còn lại một số. TÍNH BIỂU THỨC SỐ LỚN 6 LẬP TRÌNH PHÂN TÁN NHÓM 1 2 THỰC THI 2.1 CLASS INTERFACECALCULATOR CHỨA CÁC INTERFACE XỬ LÝ CÁC PHÉP TOÁN BIGNUM Class này chứa các interface của các phép toán số lớn bao gồm phép Cộng, Trừ và Nhân. import java.rmi.*; public interface InterfaceCaculator extends Remote { public String Plus(String a, String b) throws RemoteException; public String Subtract(String a, String b) throws RemoteException; public String Multi(String a, String b) throws RemoteException; } 2.2 CLASS CALCULATORIMPL DÙNG ĐỂ THỰC THI CÁC PHƯƠNG THỨC TRONG CLASS INTERFACECALCULATOR. import java.util.*; import java.math.*; import java.io.*; import java.rmi.*; import java.rmi.server.*; public class CaculatorImpl extends UnicastRemoteObject implements InterfaceCaculator { public CaculatorImpl() throws RemoteException { super(); } TÍNH BIỂU THỨC SỐ LỚN 7 LẬP TRÌNH PHÂN TÁN NHÓM 1 //Ham xu li phep toan cong public String Plus(String a, String b) throws RemoteException { boolean ketQuaAm = false; if (a.charAt(0) == '-' && b.charAt(0) == '-') { a = a.substring(1); b = b.substring(1); ketQuaAm = true; } if (a.charAt(0) == '-') return Subtract(b, a); if (b.charAt(0) == '-') return Subtract(a, b); while (a.length() < b.length()) a = "0" + a; while (a.length() > b.length()) b = "0" + b; while (a.length() % 3 != 0) a = "0" + a; while (b.length() % 3 != 0) b = "0" + b; int[] A = convertToArray(a); int[] B = convertToArray(b); int du = 0; int count = A.length; int[] plus = new int[count + 1]; for (int i = 0; i < count; i++) { TÍNH BIỂU THỨC SỐ LỚN 8 LẬP TRÌNH PHÂN TÁN NHÓM 1 du += A[i] + B[i]; plus[i] = du % 1000; du /= 1000; } plus[count] = du; String answer = modify(plus); if (ketQuaAm) answer = "-" + answer; return answer; } //Ham xu li phep toan tru public String Subtract(String a, String b) throws RemoteException { int du = 0; boolean smaller = false; if (a.length() < b.length() || (a.length() == b.length() && a.compareToIgnoreCase(b) < 0)) { String temp = a; a = b; b = temp; smaller = true; } while (a.length() < b.length()) a = "0" + a; while (a.length() > b.length()) b = "0" + b; while (a.length() % 3 != 0) a = "0" + a; TÍNH BIỂU THỨC SỐ LỚN 9 LẬP TRÌNH PHÂN TÁN NHÓM 1 while (b.length() % 3 != 0) b = "0" + b; int[] A = BigNum.convertToArray(a); int[] B = BigNum.convertToArray(b); int count = A.length; int[] subtract = new int[count]; for (int i = 0; i < count; i++) { A[i] -= du; if (A[i] < B[i]) { A[i] += 1000; du = 1; } else du = 0; subtract[i] = A[i] - B[i]; } String answer = BigNum.modify(subtract); if (smaller) answer = "-" + answer; return answer; } //Ham xu li phep toan nhan public String Multi(String a, String b) throws RemoteException TÍNH BIỂU THỨC SỐ LỚN 10 [...]... 24 LẬP TRÌNH PHÂN TÁN NHÓM 1 private javax.swing.JTextField txtInput; private javax.swing.JTextField txtOutput; // End of variables declaration//GEN-END:variables } 2.5 THỰC THI CHƯƠNG TRÌNH Bước 1: Khởi động Server Bước 2: Chạy Client TÍNH BIỂU THỨC SỐ LỚN 25 LẬP TRÌNH PHÂN TÁN NHÓM 1 Giao diện chương trình: Tính số lớn: TÍNH BIỂU THỨC SỐ LỚN 26 LẬP TRÌNH PHÂN TÁN NHÓM 1 TÍNH BIỂU THỨC SỐ LỚN 27 LẬP... 26 LẬP TRÌNH PHÂN TÁN NHÓM 1 TÍNH BIỂU THỨC SỐ LỚN 27 LẬP TRÌNH PHÂN TÁN NHÓM 1 3 CÁC MẶT HẠN CHẾ VÀ HƯỚNG PHÁT TRIỂN 3.1 CÁC MẶT HẠN CHẾ  Chương trình hiện tại vẫn còn thiếu phép toán Chia do khi xử lí chia không hết sẽ sinh ra các số thập phân vô hạn, việc xử lí các con số này vô cùng phức tạp và tốn rất nhiều thời gian để xử lí nên chương trình hiện tại vẫn chưa có phép tính này  Bên cạnh đó các... chương trình vẫn còn đơn giản, tương tác với người dùng kém 3.2 HƯỚNG PHÁT TRIỂN  Chương trình sẽ có thêm các phép toán thông dụng khác như phép chia, phép Mod, phép giai thừa, v.v  Chương trình sẽ được cải tiến thêm để có thể xử lí nhanh hơn  Ở giai đoạn phân tán các đơn thức cho các bài toán con sẽ được tối ưu hơn nhằm sử dụng hiệu quả nguồn tài nguyên của các máy  Giao diện của chương trình. .. java.rmi.AlreadyBoundException; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.Naming; import java.net.MalformedURLException; public class Server TÍNH BIỂU THỨC SỐ LỚN 13 LẬP TRÌNH PHÂN TÁN NHÓM 1 { public static void main (String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException { try { LocateRegistry.createRegistry(1099); CaculatorImpl cal=new CaculatorImpl();... System.out.println ("Error: "+e); } } } 2.4 CLASS CLIENT public class Client extends javax.swing.JFrame { /** * Creates new form Client */ public Client() { initComponents(); } /** TÍNH BIỂU THỨC SỐ LỚN 14 LẬP TRÌNH PHÂN TÁN NHÓM 1 * This method is called from within the constructor to initialize the form * WARNING: Do NOT modify this code The content of this method is always * regenerated by the Form Editor */... jLabel2.setText("The result is here:"); btnCal.setFont(new java.awt.Font("Tahoma", 1, 20)); // NOI18N btnCal.setForeground(new java.awt.Color(153, 153, 0)); btnCal.setText("Calculate"); TÍNH BIỂU THỨC SỐ LỚN 15 LẬP TRÌNH PHÂN TÁN NHÓM 1 btnCal.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCalActionPerformed(evt); } }); txtInput.setFont(new java.awt.Font("Tahoma",... addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment LEADING) addGroup(layout.createSequentialGroup() addGap(36, 36, 36) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment LEADING) TÍNH BIỂU THỨC SỐ LỚN 16 LẬP TRÌNH PHÂN TÁN NHÓM 1 addComponent(jLabel1) addComponent(jLabel2)) addGap(18, 18, 18) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment LEADING, false) addComponent(txtInput) addComponent(txtOutput,... javax.swing.GroupLayout.PREFERRED_SIZE)) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment TRAILING) addGroup(layout.createSequentialGroup() addGap(53, 53, 53) TÍNH BIỂU THỨC SỐ LỚN 17 LẬP TRÌNH PHÂN TÁN NHÓM 1 addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment BASELINE) addComponent(jLabel2) addComponent(txtOutput, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE))... {//GEN-FIRST:event_btnCalActionPerformed // TODO add your handling code here: char[] exp = txtInput.getText().toCharArray(); int count = exp.length; String[] balanExpr = new String[10000]; TÍNH BIỂU THỨC SỐ LỚN 18 LẬP TRÌNH PHÂN TÁN NHÓM 1 char[] S = new char[10000]; int headBalan = 0; int headS = 0; String curNum = ""; /*Bat dau thuat toan Balan*/ for (char c : exp) { if (Character.isDigit(c)) curNum += c; else { if (curNum.length()... '(') { balanExpr[headBalan++] = Character.toString(S[headS - 1]); headS ; } headS ; continue; } if (c == '+' || c == '-') { while (headS - 1 >= 0 && S[headS - 1] != '(') { TÍNH BIỂU THỨC SỐ LỚN 19 LẬP TRÌNH PHÂN TÁN NHÓM 1 balanExpr[headBalan++] = Character.toString(S[headS - 1]); headS ; } S[headS++] = c; continue; } } } if (curNum.length() > 0) balanExpr[headBalan++] = curNum; while (headS - 1 >= 0) . 09073251 TÍNH BIỂU THỨC SỐ LỚN 1 LẬP TRÌNH PHÂN TÍNH BIỂU THỨC SỐ LỚN Tp.HCM, ngày 6 LẬP TRÌNH PHÂN TÁN NHÓM 1 MỤC LỤC TÍNH BIỂU THỨC SỐ LỚN 2 LẬP TRÌNH PHÂN TÁN NHÓM 1 LỜI NÓI ĐẦU Trong thời. nhiều bài toán cùng một lúc, rất may thay với sự hỗ trợ của Lập trình theo hướng phân tán, ta có thể tạo nên một ứng dụng theo hướng phân tán giúp ta có thể giảm thiểu được giời gian xử lí bài toán. tính toán đồng thời nhiều biểu thức cùng một lúc. TÍNH BIỂU THỨC SỐ LỚN 3 LẬP TRÌNH PHÂN TÁN NHÓM 1 1 PHÂN TÍCH BÀI TOÁN 1.1 PHÂN TÍCH CẤU TRÚC DỮ LIỆU. Để giải quyết bài toán tính đa thức với các

Ngày đăng: 29/03/2014, 14:49

Từ khóa liên quan

Mục lục

  • Lời nói đầu

  • 1 Phân tích bài toán

    • 1.1 Phân tích cấu trúc dữ liệu.

      • 1.1.1 Phép toán Cộng:

      • 1.1.2 Phép toán trừ:

      • 1.1.3 Phép nhân.

      • 1.1.4 Tổng kết class BigNum.

      • 1.2 Phân tích bài toán đa thức theo hướng phân tán.

      • 2 Thực thi

        • 2.1 Class Interfacecalculator chứa các interface xử lý các phép toán Bignum

        • 2.2 Class CalculatorImpl dùng để thực thi các phương thức trong class InterfaceCalculator.

        • 2.3 Class Server.

        • 2.4 Class Client.

        • 2.5 Thực thi chương trình.

        • 3 Các mặt hạn chế và hướng phát triển.

          • 3.1 Các mặt hạn chế.

          • 3.2 Hướng phát triển.

Tài liệu cùng người dùng

Tài liệu liên quan