Các thuật toán (và hiệu quả nói chung) có ít quan trọng hơn không?


29

Vì sức mua tính toán có giá cả phải chăng hơn nhiều so với trước đây, kiến ​​thức về thuật toán và hiệu quả có trở nên ít quan trọng hơn không? Rõ ràng là bạn sẽ muốn tránh một vòng lặp vô hạn, vì vậy, không phải mọi thứ đều diễn ra. Nhưng nếu bạn có phần cứng tốt hơn, bạn có thể có phần mềm nào đó tồi tệ hơn không?


2
"cả có và không"!
vzn

4
Bây giờ máy bay đã tồn tại và vận tải hàng hóa xuyên Đại Tây Dương không còn phải đi trên tàu nữa, tốc độ vận chuyển có kém quan trọng không? Khách hàng của FedEx và DHL không nghĩ vậy.
Peter Shor

2
Nếu kích thước của đầu vào đủ lớn, sự khác biệt về thứ tự giữa các thuật toán là rất quan trọng cho dù máy có nhanh đến đâu. Nhưng đôi khi tôi bị lừa thực hiện các thay đổi để "tối ưu hóa" sự khác biệt yếu tố không đổi chỉ để nhận ra rằng việc sử dụng các biểu thức được tích hợp trong đường cú pháp của ngôn ngữ lập trình <ho> Python </ ho> nhanh hơn đáng kể so với "tối ưu hóa" của tôi.
kojiro

xem thêm luật neo đậu
vzn

một trường hợp nghiên cứu thú vị ở đây là Windows, trong một số / nhiều cách hoạt động kém hiệu quả ngay cả trên phần cứng được tối ưu hóa cao so với trước đây ... giống như luật neo đậu đang cải thiện phần cứng, dường như có một luật lạm phát tương ứng trong phần mềm phần mềm hiện đại đang làm nhiều hơn mọi lúc, với các lớp mới được thêm vào và nhân lên ... hơi giống với cách một loại khí lấp đầy tất cả khối lượng có sẵn ... hoặc trong đó một ngân sách cho dù có lớn hay tăng luôn được sử dụng hay tăng hơi tràn ngập ... xem thêm chủng tộc tiến hóa
vzn

Câu trả lời:


31

Tôi thực sự thích ví dụ từ cuốn sách Giới thiệu về Thuật toán , trong đó minh họa tầm quan trọng của hiệu quả thuật toán:

Hãy so sánh hai thuật toán sắp xếp: sắp xếp chènsắp xếp hợp nhất . Độ phức tạp của chúng lần lượt là và . Thông thường sắp xếp hợp nhất có hệ số hằng lớn hơn, vì vậy, giả sử . O ( n log n ) = c 2 n lg n c 1 < c 2Ôi(n2)= =c1n2Ôi(nđăng nhậpn)= =c2nlgnc1<c2

Để trả lời câu hỏi của bạn, chúng tôi đánh giá thời gian thực hiện của một máy tính (A) chạy thuật toán sắp xếp chèn nhanh hơn so với máy tính chậm hơn (B) chạy thuật toán sắp xếp hợp nhất.

Chúng tôi giả sử:

  • kích thước của bài toán đầu vào là 10 triệu số: ;n= =107
  • máy tính A thực hiện hướng dẫn mỗi giây (~ 10GHz);1010
  • máy tính B chỉ thực hiện lệnh mỗi giây (~ 10 MHz);107
  • các yếu tố không đổi là (được đánh giá quá thấp) và (trong thực tế là nhỏ hơn).c 2 = 50c1= =2c2= =50

Vì vậy, với những giả định này, nó cần

107

2(107)2 hướng dẫn1010 hướng dẫn/thứ hai= =2104 giây
cho máy tính A để sắp xếp số và107

50107lg107 hướng dẫn107 hướng dẫn/thứ hai1163 giây

cho máy tính B.

Vì vậy, máy tính, chậm hơn 1000 lần, có thể giải quyết vấn đề nhanh hơn 17 lần. Trong thực tế, lợi thế của sắp xếp hợp nhất sẽ còn quan trọng hơn và tăng theo quy mô của vấn đề. Tôi hy vọng ví dụ này giúp trả lời câu hỏi của bạn.

Tuy nhiên, đây không phải là tất cả về độ phức tạp của thuật toán. Ngày nay, gần như không thể có được một sự tăng tốc đáng kể chỉ bằng cách sử dụng máy có tần số CPU cao hơn. Mọi người cần thiết kế các thuật toán cho các hệ thống đa lõi có quy mô tốt. Đây cũng là một nhiệm vụ khó khăn, vì với sự gia tăng của lõi, chẳng hạn, chi phí quản lý truy cập bộ nhớ cũng tăng theo. Vì vậy, gần như không thể có được một tăng tốc tuyến tính.

Vì vậy, để tóm tắt, việc thiết kế các thuật toán hiệu quả ngày nay cũng quan trọng như trước đây, bởi vì không tăng tần số hay lõi bổ sung sẽ cung cấp cho bạn tốc độ so với thuật toán hiệu quả mang lại.


4
Điều đáng nói là sự bất khả thi của việc tăng tốc tuyến tính xuất phát từ luật của Amdhal .
Bartosz Przybylski

Luật của Amdhal không phải lúc nào cũng được áp dụng. Có rất nhiều vấn đề trong khoa học tính toán trong đó tỷ lệ công việc không thể thay đổi giảm xuống 0 khi kích thước vấn đề tăng lên. Giả sử máy tính mất công việc và bạn cần tính toán cho khác nhau . Trong nối tiếp, chi phí thời gian là , trong khi song song với bộ xử lý, công việc là . f(x)n2Σtôi= =1nf(xtôi)nxtôi'SÔi(nn2+n)= =Ôi(n3)nÔi(n2+n)= =Ôi(n2)
Nick Alger

"Vì vậy, máy tính, chậm hơn 1000 lần, có thể giải quyết vấn đề nhanh hơn 17 lần." Đây là một tuyên bố sai khi bạn kết hợp tốc độ phần cứng và các thuật toán khác nhau cùng một lúc. Thay vì so sánh máy tính A với máy tính B cho từng loại sắp xếp riêng biệt. (Tại sao tôi không thể sử dụng sắp xếp hợp nhất trên Máy tính A hoặc sắp xếp chèn vào Máy tính B?)
AquaAlex

3
@AquaAlex, mục đích của ví dụ là chỉ ra rằng máy tính chậm có thể hoạt động tốt hơn máy tính nhanh chỉ bằng thuật toán được chọn. Chúng ta có thể so sánh thời gian thực hiện cho từng loại sắp xếp riêng biệt hoặc chạy sắp xếp hợp nhất trên A và sắp xếp chèn vào B. Nhưng cho thấy một máy tính nhanh hơn thường hoạt động tốt hơn so với loại chậm chỉ không có ý nghĩa.
Pavel Zaichenkov

Vì vậy, ý tưởng là chỉ ra rằng một thuật toán hiệu quả hơn vẫn mang trọng lượng ngay cả trong ngày trên bộ nhớ cpu nhanh hơn và lớn hơn.
AquaAlex

36

Trái lại. Đồng thời phần cứng ngày càng rẻ hơn, một số phát triển khác diễn ra.

Đầu tiên, lượng dữ liệu cần xử lý đang tăng theo cấp số nhân. Điều này đã dẫn đến việc nghiên cứu các thuật toán thời gian quasilinear và khu vực của dữ liệu lớn . Ví dụ, hãy suy nghĩ về các công cụ tìm kiếm - họ phải xử lý khối lượng truy vấn lớn, xử lý lượng lớn dữ liệu và thực hiện nhanh chóng. Các thuật toán là quan trọng hơn bao giờ hết.

Thứ hai, lĩnh vực học máy đang phát triển mạnh mẽ và có đầy đủ các thuật toán (mặc dù thuộc loại khác so với những gì bạn học trong BA của mình). Khu vực này đang phát triển mạnh và thường thì một thuật toán thực sự mới được phát minh và cải thiện hiệu suất đáng kể.

Thứ ba, các thuật toán phân tán đã trở nên quan trọng hơn, vì chúng ta đang đạt được một rào cản trong việc tăng tốc độ xử lý CPU . Ngày nay sức mạnh tính toán đang được tăng lên bằng cách song song , và điều đó liên quan đến các thuật toán chuyên dụng.

Thứ tư, để đối trọng với sức mạnh ngày càng tăng của CPU, các mô hình lập trình hiện đại sử dụng các phương pháp máy ảo để chống lại các lỗ hổng bảo mật. Điều đó làm chậm các chương trình này bởi một yếu tố đáng giá. Thêm vào câu hỏi hóc búa, hệ điều hành của bạn đang đầu tư nhiều thời gian CPU hơn vào chuông và còi, để lại ít thời gian CPU hơn cho các chương trình thực tế của bạn, có thể bao gồm các thuật toán chuyên sâu về CPU như nén và giải nén video. Vì vậy, trong khi phần cứng nhanh hơn, nó không được sử dụng hiệu quả.

Tóm tắt, thuật toán hiệu quả là cần thiết để xử lý lượng lớn dữ liệu; các loại thuật toán mới đang xuất hiện trong lĩnh vực trí tuệ nhân tạo ; các thuật toán phân tán đang được chú trọng; và sức mạnh CPU được khai thác kém hiệu quả hơn vì nhiều lý do (nhưng chủ yếu là vì máy tính ngày càng mạnh hơn). Các thuật toán chưa chết.


"thuật toán vẫn chưa chết" ... hoàn toàn ngược lại, chúng ta có khả năng sống qua "thời kỳ hoàng kim của thuật toán" ....
vzn

12

Kiến thức về thuật toán là nhiều hơn so với cách viết thuật toán nhanh.

Nó cũng cung cấp cho bạn các phương pháp giải quyết vấn đề (ví dụ: chia và chinh phục, lập trình động, tham lam, giảm thiểu, lập trình tuyến tính, v.v.) mà sau đó bạn có thể áp dụng khi tiếp cận một vấn đề mới và đầy thách thức. Có một cách tiếp cận phù hợp thường dẫn đến các mã đơn giản hơn và nhanh hơn để viết. Vì vậy, tôi không đồng ý với câu trả lời của Kevin vì các mã không được đặt cẩn thận với nhau thường không chỉ chậm mà còn phức tạp. Tôi thích câu nói này của David Parnas:

Tôi thường nghe các nhà phát triển được mô tả là "một người biết cách xây dựng một hệ thống lớn một cách nhanh chóng". Không có mẹo trong việc xây dựng các hệ thống lớn một cách nhanh chóng; bạn xây dựng chúng càng nhanh, chúng càng lớn!

(Tất nhiên, chúng ta cũng cần kết hợp các thuật toán với các phương pháp thiết kế phần mềm để viết mã tốt.)

Kiến thức về thuật toán cũng cho chúng ta biết cách tổ chức dữ liệu của bạn để bạn có thể xử lý chúng dễ dàng và hiệu quả hơn thông qua việc sử dụng các cấu trúc dữ liệu.

Hơn nữa, nó cho chúng ta một cách để ước tính hiệu quả của cách tiếp cận của bạn và để hiểu sự đánh đổi giữa một số cách tiếp cận khác nhau về độ phức tạp thời gian, độ phức tạp không gian và độ phức tạp của mã. Biết những sự đánh đổi này là chìa khóa để đưa ra quyết định đúng đắn trong các ràng buộc tài nguyên của bạn.

Về tầm quan trọng của hiệu quả phần mềm, tôi sẽ trích dẫn Luật Wirth:

Phần mềm đang trở nên chậm hơn nhanh hơn phần cứng trở nên nhanh hơn.

Gần đây, Larry Page đã khôi phục rằng phần mềm bị chậm gấp đôi cứ sau 18 tháng, và do đó vượt xa định luật của Moore.


7

Vâng , họ "tương đối" ít quan trọng hơn trong ngành công nghiệp rộng lớn. Trình chỉnh sửa văn bản có thể 'đủ nhanh' và nó có thể không cần nhiều cải tiến. Phần lớn nỗ lực CNTT nhằm đảm bảo thành phần A được viết bằng Java hoạt động với thành phần B được viết bằng C giao tiếp chính xác thông qua hàng đợi tin nhắn được viết bằng Cobol (hoặc một cái gì đó) hoặc để đưa sản phẩm ra thị trường, v.v.

Hơn nữa, kiến ​​trúc trở nên phức tạp. Khi bạn có bộ xử lý đơn giản cũ, trong đó bạn có 1 lệnh cho mỗi chu kỳ và bạn đã viết trong phần lắp ráp, việc tối ưu hóa là 'dễ dàng' (bạn chỉ cần đếm số lượng hướng dẫn). Hiện tại bạn không có bộ xử lý đơn giản nhưng bộ xử lý hoàn chỉnh, siêu cấp, không theo thứ tự với việc đổi tên đăng ký và bộ đệm nhiều cấp. Và bạn không viết theo cụm nhưng bằng C / Java / vv. trong đó mã được biên dịch / JITed (thường là mã tốt hơn thì bạn hoặc tôi sẽ viết trong tập hợp) hoặc bằng Python / Ruby / ... nơi mã được diễn giải và bạn bị tách biệt bởi một số mức độ trừu tượng khỏi máy. Microoptimalization rất khó và hầu hết các lập trình viên sẽ đạt được hiệu quả ngược lại.

Không , chúng quan trọng hơn bao giờ hết trong nghiên cứu và theo thuật ngữ 'tuyệt đối' . Có những lĩnh vực mà tốc độ là quan trọng vì chúng hoạt động trên một lượng lớn dữ liệu. Trên thang đo này, các vấn đề phức tạp như được thể hiện bởi ví dụ Pavel.

Tuy nhiên, có nhiều trường hợp khác - đi xuống từ thuật toán vẫn là một tùy chọn được chọn khi vấn đề tốc độ (HPC, thiết bị nhúng, v.v.). Bạn sẽ tìm thấy trên nhiều nhóm trường đại học chuyên về trình biên dịch và / hoặc tối ưu hóa phần mềm. Ví dụ, một hoán đổi đơn giản của thứ tự vòng lặp có thể tăng tốc một nghìn lần chỉ vì nó sử dụng bộ đệm một cách hiệu quả - trong khi đó có thể là một ví dụ về đường biên, khoảng cách bộ nhớ CPU tăng 1000 lần trong 30 năm qua. Kiến trúc máy tính cũng là một phần của CS. Do đó, nhiều cải tiến về tốc độ tính toán trên thực tế là một phần của lĩnh vực CS nói chung.

Về mặt công nghiệp - khi bạn gặp vấn đề về tốc độ cụm HPC vì chương trình đơn lẻ có thể chạy trong nhiều ngày, nhiều tháng hoặc nhiều năm. Không chỉ bạn cần thanh toán hóa đơn tiền điện mà chờ đợi cũng có thể tốn tiền. Bạn có thể ném gấp đôi số phần cứng nhưng 700M $ khó có thể được coi là thay đổi túi cho tất cả các công ty lớn nhất - trong trường hợp như vậy, các lập trình viên là lựa chọn rẻ hơn và nếu viết lại chương trình sang ngôn ngữ mới có nghĩa chỉ là một sự tăng tốc 'nhỏ' - họ có thể xem xét nó

Ngoài ra tốc độ có thể có nghĩa là UX tốt hơn. Nhiều đánh giá về điện thoại di động Hệ điều hành cho biết cái nào là 'snappier' và trong khi nó có thể được thực hiện bằng 'thủ thuật' thì đó chắc chắn là một lĩnh vực nghiên cứu. Ngoài ra, bạn muốn truy cập dữ liệu của mình nhanh hơn và nhanh chóng làm những gì bạn cần. Đôi khi, điều đó có nghĩa là bạn có thể làm nhiều hơn - trong các trò chơi bạn có 0,017 giây để làm mọi thứ và bạn càng nhanh thì bạn càng có nhiều kẹo.


2

Đó là một cuộc thảo luận thú vị. Và chúng tôi có một vài điều để xem xét ở đây.

  1. Khoa học máy tính lý thuyết - Đây là một ngành khoa học phát triển, có nghĩa là khi thời gian trôi qua, chúng ta sẽ tìm ra những cách mới và tốt hơn để giải quyết vấn đề, có nghĩa là các thuật toán cải tiến để tìm kiếm và sắp xếp chẳng hạn.

  2. Cộng đồng lớn hơn / thư viện lớn hơn - Bởi vì rất nhiều công việc đã được thực hiện bởi những người khác, chúng tôi chỉ có thể xây dựng dựa trên công việc của họ và sử dụng các thuật toán họ đã tạo và thậm chí mã hóa. Và các thư viện này sẽ được cập nhật theo thời gian cho phép chúng tôi tự động truy cập vào các chương trình / thuật toán hiệu quả hơn.

  3. Phát triển - Bây giờ ở đây chúng tôi có một vấn đề tôi nghĩ. Rất nhiều lập trình viên không phải là nhà khoa học máy tính nên họ viết mã để giải quyết các vấn đề kinh doanh không phải là vấn đề kỹ thuật / lý thuyết và sẽ rất vui khi sử dụng một loại bong bóng như một cách sắp xếp nhanh chóng chẳng hạn. Và ở đây tốc độ của phần cứng đang cho phép các lập trình viên xấu thoát khỏi việc sử dụng các thuật toán xấu và thực hành mã hóa xấu. Bộ nhớ, tốc độ CPU, không gian lưu trữ những thứ này không còn là mối quan tâm lớn và cứ sau vài tháng mọi thứ lại trở nên lớn hơn, nhanh hơn và rẻ hơn. Tôi có nghĩa là nhìn vào các điện thoại di động mới. Chúng bây giờ tiên tiến hơn các máy tính / máy chủ máy tính lớn từ những năm 1970/80. Lưu trữ nhiều hơn, sức mạnh xử lý nhiều hơn, bộ nhớ nhanh hơn.

  4. UI & DATA - Giao diện người dùng / Trải nghiệm người dùng và DATA hiện được coi là quan trọng hơn mã siêu hiệu quả trong hầu hết các lĩnh vực phát triển. Vì vậy, tốc độ chỉ trở thành và vấn đề khi người dùng phải chờ đợi lâu. Nếu chúng tôi cung cấp cho người dùng một cái nhìn và cảm nhận tốt và anh ta nhận được phản hồi tốt từ ứng dụng thì anh ta rất vui. Và nếu doanh nghiệp biết tất cả dữ liệu được lưu trữ an toàn và bảo mật và họ có thể truy xuất dữ liệu đó và thao tác bất cứ lúc nào họ không quan tâm đến việc cần bao nhiêu dung lượng.

Vì vậy, tôi phải nói rằng không phải các lập trình viên hiệu quả không còn quan trọng hay cần thiết nữa, chỉ là rất ít công ty / người dùng thưởng cho mọi người vì họ là những lập trình viên siêu hiệu quả, và vì phần cứng tốt hơn nên chúng ta đang tránh xa hiệu quả. Nhưng ít nhất vẫn có những người ngoài kia tập trung vào hiệu quả và vì tinh thần cộng đồng, mọi người đều có được lợi ích từ việc này.


1

Một số góc độ khác về câu hỏi thú vị và sâu sắc này nhấn mạnh các khía cạnh liên ngành và xuyên suốt của hiện tượng. Dai trích dẫn luật của Wirth trong câu trả lời của mình:

Phần mềm đang trở nên chậm hơn nhanh hơn phần cứng trở nên nhanh hơn.

Có nhiều điểm tương đồng thú vị của ý tưởng này với các hiện tượng quan sát được trong kinh tế học. Lưu ý rằng kinh tế học có nhiều mối liên hệ sâu sắc với khoa học máy tính, ví dụ như lập lịch trình trong đó các nguồn tài nguyên khan hiếm (nói chủ đề, v.v.) được phân bổ theo yêu cầu, bằng thuật toán "cân bằng tải". Một ví dụ khác là những gì được gọi là hàng đợi sản xuất-người tiêu dùng. Ngoài ra, đấu giá.

Ngoài ra, ví dụ, Danh sách các luật cùng tên, Wikipedia :

Luật Parkinson - "Công việc mở rộng để lấp đầy thời gian hoàn thành." Được đặt ra bởi C. Northcote Parkinson (1909 Hay1993), người cũng đặt ra hệ quả của nó, "Chi tiêu tăng lên để đáp ứng thu nhập." Trong máy tính: Các chương trình mở rộng để lấp đầy tất cả bộ nhớ khả dụng.

Có một số điểm tương đồng mạnh mẽ với nghịch lý của Jevon đã được quan sát thấy trong việc tăng sử dụng năng lượng sau khi động cơ hơi nước hiệu quả hơn của watt bắt đầu thay thế thiết kế Newcomen, nhưng việc sử dụng hoặc tăng sinh của động cơ tăng lên:

Trong kinh tế học, nghịch lý Jevons (/ ˈdʒɛvənz /; đôi khi hiệu ứng Jevons) là đề xuất rằng tiến bộ công nghệ làm tăng hiệu quả sử dụng tài nguyên có xu hướng tăng (thay vì giảm) tốc độ tiêu thụ của tài nguyên đó.

Điểm tương đồng là phần cứng là tài nguyên và phần mềm giống như việc tiêu thụ tài nguyên (hay còn gọi là cung so với cầu). Vì vậy, phần mềm và phần cứng (và những tiến bộ trong mỗi) tồn tại phần nào trong một vòng phản hồi cộng sinh được kết hợp chặt chẽ với nhau, theo một nghĩa nào đó, cùng tồn tại . Có nhiều yếu tố phức tạp và liên quan đến nhau ảnh hưởng đến sự tương tác này, ví dụ:


Tại sao các downvote? Tôi thấy đề cập đến luật Parkinson và nghịch lý Jevons rất lộ liễu.
Yuval Filmus

@YuvalFilmus Tôi đoán: vấn đề với ngữ pháp. Lần này tôi không thấy phiền vì khả năng đọc câu trả lời quá nhiều, nhưng tôi đã cố gắng cải thiện nó.
Juho

1
Đó không phải là "vấn đề với ngữ pháp", đó là một phong cách khác. Giống như nói rằng một người bản ngữ mắc "lỗi" khi nói ngôn ngữ của họ, trong khi thực tế, ngôn ngữ đang thay đổi hoặc có sự khác biệt trong khu vực. Trong trường hợp này, đó là phong cách thành ngữ của vzn.
Yuval Filmus

-3

Không, chủ yếu là trong khi xem xét sự phức tạp không gian! Dung lượng lưu trữ của một máy tính bình thường đang tăng theo cấp số nhân.


Sẽ không được ngược lại - nếu bạn có bộ nhớ 'vô hạn', bạn sẽ không cần bận tâm về sự phức tạp của không gian. "Vấn đề" không phải là lưu trữ tăng lên mà là dữ liệu để hoạt động tăng lên đồng bộ hóa việc tăng tốc được cung cấp bằng cách tăng sức mạnh tính toán và bộ nhớ - đó là một điều tốt, chúng tôi muốn mô hình vũ trụ một cách thực tế hơn, gấp nhiều protein hơn, v.v. (PS. Tôi đã không bỏ phiếu)
Maciej Piechotka

4
Đúng là nhiều nhà phát triển ứng dụng di động dường như chiếm tài nguyên vô hạn, nhưng thật không may, thiết bị của tôi rất hữu hạn.
Raphael
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.