Là một giải pháp quan trọng để trở thành một giải pháp hiệu quả?


9

Tôi giải quyết nhiều vấn đề, chủ yếu là từ Top Coder. Tôi sẽ nhận được câu trả lời cho nhiều người, nhưng hầu hết các lần tôi kết thúc với một giải pháp không hiệu quả.

Trong các triển khai trong thế giới thực - có thực sự là một giải pháp cho vấn đề có hiệu quả không? Nếu vậy làm thế nào tôi có thể cải thiện nó?


4
Bạn đang hỏi từ quan điểm của cuộc thi hay quan điểm thực hiện trong thế giới thực?
rjzii

@RobZ: Trong các triển khai trong thế giới thực
Ant's

1
"thế giới thực" bao phủ rất nhiều mặt đất. Nhúng? Ứng dụng máy chủ? Ứng dụng di động? Phần mềm máy tính cá nhân một người dùng? Mô phỏng khoa học? Các câu trả lời không nhất thiết giống nhau đối với họ.
David Thornley

Câu trả lời:


34

Giải pháp tốt nhất là giải pháp (theo mức độ quan trọng ngày càng tăng) hiệu quả, có thể duy trìthực hiện .

^ ^ Đó là điều duy nhất bạn thực sự cần phải lấy từ câu trả lời này. ^^ ^

Hiệu quả là quan trọng . Có thể ít hơn một chút so với trước đây là do sự phong phú của phần cứng, nhưng Hiệu suất là một Tính năng . Trong một cuộc thi, hiệu quả rõ ràng là quan trọng. Bạn nên biết cách viết mã hiệu quả. Quan trọng hơn, bạn nên biết các thực tiễn tốt nhất sẽ mang lại mã hiệu quả, hiệu suất tốt mà không phải hy sinh tính kịp thời hoặc khả năng duy trì của ứng dụng. Đây thực sự là nơi có chiều sâu kinh nghiệm với một nền tảng và ngôn ngữ mang lại nhiều lợi nhuận.

Quan trọng hơn mặc dù (trong 95% trường hợp), đang có một giải pháp hoàn thành, có thể bảo trì. Không có sản phẩm hoàn chỉnh , việc giải pháp hiệu quả hoặc duy trì hiệu quả đến mức nào . Nếu bạn mất một khoảng thời gian đặc biệt để theo dõi và sửa lỗi hoặc thêm một tính năng mới, thì giải pháp đó không quan trọng. Nhưng, hiệu quả và hiệu suất chắc chắn là quan trọng, bất kể ai có thể nói gì.


3
Vâng Và một chương trình không hiệu quả khủng khiếp, cả chính xác và được thực hiện đều mang đến cho bạn điều gì đó để kiểm tra những cải tiến của bạn.
Mike Sherrill 'Nhớ lại mèo'

1
Phần quan trọng nhất của điều này là biết các thực tiễn tốt nhất về hiệu quả, đặc biệt là trong phát triển cơ sở dữ liệu nơi cá nhân tôi sẽ đặt hiệu quả lên trên khả năng duy trì. Người dùng quan tâm một cách tuyệt vọng về hiệu suất. Tôi thường thấy mã hiệu quả hơn được nói đến là khó bảo trì hơn nhưng chỉ vì nhà phát triển không hiểu được mã hiệu quả hơn để bắt đầu, khi bạn đã quen với các techinques, bạn sẽ chọn những công nghệ đó làm lựa chọn đầu tiên và họ trở nên dễ bảo trì hơn bởi vì bạn hiểu tại sao họ làm việc.
HLGEM

@HLGEM Nếu có bất kỳ phần nào của câu trả lời này mà tôi muốn củng cố như một nguyên tắc chung (bên cạnh dòng đầu tiên), thì đó là cách thực hành tốt nhất để viết mã hiệu quả. Và bạn đã đúng với nhận xét về SQL hiệu quả là quan trọng.
Mike Cellini

8

Tôi đồng ý với Mike Cellini, một điều tôi muốn thêm là.

Là một cái gì đó "đủ hiệu quả"? Ví dụ, từ quan điểm người dùng, không có nhiều sự khác biệt giữa một chức năng hoàn thành trong 0,00001 giây hoặc một chức năng hoàn thành trong 0,1 giây mặc dù một chức năng hiệu quả hơn nhiều so với chức năng khác. Một chức năng hoàn thành trong 10 phút không khác nhiều (đối với người dùng) với chức năng hoàn thành trong 12 phút. Trong cả hai trường hợp, người dùng sẽ nhận được một tách cà phê hoặc tiếp tục với một nhiệm vụ khác.

Tôi đã thấy hiệu quả là "một người dùng hiệu quả" không phải là một thuật toán hiệu quả.


Nguyên tắc nhỏ mà tôi đã nghe là cải thiện 20% có thể được người dùng chú ý. Cả hai đều có vẻ đủ điều kiện, tôi nghĩ rằng một người dùng thực sự có thể cảm thấy sự khác biệt về mức độ đáp ứng giữa .1 và .00001 giây.
Chris Pitman

Chris, bạn có thể đúng khi một người dùng có thể nhận thấy sự khác biệt giữa hai hệ thống cạnh nhau, nhưng liệu một hệ thống có làm cho người dùng hiệu quả hơn đáng kể trong công việc của mình không? Quan sát của tôi (tôi đã làm điều này trong hơn 25 năm) là hai hệ thống sẽ cho phép người dùng thực hiện cùng một lượng công việc trong một thời gian nhất định.
Jaydee

2

Nói chung, giải pháp quan trọng nhất cho một vấn đề sẽ là giải pháp thực sự tồn tại và có giá trị cho các trường hợp khi chúng tồn tại cho vấn đề của bạn. Nói cách khác, tránh tối ưu hóa sớm cho đến khi bạn thực sự biết mình có mã không hiệu quả hoặc mã hiệu quả cần phải nhanh hơn.

Ngoài ra, đừng quên rằng giải pháp tốt nhất cho ứng dụng của bạn có thể không phải là giải pháp chung. Trường hợp và quan điểm, một vài năm trước, một giáo sư đã cho lớp chúng tôi một vấn đề trong đó chúng tôi đã in 10 số đầu tiên của một loại nhất định (xin lỗi, bộ nhớ của tôi làm tôi thất vọng về loại này, nhưng đó là một trong những số khác thường hơn các lớp) và chúng tôi đã được kiểm tra để kiểm tra để đảm bảo rằng số đó là loại đã cho. Đây là mức độ của vấn đề chúng tôi đã đưa ra và chúng tôi đã nói rằng đó là do ngày hôm sau với giải pháp hiệu quả nhất nhận được tín dụng đầy đủ. Bài giảng sau đây giáo sư đã tóm tắt kết quả:

  • Một số sinh viên đã sử dụng một vòng lặp đơn giản và công thức được cung cấp để kiểm tra để đảm bảo các con số là chính xác và hiển thị chúng, chậm nhưng đã hoàn thành công việc, O (n ^ 3).
  • Các sinh viên khác đã thực hiện nghiên cứu của họ và tìm thấy một công thức kiểm tra tốt hơn để đảm bảo rằng một số đã cho là hợp lệ, các chương trình này chạy nhanh hơn nhiều, O (n ^ 2).
  • Một sinh viên đã sử dụng công thức chậm để tạo các giá trị và sau đó sao chép chúng thành một mảng không đổi trong mã của họ và hiển thị nội dung của nó, O (n).

Giải pháp cuối cùng được đánh giá là hiệu quả nhất bởi giáo sư. Hóa ra vấn đề thực sự là một bài tập trong việc hiểu đầy đủ vấn đề và không chỉ đi ra ngoài và tìm giải pháp hiệu quả nhất.

Vấn đề ở trên là khi tìm ra giải pháp hiệu quả, một vấn đề thường tốt hơn là dành thời gian để đảm bảo bạn thực sự hiểu vấn đề là gì trước khi tắt và viết mã, hoặc cố gắng tối ưu hóa mã. Nếu bạn có thể lưu trữ một tập hợp các giá trị tham chiếu trong một mảng không đổi thì tốt hơn bạn nên làm điều đó từ quan điểm hiệu suất hơn là cố gắng viết một số thuật toán ưa thích.

Tương tự, đừng quên rằng đối với hầu hết các ứng dụng, những người duy nhất có xu hướng nhìn thấy mã không hiệu quả (khi nó không cần thiết không hiệu quả!) Là chính các nhà phát triển. Nếu bạn viết mã sạch chỉ thực hiện chính xác những gì nó cần làm thì tỷ lệ cược là phần lớn thời gian người dùng sẽ không nhận thấy vấn đề về hiệu suất khi làm việc với chương trình của bạn và khi họ chỉ tối ưu hóa các phần mà họ đề cập đến bạn.


2

Điều đó phụ thuộc vào cấu trúc của cuộc thi, nhưng nói chung, có: hiệu suất là một sự cân nhắc hầu hết thời gian, theo tài liệu của họ . Đôi khi, như trong liên kết sau, bạn phải săn, nhưng để trích dẫn:

Viết mã sạch, rõ ràng, hiệu quả. Mặc dù không có mục hàng đánh giá cụ thể cho việc này, tuy nhiên người đánh giá có khả năng phản ứng tốt hơn với mã dễ đọc và dễ hiểu. Với mã hiệu quả, bạn có được lợi thế hiệu suất tiềm năng trong kiểm tra căng thẳng và kiểm tra điểm chuẩn, cũng như khả năng (và một vài điểm bổ sung) từ những người đánh giá.

Cách tốt nhất để cải thiện điều này là viết mã hiệu quả, điều mà bạn đang làm. Ngay cả khi bạn hoàn thành công việc, hãy dành thời gian để cải thiện hiệu quả của nó - ngay cả sau cuộc thi - và điều đó sẽ được đền đáp.

Có lẽ bạn cũng muốn đầu tư vào lý thuyết, chẳng hạn như sách về thuật toán , có thể cung cấp cho bạn hai điều: công cụ hiệu quả hơn để giải quyết vấn đề cụ thể và cơ chế hiệu quả hơn để xác định vấn đề bạn phải giải quyết là gì.

Cuối cùng, các khóa học về khoa học máy tính ngày càng có sẵn trực tuyến , và sẽ bao gồm nền tảng bạn cần cải thiện.


Có một phiên bản mới hơn của hướng dẫn thiết kế thuật toán. (11 năm giữa hai người). Có cái gì đó sai với cái mới hơn? Đặc biệt vì nó rẻ hơn cái cũ. Nếu vậy, có lẽ điều đó nên được giải quyết trong câu trả lời của bạn.
Kỹ sư thế giới

Không, tôi chỉ liệt kê cái đầu tiên tôi tìm thấy trên Amazon và không buồn kiểm tra xem đó có phải là phiên bản thứ hai không.
Daniel Pittman

1

Làm thế nào hiệu quả một giải pháp cần phải phụ thuộc vào một số yếu tố. Điều lớn nhất là biết người dùng của bạn muốn gì. Dưới đây là một vài ví dụ.

  1. Nếu bạn là người dùng duy nhất của một khối mã và nó hoạt động tốt với bạn, thì có lẽ bạn vẫn ổn.
  2. Nếu chương trình của bạn sẽ được bán, thì bạn cần phải có một nền tảng mục tiêu trong tâm trí. Kiểm tra nó với nền tảng này. Nếu chương trình đặc biệt chậm, thì bạn cần phải làm cho nó hiệu quả hơn. Nếu nó có vẻ tốt với bạn, hãy giao nó cho những người dùng khác và xem họ có đồng ý không.
  3. Có lẽ chương trình có những cân nhắc khác. Nếu bạn đang xây dựng, giả sử, một chương trình dựa trên máy chủ, thì bạn có thể cần phải làm việc rất chăm chỉ để làm cho chương trình hiệu quả nhất có thể. Hoặc, nếu nó chạy trên bộ vi xử lý, hãy chắc chắn rằng nó cũng hoạt động ở đó.

Cách làm cho mã của bạn hiệu quả hơn:

  1. Bước đầu tiên là có được một ý tưởng về những gì đang mất nhiều thời gian nhất. Bí quyết là làm một cái gì đó gọi là mã hồ sơ. Tìm kiếm những gì đang mất nhiều thời gian nhất, và xem nếu bạn có thể tìm ra một cách để làm cho nó chạy nhanh hơn.
  2. Có lẽ yếu tố giới hạn chính là bộ nhớ. Nếu đó là trường hợp, tìm kiếm những gì đang chiếm phần lớn bộ nhớ, và xem làm thế nào bạn có thể giảm nó.

Có cả một lĩnh vực để tối ưu hóa, nhưng hai mẹo trên ít nhất nên giúp bạn bắt đầu.


1

Đối với một cuộc thi, bạn cần phải hiểu ai là giám khảo và họ nói về điều gì - nếu họ đang tìm kiếm những lập trình viên giỏi và không có gì nữa, thì bạn sẽ nhận được danh hiệu cho mã hiệu quả hơn.

Theo quy định, trong thế giới thực, nó không quan trọng. Một trong những ý tưởng chính của phát triển phần mềm là "Đừng tối ưu hóa những gì bạn không biết cần tối ưu hóa", sau đó "Chỉ tối ưu hóa khi được chứng minh rằng nó là bắt buộc"

Nhiều học viên sẽ lập luận rằng điều này dẫn đến mã cồng kềnh, kém hiệu quả, không thể dễ dàng sửa chữa và trong một số trường hợp cạnh (mà họ sẽ tập trung lại như thể đó là điều mà hầu hết các lập trình viên làm cả ngày mỗi ngày) họ đều đúng. Tuy nhiên, không có nhiều dự án phát triển phần mềm đã đo lường kết quả "Hiệu suất: Nhanh hơn mức cần thiết, Chi phí: Ai quan tâm, Thời gian giao hàng: Đôi khi trong thập kỷ này", trong thế giới thực, thường là "Tôi muốn nó rẻ, tôi muốn nó ngày hôm qua, tôi muốn nó hoạt động ".

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.