BTEC FPT International College - Assignment 2 on Data Structures and Algorithms by Pham Phu Loc

Tài liệu nghiên cứu Information technology assignment 2 unit data structures and algorithms, tổng hợp lý thuyết và thực hành, cung cấp kiến thức chuyên sâu về .

Trường đại học

BTEC FPT International College

Chuyên ngành

Information Technology

Người đăng

Ẩn danh

Thể loại

Assignment

2023

46
2
0

Phí lưu trữ

30 Point

Tóm tắt

I. Hướng Dẫn A Z Về Data Structures And Algorithms Cho IT

Trong lĩnh vực công nghệ thông tin, data structures and algorithms (cấu trúc dữ liệu và giải thuật) là nền tảng cốt lõi cho việc phát triển phần mềm hiệu quả. Một cấu trúc dữ liệu là cách tổ chức, quản lý và lưu trữ dữ liệu để có thể truy cập và sửa đổi một cách tối ưu. Trong khi đó, một giải thuật là một chuỗi các bước được xác định rõ ràng để giải quyết một vấn đề cụ thể. Việc nắm vững các khái niệm này không chỉ quan trọng trong các khóa học computer science coursework mà còn là chìa khóa để giải quyết các bài toán phức tạp trong thực tế. Bài viết này sẽ cung cấp một cái nhìn tổng quan, bắt đầu từ các khái niệm cơ bản như Abstract Data Types (ADT) cho đến các kỹ thuật phân tích hiệu suất nâng cao. Mục tiêu là trang bị kiến thức cần thiết để xử lý các bài tập lớn, như Information technology assignment 2, một cách chuyên nghiệp. Việc lựa chọn đúng cấu trúc dữ liệu, chẳng hạn như linked lists, binary search trees, hay hash tables, có thể ảnh hưởng sâu sắc đến hiệu suất của một ứng dụng. Tương tự, việc áp dụng đúng giải thuật, từ sorting algorithms đến searching algorithms, sẽ quyết định time complexityspace complexity của chương trình. Phân tích này sẽ dựa trên các tài liệu nghiên cứu và kinh nghiệm thực tiễn, đặc biệt là bối cảnh của một dự án phát triển giải pháp middleware, nơi việc xử lý hàng đợi tin nhắn (Message Queue) đòi hỏi sự hiểu biết sâu sắc về stacks and queues. Nội dung sẽ được trình bày một cách rõ ràng, súc tích, theo phong cách Hemingway, tập trung vào việc cung cấp thông tin trực tiếp và hữu ích, giúp người học và các lập trình viên áp dụng ngay vào công việc của mình.

1.1. Vai trò của Kiểu Dữ liệu Trừu tượng ADT trong thiết kế

Kiểu Dữ liệu Trừu tượng (Abstract Data Types - ADT) là một khái niệm toán học trong khoa học máy tính, định nghĩa một tập hợp các giá trị và một tập hợp các toán tử hoạt động trên các giá trị đó. Điều quan trọng là ADT chỉ mô tả cái gì một kiểu dữ liệu có thể làm, chứ không phải làm như thế nào. Nó tách biệt giao diện (interface) khỏi việc triển khai cụ thể (data structures implementation). Ví dụ, một ADT 'Stack' được định nghĩa bởi các thao tác như push (thêm một phần tử), pop (loại bỏ phần tử trên cùng), và peek (xem phần tử trên cùng), nhưng không quy định nó phải được hiện thực bằng mảng hay danh sách liên kết. Sự trừu tượng hóa này giúp tăng cường tính module, giảm sự phức tạp và cho phép thay đổi cách triển khai bên trong mà không ảnh hưởng đến phần còn lại của chương trình.

1.2. Tổng quan về phân tích thuật toán algorithm analysis

Phân tích thuật toán (algorithm analysis) là quá trình xác định các tài nguyên tính toán (như thời gian và không gian lưu trữ) cần thiết cho một thuật toán. Mục tiêu chính là so sánh hiệu quả của các thuật toán khác nhau cho cùng một vấn đề. Thay vì đo thời gian thực thi trên một máy tính cụ thể, vốn phụ thuộc vào nhiều yếu tố phần cứng, phân tích thuật toán sử dụng các phương pháp toán học như phân tích tiệm cận (asymptotic analysis). Các ký hiệu như Big O notation được sử dụng để mô tả hiệu suất của thuật toán khi kích thước đầu vào (input) tăng lên. Việc phân tích này giúp lập trình viên đưa ra quyết định sáng suốt về việc lựa chọn giải thuật nào là tối ưu nhất cho một tình huống cụ thể, đặc biệt khi xử lý các tập dữ liệu lớn.

II. Thách Thức Khi Phân Tích Cấu Trúc Dữ Liệu và Giải Thuật

Một trong những thách thức lớn nhất khi làm việc với data structures and algorithms là việc đánh giá và lựa chọn giải pháp tối ưu. Hiệu quả của một thuật toán không chỉ được đo bằng tính đúng đắn mà còn bởi việc sử dụng tài nguyên. Hai yếu tố chính cần xem xét là time complexity (độ phức tạp về thời gian) và space complexity (độ phức tạp về không gian). Thường có một sự đánh đổi (trade-off) giữa hai yếu tố này: một thuật toán nhanh hơn có thể đòi hỏi nhiều bộ nhớ hơn và ngược lại. Việc hiểu rõ sự đánh đổi này là rất quan trọng. Ví dụ, trong một hệ thống nhúng với bộ nhớ hạn chế, một thuật toán có space complexity thấp có thể được ưu tiên hơn, ngay cả khi nó chậm hơn một chút. Một thách thức khác là việc áp dụng đúng các công cụ phân tích. Phân tích tiệm cận và Big O notation là tiêu chuẩn, nhưng việc xác định chính xác độ phức tạp của các thuật toán phức tạp, đặc biệt là những thuật toán sử dụng recursion (đệ quy) hoặc dynamic programming, đòi hỏi kỹ năng và kinh nghiệm. Tài liệu "BTEC Assignment 2" nhấn mạnh rằng việc lựa chọn giữa stacks and queues cho hệ thống Message Queue không phải là ngẫu nhiên, mà dựa trên yêu cầu xử lý cụ thể: FIFO (First-In-First-Out) cho hàng đợi vận chuyển và LIFO (Last-In-First-Out) cho ngăn xếp xử lý. Việc lựa chọn sai có thể dẫn đến hiệu suất kém và hành vi không mong muốn của hệ thống. Đây là những vấn đề cốt lõi mà sinh viên cần giải quyết trong các bài tập như IT module help.

2.1. Đánh đổi giữa Độ phức tạp thời gian time complexity và không gian

Sự đánh đổi giữa time complexityspace complexity là một nguyên tắc cơ bản trong khoa học máy tính. Không phải lúc nào cũng có một giải pháp tốt nhất cho cả hai. Ví dụ, việc sử dụng một hash table để tra cứu nhanh (thời gian trung bình O(1)) đòi hỏi thêm không gian bộ nhớ để lưu trữ bảng băm. Ngược lại, tìm kiếm tuyến tính trong một mảng (thời gian O(n)) không cần thêm không gian nhưng lại chậm hơn đáng kể. Việc quyết định nên ưu tiên yếu tố nào phụ thuộc vào các ràng buộc của vấn đề: tốc độ xử lý có quan trọng hơn dung lượng bộ nhớ không? Dữ liệu đầu vào lớn đến mức nào? Trong các hệ thống thời gian thực, thời gian phản hồi là tối quan trọng, trong khi ở các thiết bị di động, việc tiết kiệm bộ nhớ lại là ưu tiên hàng đầu.

2.2. Lựa chọn cấu trúc dữ liệu phù hợp Stacks and Queues

Việc chọn đúng cấu trúc dữ liệu là rất quan trọng. Stacks and Queues là hai kiểu dữ liệu trừu tượng tuyến tính nhưng có nguyên tắc hoạt động trái ngược nhau. Stack tuân theo nguyên tắc LIFO (Last-In, First-Out), giống như một chồng đĩa: đĩa đặt lên sau cùng sẽ được lấy ra đầu tiên. Nó thường được sử dụng trong các tác vụ như quản lý lời gọi hàm (call stack) hoặc chức năng undo. Ngược lại, Queue tuân theo nguyên tắc FIFO (First-In, First-Out), giống như một hàng người xếp hàng: người đến trước được phục vụ trước. Nó lý tưởng cho các tác vụ như quản lý hàng đợi in, xử lý yêu cầu mạng, hoặc như trong tài liệu gốc, hệ thống vận chuyển tin nhắn. Lựa chọn sai giữa hai cấu trúc này có thể phá vỡ logic của ứng dụng.

III. Cách Triển Khai Cấu Trúc Dữ Liệu Phức Tạp Message Queue

Việc triển khai một cấu trúc dữ liệu phức tạp đòi hỏi sự kết hợp giữa lý thuyết và kỹ năng lập trình. Tài liệu "BTEC Assignment 2" cung cấp một ví dụ điển hình về việc triển khai hệ thống Message Queue sử dụng stacks and queues bằng ngôn ngữ lập trình Java. Quá trình data structures implementation này không chỉ là viết mã, mà còn bao gồm việc thiết kế các Abstract Data Types (ADT), xử lý lỗi, và kiểm thử để đảm bảo tính đúng đắn. Trong kịch bản được đưa ra, Queue (messageStore) được sử dụng để lưu trữ các tin nhắn đang chờ vận chuyển, tuân theo nguyên tắc FIFO. Khi một tin nhắn được gửi đi, nó sẽ được lấy ra từ Queue và đẩy vào một Stack (messageConsumer) để xử lý, tuân theo nguyên tắc LIFO. Đây là một ví dụ thực tế về cách hai cấu trúc dữ liệu khác nhau có thể phối hợp để giải quyết một bài toán. Ngôn ngữ Java cung cấp các lớp dựng sẵn như LinkedList (có thể hoạt động như một Queue) và Stack, giúp việc triển khai trở nên thuận tiện hơn. Tuy nhiên, điều quan trọng là phải hiểu cách chúng hoạt động bên trong. Hơn nữa, việc triển khai phải đi kèm với cơ chế xử lý lỗi mạnh mẽ, sử dụng các khối try-catch để quản lý các tình huống ngoại lệ như tin nhắn rỗng hoặc vượt quá độ dài cho phép. Các pseudocode examples và lưu đồ giải thuật trong tài liệu gốc là công cụ hữu ích để hình dung luồng hoạt động trước khi viết mã thực tế.

3.1. Thực thi Stacks and Queues qua ví dụ Message System

Trong ví dụ Message System, Queue<String> messageStore = new LinkedList<>(); được sử dụng để tạo một hàng đợi lưu trữ tin nhắn. Khi người dùng nhập tin nhắn, nó được thêm vào cuối hàng đợi này. Khi một tin nhắn được gửi, phương thức poll() của Queue được gọi để lấy và loại bỏ phần tử đầu tiên, sau đó phần tử này được push() vào Stack<String> messageConsumer. Stack này dùng để lưu các tin nhắn đã được xử lý. Khi xem tin nhắn mới nhất, phương thức peek() của Stack được dùng để xem phần tử trên cùng mà không loại bỏ nó. Việc data structures implementation này cho thấy cách kết hợp các cấu trúc dữ liệu để mô phỏng một quy trình nghiệp vụ thực tế.

3.2. Xử lý lỗi và kiểm thử trong data structures implementation

Một chương trình hoàn chỉnh phải có khả năng xử lý lỗi. Trong ví dụ, các khối try-catch được sử dụng để bắt các ngoại lệ. Ví dụ, nếu người dùng nhập một tin nhắn rỗng (ms.isEmpty()) hoặc tin nhắn có độ dài vượt quá 250 ký tự (ms.length() > 250), một Exception sẽ được ném ra với thông báo lỗi rõ ràng. Tương tự, nếu người dùng cố gắng gửi tin nhắn trong khi hàng đợi rỗng, chương trình sẽ hiển thị một cảnh báo thay vì bị lỗi. Việc thực hiện các ca kiểm thử (test cases) để xác minh các tình huống này, bao gồm cả đầu vào hợp lệ và không hợp lệ, là một phần không thể thiếu của quá trình phát triển phần mềm chất lượng.

IV. Phương Pháp Đánh Giá Hiệu Suất Thuật Toán Hiệu Quả Nhất

Để đánh giá hiệu quả của data structures and algorithms, phương pháp phổ biến và hiệu quả nhất là phân tích tiệm cận (asymptotic analysis). Phương pháp này cho phép đánh giá hiệu suất của một thuật toán khi kích thước dữ liệu đầu vào tiến đến vô cực, loại bỏ sự phụ thuộc vào cấu hình phần cứng cụ thể. Trọng tâm của phân tích tiệm cận là Big O notation, dùng để mô tả trường hợp xấu nhất (worst-case scenario) về time complexity. Nó cung cấp một giới hạn trên cho thời gian chạy của thuật toán. Ví dụ, một thuật toán có độ phức tạp O(n) có nghĩa là thời gian chạy của nó tăng tuyến tính với kích thước đầu vào n. Một thuật toán O(n²) sẽ tăng theo hàm bậc hai, chậm hơn đáng kể khi n lớn. Ngoài Big O, còn có Omega (Ω) notation cho trường hợp tốt nhất và Theta (Θ) notation cho trường hợp trung bình. Tuy nhiên, trong thực tế, Big O notation được quan tâm nhiều nhất vì nó đảm bảo hiệu suất của thuật toán sẽ không tệ hơn một ngưỡng nhất định. Tài liệu gốc đã minh họa điều này thông qua ví dụ về chuỗi Fibonacci, so sánh giữa giải pháp dùng recursion (đệ quy) và không đệ quy. Giải pháp đệ quy, mặc dù thanh lịch, lại có độ phức tạp thời gian theo hàm mũ do các phép tính lặp lại, trong khi giải pháp lặp (iterative) chỉ có độ phức tạp tuyến tính O(n), hiệu quả hơn nhiều. Đây là một minh chứng rõ ràng về tầm quan trọng của algorithm analysis.

4.1. Giải mã Ký hiệu Big O Big O notation qua ví dụ thực tế

Ký hiệu Big O (Big O notation) mô tả giới hạn trên của tốc độ tăng trưởng thời gian chạy của một thuật toán. Ví dụ, O(1) biểu thị thời gian không đổi, không phụ thuộc vào kích thước đầu vào (ví dụ: truy cập một phần tử trong mảng bằng chỉ số). O(n) biểu thị thời gian tuyến tính, phổ biến trong các vòng lặp duyệt qua tất cả các phần tử (ví dụ: tìm kiếm một phần tử trong danh sách chưa sắp xếp). O(log n) thường xuất hiện trong các thuật toán chia để trị như binary search trees. O(n²) đặc trưng cho các vòng lặp lồng nhau, như trong nhiều sorting algorithms đơn giản (ví dụ: Bubble Sort). Hiểu rõ các cấp độ này giúp lập trình viên dự đoán hành vi của chương trình khi dữ liệu lớn hơn.

4.2. So sánh giải pháp đệ quy recursion và lặp tuần tự

Đệ quy (recursion) là một kỹ thuật mạnh mẽ trong đó một hàm tự gọi lại chính nó. Nó có thể dẫn đến mã nguồn ngắn gọn và dễ hiểu cho các vấn đề có cấu trúc đệ quy tự nhiên, như duyệt cây (graph traversal) hoặc tính giai thừa. Tuy nhiên, đệ quy thường đi kèm với chi phí hiệu suất. Mỗi lời gọi hàm đệ quy sẽ thêm một frame vào call stack, tiêu tốn bộ nhớ và có thể dẫn đến lỗi tràn bộ nhớ đệm (stack overflow) nếu độ sâu đệ quy quá lớn. Ví dụ tính Fibonacci bằng đệ quy có độ phức tạp O(2^n), trong khi phiên bản lặp chỉ là O(n). Do đó, trong nhiều trường hợp, việc chuyển đổi một giải thuật đệ quy thành một giải thuật lặp có thể cải thiện đáng kể cả time complexityspace complexity.

V. Top 2 Chỉ Số Đo Lường Hiệu Quả Của Một Giải Thuật

Hiệu quả của một giải thuật thường được đo lường qua hai chỉ số quan trọng nhất: độ phức tạp về thời gian (time complexity) và độ phức tạp về không gian (space complexity). Hai chỉ số này định lượng lượng tài nguyên tính toán mà thuật toán tiêu thụ khi thực thi. Chúng là yếu tố cốt lõi trong algorithm analysis và là tiêu chí quyết định để lựa chọn giải pháp tối ưu, đặc biệt trong các hệ thống có yêu cầu cao về hiệu năng hoặc tài nguyên hạn chế. Time complexity không đo thời gian thực tế bằng giây hay mili giây, mà đo số lượng thao tác cơ bản mà thuật toán thực hiện tương ứng với kích thước đầu vào 'n'. Việc sử dụng Big O notation để biểu diễn độ phức tạp thời gian giúp so sánh các thuật toán một cách khách quan. Ví dụ, một thuật toán O(log n) luôn nhanh hơn một thuật toán O(n) khi 'n' đủ lớn. Trong khi đó, space complexity đo lường tổng lượng bộ nhớ mà một thuật toán cần để chạy hoàn tất, cũng là một hàm của kích thước đầu vào 'n'. Nó bao gồm cả không gian cho dữ liệu đầu vào và bất kỳ không gian phụ trợ nào được thuật toán sử dụng trong quá trình thực thi. Trong bối cảnh của computer science coursework, việc phân tích cả hai chỉ số này là bắt buộc để chứng minh sự hiểu biết sâu sắc về hiệu quả của các data structures and algorithms.

5.1. Phân tích Độ phức tạp thời gian Time Complexity chi tiết

Độ phức tạp thời gian (time complexity) được phân thành nhiều loại phổ biến. O(1) - Hằng số: thời gian thực thi không đổi. O(log n) - Logarit: thời gian tăng chậm khi đầu vào tăng, thường thấy ở các thuật toán chia để trị như tìm kiếm nhị phân. O(n) - Tuyến tính: thời gian tăng tỷ lệ thuận với kích thước đầu vào, ví dụ như duyệt một mảng. O(n log n) - Tuyến tính-Logarit: hiệu quả cho các thuật toán sắp xếp như Merge Sort, Quick Sort. O(n²) - Bậc hai: thường gặp ở các vòng lặp lồng nhau, ví dụ Bubble Sort. O(2^n) - Hàm mũ: rất chậm, thường là kết quả của các giải thuật đệ quy không tối ưu như tính Fibonacci cơ bản. Phân tích này giúp dự báo khả năng mở rộng của thuật toán.

5.2. Ý nghĩa của Độ phức tạp không gian Space Complexity

Độ phức tạp không gian (space complexity) đo lường lượng bộ nhớ cần thiết. Nó bao gồm hai phần: không gian đầu vào (input space) và không gian phụ trợ (auxiliary space). Trong nhiều phân tích, người ta chỉ tập trung vào không gian phụ trợ - bộ nhớ bổ sung mà thuật toán sử dụng. Ví dụ, thuật toán Bubble Sort có space complexity là O(1) vì nó chỉ cần một biến tạm để hoán đổi, không phụ thuộc vào kích thước mảng. Ngược lại, Merge Sort yêu cầu một mảng phụ có kích thước O(n) để trộn các mảng con, do đó có space complexity là O(n). Trong môi trường có bộ nhớ hạn chế như thiết bị IoT hoặc di động, một thuật toán với space complexity thấp có thể là lựa chọn duy nhất.

11/09/2025

Trích đoạn nội dung tài liệu

BTEC FPT INTERNATIONAL COLLEGE ‘BTEC @ Pearson Alliance with Ga Education INFORMATION TECHNOLOGY ASSIGNMENT 2 UNIT: DATA STRUCTURES AND ALGORITHMS STUDENT : PHAM PHU LOC CLASS : IT05201 STUDENTID : BD00053 SUPERVISOR : PHAN HOANG PHÙ Da Nang, December 2023 ‘BTEC asance win gig Eaton ‘BTEC ASSIGNMENT 2 FRONT SHEET Qualification BTEC Level 5 HND Diploma in Computing Unit number and title Unit: Data Structures and Algorithms Date received (1st Submission date 25/11/2023 30/11/2023 submissionfi Date received (2nd Re-submission date submissionfi Student name Pham Phu Loc Student ID BD00053 Class IT05201 Assessor name Phan Hoang Phu Student declaration | certify that the assignment submission is entirely my own work and | fully understand the consequences of plagiarism. | understand that making a false declaration is a form of malpractice. Student’s signature: Phu Loc Grading grid P4 P5 Pó P7 M4 M5 D3 D4 SB : summative Feedbacks: MResubmission Feedbacks: Grade: Assessor Signature: Date: Internal Verifier’s Comments: Signature & Date: PAGE \* MERGEFORMATv ‘BTEC ae $‘BTEC TABLE OF CONTENT I5 2929900217272 5. ii LIST OF TABLES AND FIGURES.-- LH HH HH HH KH KH KH ky iv LIST OF ACRONYM.

LH HH HH KH HH HH KH TH T05 KH V00 Vv | (998509 1. 1 CHAPTER 3: IMPLEMENT COMPLEX DATA STRUCTURES AND ALGORITHMS. Implement a complex ADT and algorithm in an executable programming language to solve a Well-defined problem. Define Message QUEUE.

lImplementation Mlessage QUe€U€. QQ LH TH HH TH kg HH ng và 2 CHAPTER 4: ASSESS THE EFFECTIVENESS OF DATA STRUCTURES AND ALGORITHMS. Discuss how asymptotic analysis can be used to assess the effectiveness of an algorithm 4. Define asymptotÏC aniaÌVSÏS.- c c HH HH TH HH HH TT ng 1 TH KT n0 kg ng 3 1.

The reason of using asymptotic analysis for assessing the effectiveness of an E1 0c. Determine two ways in which the efficiency of an algorithm can be measured, illustrating your answer with arn example. ốc ốố ố ốằằồ. 1111 HS T110 11 1H ng ng ng TH T00 118001150 4 2.

Án Hà HH HH» HH HH KT KH HH KH TT 4 2. Measure of memOorY US4ÿ€. LH TggnngkHT ng n kg g kg 4 2. ốc ốố ố ốằằồ.

1111 HS T110 11 1H ng ng ng TH T00 118001150 4 PAGE \* MERGEFORMATv ‘BTEC nine win IG ean s ‘BT ï EC 2. 7 PAGE \* MERGEFORMATv ‘BTEC ae $‘BTEC LIST OF TABLES AND FIGURES B150 //—-2-19)/ 0-88. 2 Figure 2 Algorithm flowchar†t of MenU.-c SH n HH ng ng TH nen 3 Figure 3 Source code of MenU. ch TH HT TH TH KH HH g0 kg gyy 4 Figure 4 Algorithm flowchart of Input† ÌMesSag€.

Là HH HH ng ng khen fi Figure fi Source code of Input MI©SSaÿ6. Q HnnnnnHnn HH ng ng ng ng ng kg fi Figure ó Algorithm flowchart of Send Mlessage. LHng HH nh kh ó Figure 7 Source code of Send Ml€SS4E6. LH ng ng TH ng KT kg TH kg 7 Figure 8 Algorithm flowchart of View Latest ÌMes54aỹ.

HH HH HH hờ 7 Figure 9 Source code of View Latesf Mes548€. HH HH HH ng nen ng kg 8 Figure 10 Resul† OÍ COd. c L LH HS HH TH HT ng HT nh ng ng kh 9 B1i-xif9e. 11 Figure 13 Code số.

12 Figure 1fi SOUFC€ COdE. LH ng ng vn HH vế 12 Figure 16 OULPULL 0. 13 Figure 18 SOUrCE COE. 1fi FIQUrE 22 OULPULL 0.

cececccsesecccsesesnecccssneeeceseeseeeesssaeceseeecesecessseeessaeecssaeeecsseeaeeceecseaeeaeesseeenees 1fi Figure 23 Big-O Notationn.ccccescsccsssccssccssseeccsssecneeccssseeceesecesecesssaeeceseeceeneeeesaeseaeeesenaeeenens 18 PAGE \* MERGEFORMATv ‘BTEC ae $‘BTEC Figure 24 Omega No†tafÏOn.- LH HH ng ng ng TH HH HH ng kg 19 IBI1I1-02INÌ0 5-8) sr-i ii 0n. 20 Figure 2ó SourC€ COd€. HH ng ng HT kg HT n1 gà 21 B11-220--10i 108. 22 Figure 30 Tỉne cormpÏ€XỈÏÊY.

c c ng ng TH KT ki ng TH TH kg kg 24 H30i-£cx NI 0n 1900087. 24 Figure 32 Example Of O(1n).ccccccsccsssccssesscsceseesscesecsensecescsesesssescseeesscesesassecessssesessseeseeesseseaas 2fi đ20-£cc@vš i09 6000876. 2fi Figure 34 Example 1e896 005677. 2fi Figure 3fi Logarithmic tine O(lOg n).

Là L1 HH 11011011111 111g HH Hà HH Hà hy 26 B30-c c9 10)19i-0e89)(e-8)) 0010887. 27 Figure 39 Linear - Logarithmic tine OÍn lOg n). ác 1 c 1211111 1 11111111111811111 11118111 1k 28 Figure 40 Example of O(n ÍOg n). c 1 1111111111 11111011111 11011111 111811 11 E1 11H HH Hà cry 28 B109.

29 Figure 4fi Code demo. LH ng ng TH 00 9 kg về 30 B0 /. 31 PAGE \* MERGEFORMATv ‘BTEC _ la “BTEC B129. 31 Figure FIO OULPUL.

31 Figure fil Example of space COMPIEXILY.cceccccssccssseecceesseseeecesnsecceseeessnaeeeaeecnseeeseeeeneeeeees 33 Figure fi2 Example of space compDÌ€XỈTY. ch ng ng kg HH ghế 33 B1i-0iES2v0s-2››- nh. 34 PAGE \* MERGEFORMATv 5 “BTEC Alaxe win BIg ecaton ‘BTEC LIST OF ACRONYM ADT Abstract Data Types cLI Command-Line Interface FIFO First In First Out HTTP Hypertext Transfer Protocol JML Java Modeling Language LIFO Last In First Out MERN MongoDB, Express.js, React JS, and Node.js MEVN MongoDB, Express, Sue, and Node.js SOAP Simple Object Access Protocol PAGE \* MERGEFORMATv ‘BTEC Alliance with BG |, Education ‘BTEC INTRODUCTION First of all, | would like to thank my mentor Phan Hoang Phu for his constant support in my studies and research, for his patience, motivation, enthusiasm and rich knowledge. Without your wonderful help, | would not have been able to achieve this.

I'm employed at Soft net Development Ltd, a software company that specializes in networking solutions, as an internal software developer. My business has been awarded the contract to design and implement a middleware solution that will front-end with several interfaces as part of a service delivery partnership project. The computer provisioning interface consists of SOAP, HTTP, JML, and CLI, while the back end uses CLI for networking with telecommunications providers. | have been given a unique responsibility by my account manager to educate my staff on the creation and use of abstract data types.

| was requested to do a presentation on how to utilize ADT to enhance software design, development, and testing for all of the cooperating partners. | was also asked to prepare an introduction report on how to formalize the specification of abstract data types and algorithms for distribution to all partners. Let's find out in this assignment! “¢ Chapter 3: Implement complex data structures and algorithms. “* Chapter 4: Assess the effectiveness of data structures and algorithms Performed Student: Pham Phu Loc ‘BTEC ane wih IG ean $ ‘BT h EC CHAPTER 3: IMPLEMENT COMPLEX DATA STRUCTURES AND ALGORITHMS.

Implement a complex ADT and algorithm in an executable programming language to solve a well-defined problem. Define Message Queue A queue is a line of items waiting to be handled, starting at the front of the line and processing it sequentially. In essence, a message is a byte array with some headers at the topff it is the data that is carried between the sender and the receiving program. A message queue offers an asynchronous communications protocol, which is a system that adds a message to a message queue but does not need a prompt reply to continue processing.

Email is a good example of a Message Queue. Queue (eropucer_) |__| =>) (mm) Figure 1 Message Queue 1.2 Scenario overview The conveyance and processing of messages between layers is one aspect of the provider interface for the middleware that is currently under development. For transport, a buffer of queued messages is deployed and processed, the system requires a stack of messages. It is necessary to develop these types of collections for the system.

It is recommended to design an ADT/algorithm for these 2 structures and implement a demo version with the message as a string of up to 2fi0 characters. Handle the problems and errors encountered in the demo carefully with exceptions and some tests should be done to prove the correctness of the algorithms/operations. From the requests that have been made, | have selected two suitable ADT types to deal with, namely Stacks and Queues. - The stack will be used to store process messages.

- Queues are used to store the messages being transported. Performed Student: Pham Phu Loc 2 ‘BTEC nine win IG ean s ‘BT ï EC 1.1 Source code Menu In the main menu, there will be 4 functions: input message, send message, view message, and exit. Those four functions will correspond to the number from 1 to 4. Select the function you want to perform and enter its corresponding number to run the program.

Algorithm flowchart: Start | Input n lfn= 1 —yes—> lnputMessage —— No! n=2 —yes—» SendMessage —> No "=3 —_ ViewLatet .Ì Message Y No No L——— n=4 | yes Exit Ỷ End «————————— Figure 2 Algorithm flowchart of Menu Source code: Performed Student: Pham Phu Loc ‘BTEC Alliance with 88g 9 Education 8 public class asm2 { static Queue<String> messageStore = new LinkedList<>(); SBTEC 10 static Stack<String> messageConsumer = new Stack(); 11 128 public static void main(String args[]) { int choice = 0; 14 Scanner sc = new Scanner(System.in); 15 do { 16 System. Input Message"); 19 System. Send Message"); 20 System. View Latest Message"); 21 System.

Exit"); 22 23 boolean err = false; 24 do { 25 try { 26 System.print("Choose a number from 1 to 4: "); 27 choice = Integer.println("Please input number format!"); 31 if 32 if (choice > @ && choice <= 4) { 33 err = true; 34 } 35 else { 36 System.println("Please input number from 1 to 4!"); 37 } 38 } 39 while (err == false); 41 //choose 42 switch (choice) { 43 case 1: { 44 addMessage(); 45 break; 46 } 47 case 2: { 48 sendMessage() ; 49 break; 59 } 51 case 3: { 2 viewMessage(); 53 break; 54 } 55 default: 56 System.print1n("Exit"); 57 break; 58 } 59 } while (choice < 4); Figure 3 Source code of Menu Input Message Algorithm Step 1: Input a message below 2fi0 characters Step 2: Store a message to queue Performed Student: Pham Phu Loc 4 eee SB Step 3: Break ‘BTEC Algorithm flowchart: Start Input Message ert |a ng Display the message: “Input Message Failed! <yes— If Message= 250 if Message is empty >-—yes> Display oe the Gaerne message aS Messages can only contain characters ge SE Bo Kr" 250 characters” lank† No No Store a message to queue End Figure 4 Algorithm flowchart of Input Message Source code: //Input Message nan a) SOSIBDARANHPSHCHUARHEWN e public static void addMessage() { Scanner sc = new Scanner(System.in); String ms = ""; Dan System.print("Input Message: "); ms = sc.nextLine(); try { if (ms.isEmpty()) { #98%%Đ%£Ø%BP®SWaNðbQRwWNns8 throw new Exception("Message cannot be blank!"); } else { try { if (ms.length() > 250) { throw new Exception("Input Message Failed! Messages can only contain 25@ characters"); } else { messageStore.println("messageStore: +messageStore); } } catch (Exception e) { gE Wore System.getMessage()); } } } catch (Exception e) { sô IAA System.getMessage()); } ~ Figure 5 Source code of Input Message Performed Student: Pham Phu Loc 5 Py „° “BTEC “BT EC ° Alliance with GG. Education Send Message Algorithm Step 1: Check if there are already messages in the queue Step 2: If yes, retrieve the message in the first line of the queue Step 3: Push messages to consumers Step 4: Break Algorithm flowchart: Start nh Send Message Input Message † Y Display the message “MessageStore is empty! if there are no message Please input a in the queue yet messageStorel" | No Vv Send the first message in the queue to the consumer * End Figure 6 Algorithm flowchart of Send Message Source code: Performed Student: Pham Phu Loc 6 “BTEC _ ¬ aaa bon ‘BT ï E Cc 89 //Send Message 30° public static void sendMessage() { 1 if (messageStore.println("MessageStore is empty! Please input messageStore!"); 93 } 94 else { 95 String ms = messageStore.println("View Latest Message Consumer: " +messageConsumer.peek()); 104 } Figure 9 Source code of View Latest Message 1.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ