2013-02-27 38 views
5

Chương trình của tôi sử dụng Math.pow() để tính số lượng gấp đôi tương đối lớn với sức mạnh của 2. Sau đó, tôi cần tìm căn bậc hai của một đôi rất lớn con số. Vấn đề là, tôi phải làm điều này hơn 100.000 lần và mất nhiều thời gian. Có cách nào khác có thể tăng tốc quá trình này không? Cảm ơnJava - Thay thế nhanh hơn cho Math.pow() và Math.sqrt()

Chỉnh sửa: Theo số lượng lớn, tôi có nghĩa là trong khoảng từ 1000 đến 10000 (Vì vậy, có thể không quá lớn về mặt tính toán). Và trong thời gian dài, phải mất khoảng 30 giây để thực hiện chức năng 500 lần

+0

bạn phải thực hiện thao tác tương tự này với 100.000 số duy nhất? – Brad

+5

Bạn có thể xác định "tương đối lớn", "rất lớn" và "thực sự dài" không? – asteri

+0

http://stackoverflow.com/questions/7902418/the-best-alternative-of-math-pow-in-j2me – Brad

Trả lời

7

Bạn không thể tìm thấy một triển khai tốt hơn (nhanh hơn) so với Java Math. Bạn có thể có nhiều may mắn cố gắng thay đổi cách bạn thực hiện các phép tính trong thuật toán của mình. Ví dụ, có cách nào bạn có thể tránh tìm căn bậc hai của một số lớn không?

Nếu cách này không hiệu quả, bạn có thể thử triển khai nó bằng ngôn ngữ thích hợp hơn có nghĩa là tính toán toán học nhanh (ví dụ như Matlab).

Nếu không, bạn có thể thử tối ưu hóa điều này ở các khu vực khác. Có lẽ bạn có thể thử cache kết quả trước đây nếu chúng hữu ích sau này.

+0

Cũng liên quan đến công thức khoảng cách Euclide nên tôi không thể tránh được nó – Matt9Atkins

+0

@ Matt9Atkins làm bạn thực sự cần khoảng cách euclide? Bạn có thể sử dụng hình vuông của nó để so sánh ... –

+0

Cũng vẫn có các tùy chọn để tăng tốc độ này. Bạn có cần khoảng cách thực sự không, hoặc bạn chỉ cần so sánh chúng? Nếu bạn chỉ so sánh chúng, bạn có thể tránh phần gốc hình vuông. – Oleksi

8

"Sức mạnh của 2" là bình phương. Bạn nên làm điều đó bằng cách nhân số của chính nó.

Phiên bản thư viện của sqrt có lẽ nhanh hơn bất kỳ thứ gì bạn có thể đào lên ở nơi khác. Nếu bạn gọi một thường trình C, bạn sẽ chỉ cần thêm phí từ cuộc gọi đa ngôn ngữ. Nhưng bạn cần rễ vuông chính xác, hoặc một bảng tra cứu xấp xỉ sẽ làm gì? Các giá trị có lặp lại rất nhiều, tức là bạn có thường cần tính số gốc của cùng một số không? Nếu vậy, việc lưu bộ nhớ đệm vào các ô vuông trong một HashMap có thể nhanh hơn việc tính toán chúng.

1

Vấn đề của bạn với sức mạnh của 2 có thể được thực hiện đơn giản bằng cách nhân số đó với chính nó. Ví dụ, cho phép nói biến a là số bạn muốn nâng cao để 2. Nó giống như: int a=5; int b=a*a;

0

Bạn có thể sử dụng x * x thay vì pow (x, 2).

Đối với căn bậc hai, trước tiên bạn nên xem xét triển khai sqrt (phương pháp xấp xỉ).

Có thể bạn có thể tìm thấy mẫu mã tốt hơn, ví dụ: Newton's method (trên phương trình sqrt (N) -x = 0).

Nó cũng phụ thuộc vào độ chính xác cần thiết, bạn có thể giao dịch chính xác so với thời gian.

Bạn cũng có thể lưu trữ kết quả để tránh nhiều tính toán trên cùng một mục nhập.

+0

Chắc chắn bạn có nghĩa là bạn có thể sử dụng 'x * x' thay cho' pow (x, 2) '. Và có, nó là chắc chắn tốt hơn để tính toán nó như x * x. – NovaDenizen

+0

đúng, cố định ... – fso

1

điều duy nhất tôi có thể nghĩ đến là lưu trữ kết quả cho tốc độ, căn bậc hai sẽ không thay đổi và ~ 9000 số được lưu trữ không nhiều. Bạn có thể sẽ làm tốt để khung dữ liệu của bạn, để bạn có thể đảm bảo rằng bạn có thể tối ưu tìm kiếm kết quả phù hợp.

Các vấn đề liên quan