2010-04-09 27 views
6

Chủ đề của lớp thuật toán ngày nay đã được thực hiện lại cấu trúc dữ liệu, cụ thể là ArrayList trong Java. Thực tế là bạn có thể tùy chỉnh một cấu trúc theo nhiều cách khác nhau chắc chắn khiến tôi quan tâm, đặc biệt là với các biến thể của phương thức add() & iterator.remove().Thực hiện lại cấu trúc dữ liệu trong thế giới thực

Nhưng là reimplementing và tùy chỉnh cấu trúc dữ liệu cái gì đó là quan tâm nhiều hơn cho các học giả vs các lập trình viên thực tế? Có ai reimplemented phiên bản riêng của họ về một cấu trúc dữ liệu trong một ứng dụng thương mại/chương trình, và tại sao bạn đã chọn con đường đó trên thực hiện ngôn ngữ cụ thể của bạn?

Trả lời

4

Biết cách cấu trúc dữ liệu được triển khai và có thể được triển khai thực sự là mối quan tâm đối với tất cả mọi người, không chỉ là các học giả. Mặc dù bạn sẽ không thể triển khai lại cấu trúc dữ liệu nếu ngôn ngữ đã cung cấp một triển khai với các hàm và đặc tính hiệu năng phù hợp, rất có thể bạn sẽ phải tạo cấu trúc dữ liệu của riêng mình bằng cách soạn các cấu trúc dữ liệu khác ... hoặc bạn có thể cần triển khai cấu trúc dữ liệu với hành vi hơi khác so với cấu trúc dữ liệu nổi tiếng. Trong trường hợp đó, bạn chắc chắn sẽ cần biết cấu trúc dữ liệu ban đầu được triển khai như thế nào. Ngoài ra, bạn có thể cần một cấu trúc dữ liệu không tồn tại hoặc cung cấp hành vi tương tự cho cấu trúc dữ liệu hiện có, nhưng cách mà nó được sử dụng yêu cầu nó được tối ưu hóa cho một tập hợp các hàm khác. Một lần nữa, tình huống như vậy sẽ yêu cầu bạn phải biết cách thực hiện (và thay đổi) cấu trúc dữ liệu, vì vậy có nó là quan tâm.

Sửa
Tôi không ủng hộ mà bạn reimplement datastructures hiện! Đừng làm thế. Điều tôi đang nói là kiến ​​thức có ứng dụng thực tế. Ví dụ: bạn có thể cần phải tạo cấu trúc dữ liệu bản đồ hai chiều (bạn có thể thực hiện bằng cách soạn hai cấu trúc dữ liệu bản đồ một chiều) hoặc bạn có thể cần tạo ngăn xếp theo dõi nhiều thống kê khác nhau (chẳng hạn như min, max, có nghĩa là) bằng cách sử dụng cấu trúc dữ liệu ngăn xếp hiện có với loại phần tử chứa giá trị cũng như các thống kê khác nhau này. Đây là một số ví dụ nhỏ nhặt về những thứ mà bạn có thể cần phải thực hiện trong thế giới thực.

+0

như kết hợp truy cập ngẫu nhiên của ArrayList cùng với add() và iterator.remove() của LinkedList để nhận giải pháp hiệu quả hơn cho nhân viên bán hàng du lịch? – Jason

+0

ví dụ ... nhưng xin đừng quên, rằng việc biết cách tạo ra một triển khai thực sự tốt không phải là dễ dàng như nó trông giống như. Bạn có thể muốn ghi nhớ nhiều điều - hiệu suất, giới hạn phức tạp về giao diện, đồng thời và những thứ khác. Đây là một bài tập tốt, nhưng phần lớn thời gian, khi tình hình cho phép, tránh thực hiện lại thư viện chuẩn ngôn ngữ, hầu hết các lần, bạn có thể làm cho nó sai. Nếu bạn đang tìm kiếm các ví dụ trong Java, Bộ sưu tập của Google có một số triển khai cụ thể của riêng chúng, hãy kiểm tra chúng :) –

2

Tôi đã triển khai lại một số cấu trúc dữ liệu, chức năng và lớp học được tích hợp sẵn của ngôn ngữ trong một số trường hợp. Là một nhà phát triển nhúng, lý do chính tôi sẽ làm đó là tốc độ hoặc hiệu quả. Các thư viện và kiểu chuẩn được thiết kế hữu ích trong nhiều tình huống, nhưng có nhiều trường hợp tôi có thể tạo phiên bản chuyên biệt hơn được tùy chỉnh để tận dụng các tính năng và hạn chế của nền tảng hiện tại của tôi. Nếu ngôn ngữ không cung cấp một cách để mở và sửa đổi các lớp hiện có (ví dụ như bạn có thể trong Ruby), thì việc triển khai lại lớp/hàm/cấu trúc có thể là cách duy nhất để thực hiện.

Ví dụ: một hệ thống tôi đã sử dụng CPU MIPS đã nhanh chóng khi làm việc với các số 32 bit nhưng chậm hơn khi làm việc với các số nhỏ hơn. Tôi đã viết lại một số cấu trúc dữ liệu và chức năng để sử dụng các số nguyên 32 bit thay vì các số nguyên 16 bit và cũng chỉ ra rằng các trường được căn chỉnh với các ranh giới 32 bit. Kết quả là một sự gia tăng tốc độ đáng chú ý trong một đoạn mã đã bị tắc nghẽn các phần khác của phần mềm.

Điều đó đang được nói, đó không phải là một quá trình tầm thường. Cuối cùng tôi phải sửa đổi mọi chức năng sử dụng cấu trúc đó và cuối cùng tôi cũng phải viết lại một vài chức năng thư viện chuẩn. Trong trường hợp cụ thể này, lợi ích lớn hơn công việc. Tuy nhiên, trong trường hợp chung, thường không đáng để gặp rắc rối. Có một tiềm năng lớn cho các vấn đề khó gỡ lỗi, và nó hầu như luôn hoạt động hơn. Trừ khi bạn có các yêu cầu hoặc hạn chế cụ thể mà các cấu trúc/lớp học hiện tại không đáp ứng, tôi khuyên bạn không nên triển khai lại chúng.

Như Michael đề cập, thực sự hữu ích khi biết cách để triển khai lại cấu trúc ngay cả khi bạn không bao giờ làm như vậy. Bạn có thể tìm thấy một vấn đề trong tương lai có thể được giải quyết bằng cách áp dụng các nguyên tắc và kỹ thuật được sử dụng trong các cấu trúc dữ liệu hiện có.

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