Có và không. Nó phụ thuộc vào các ràng buộc bạn muốn đáp ứng và các điều kiện tiên quyết cần thiết để chạy thuật toán của bạn.
Lý tưởng nhất, một thuật toán là một công thức trừu tượng xác định từng bước làm thế nào để làm một cái gì đó. Các thuật toán được định nghĩa như vậy với mục tiêu tái sản xuất và tự động hóa sau này. Các thuật toán bắt nguồn từ tính toán lambda, vì vậy bạn có thể dễ dàng thấy lý do tại sao chúng được thực hiện theo cách như vậy. Định nghĩa này là thông thường, nhưng các thuật toán hiện đại có thể không tuần tự (không phải từng bước, như thuật toán đồng thời hoặc logic như thuật toán sử dụng thống nhất), phi tuyến tính (thuật toán ngẫu nhiên) hoặc chỉ đơn giản là kỳ lạ (lượng tử thuật toán), nhưng tôi sẽ vượt qua nó.
Vì vậy, lý tưởng nhất, một thuật toán nên càng trừu tượng càng tốt mà không tính bất kỳ phần cứng nào.
Nhưng, như với bất kỳ hệ thống nào, bạn phải xác định một số tiên đề , không chỉ để có được một hệ thống mạch lạc, mà còn để đạt được thời gian. Ví dụ, hầu hết các thuật toán đều cho rằng, ít nhất là ngầm định, chúng được định nghĩa trên máy Von-Neumann. Nếu đó không phải là trường hợp, họ sẽ cần xác định rõ ràng từng phần của hệ thống mà họ cần được chạy (vì điều này là bắt buộc để sao chép công thức, đây là một điều kiện tiên quyết). Ngoài ra, thường các thuật toán dựa vào các lệnh phổ biến như write () mà không xác định chúng đầy đủ.
Một lý do khác tại sao các thuật toán không quá trừu tượng từ kiến trúc phần cứng, là khi bạn cần phải đáp ứng một số ràng buộc .
Giả sử bạn đang làm việc trên các hệ thống nhúng, thì có lẽ bạn không thể dựa vào cùng một lượng tài nguyên bạn có trên máy trạm. Một trong những tài nguyên bị hạn chế nhất có lẽ là bộ nhớ. Tuy nhiên, hầu hết các thuật toán có xu hướng tối ưu hóa độ phức tạp thời gian (tốc độ thực thi trên CPU), chứ không phải độ phức tạp của bộ nhớ (lượng bộ nhớ cần thiết để làm việc trên dữ liệu). Đối với các hệ thống này, các thuật toán tối ưu hóa bộ nhớ đã được phát minh trong đó các thuật toán không tối ưu hóa bộ nhớ sẽ thất bại hoặc chạy chậm hơn rất nhiều. Trong thực tế, các hệ thống nhúng không phải là mục tiêu duy nhất của các thuật toán hiệu quả bộ nhớ: ví dụ: có các thuật toán lãng quên bộ nhớ cache điều chỉnh quá trình xử lý của chúng để sử dụng hiệu quả bộ đệm CPU. Một ví dụ khác: một số thuật toán học máy cho dữ liệu lớn được thiết kế chohọc tập gia tăng hoặc tính toán ngoài lõi để xử lý lượng dữ liệu khổng lồ lớn hơn nhiều so với bộ nhớ có sẵn trên bất kỳ máy tính nào, v.v.
Ngoài ra còn có các thuật toán không tối ưu hóa một phần cụ thể của máy tính, nhưng một tiêu chuẩn phụ thuộc vào kiến trúc phần cứng. Ví dụ, dữ liệu số cần độ chính xác được lưu trữ bên trong float hoặc double, về bản chất bị giới hạn do giới hạn phần cứng. Vấn đề là các tính toán phức tạp có thể dẫn đến làm tròn và bạn càng thực hiện nhiều phép tính hơn các số được làm tròn, bạn sẽ càng trôi đi. Điều này được gọi là một sự can thiệp thảm khốc . Một số ứng dụng cần độ chính xác quan trọng, thậm chí với chi phí phức tạp nhất. Đối với loại ứng dụng này, các thuật toán tối ưu hóa tính toán của chúng để giảm hoặc loại bỏ nhiễu nghiêm trọng đã được thực hiện.
Do đó, thiết kế một thuật toán cũng có thể là sự đánh đổi giữa sự trừu tượng và các ràng buộc.
Cuối cùng, chúng ta có thể nói rằng một thuật toán cũng trừu tượng như mục tiêu của nó và như là điều kiện tiên quyết (kiến trúc) của nó . Mục tiêu cụ thể hơn mà thuật toán của bạn nhắm đến, nó có thể sẽ càng dựa vào kiến trúc phần cứng.
Một số từ khóa liên quan có thể bạn quan tâm: