Cấu trúc dữ liệu và giải thuật full

15 409 0
Cấu trúc dữ liệu và giải thuật full

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Với các sinh viên chuyên nghành tin học thì cụm từ Cấu trúc dữ liệu (Data Structure) không còn là xa lạ. Đây là một môn học bắt buộc và sẽ là thực sự khó cho bất kỳ sinh viên nào nếu không có sự chuẩn bị kỹ lưỡng và dành cách tiếp cận tích cực cho môn học này. Vậy Cấu trúc dữ liệu là gì?Dưới đây là danh sách các bài hướng dẫn trong loạt bài Cấu trúc dữ liệu và Giải thuật.

Cấu trúc liệu (Data Structure) ? Cấu trúc liệu cách lưu trữ, tổ chức liệu có thứ tự, có hệ thống để liệu sử dụng cách hiệu Dưới hai khái niệm tảng hình thành nên cấu trúc liệu: • Interface: Mỗi cấu trúc liệu có Interface Interface biểu diễn tập hợp phép tính mà cấu trúc liệu hỗ trợ Một Interface cung cấp danh sách phép tính hỗ trợ, loại tham số mà chúng chấp nhận kiểu trả phép tính • Implementation (có thể hiểu triển khai): Cung cấp biểu diễn nội cấu trúc liệu Implementation cung cấp phần định nghĩa giải thuật sử dụng phép tính cấu trúc liệu Đặc điểm Cấu trúc liệu • Chính xác: Sự triển khai Cấu trúc liệu nên triển khai Interface cách xác • Độ phức tạp thời gian (Time Complexity): Thời gian chạy thời gian thực thi phép tính cấu trúc liệu phải nhỏ • Độ phức tạp nhớ (Space Complexity): Sự sử dụng nhớ phép tính cấu trúc liệu nên nhỏ Tại Cấu trúc liệu cần thiết ? Ngày nay, ứng dụng ngày phức tạp lượng liệu ngày lớn với nhiều kiểu đa dạng Việc làm xuất vấn đề lớn mà lập trình viên phải đối mặt: • Tìm kiếm liệu: Giả sử có triệu hàng hóa lưu giữ vào kho hàng hóa giả sử có ứng dụng cần để tìm kiếm hàng hóa Thì thực tìm kiếm, ứng dụng phải tìm kiếm hàng hóa triệu hàng hóa Khi liệu tăng lên việc tìm kiếm trở lên chậm tốn • Tốc độ vi xử lý: Mặc vi xử lý có tốc độ cao, nhiên có giới hạn lượng liệu lên tới hàng tỉ ghi tốc độ xử lý không nhanh • Đa yêu cầu: Khi hàng nghìn người dùng thực phép tính tìm kiếm Web Server cho Web Server có nhanh đến việc phải xử lý hàng nghìn phép tính lúc thực khó Để xử lý vấn đề trên, cấu trúc liệu giải pháp tuyệt vời Dữ liệu tổ chức cấu trúc liệu theo cách để thực tìm kiếm phần tử liệu yêu cầu tìm thấy Độ phức tạp thời gian thực thi cấu trúc liệu giải thuật Có trường hợp thường sử dụng để so sánh thời gian thực thi cấu trúc liệu khác nhau: • Trường hợp xấu (Worst Case): tình mà phép tính cấu trúc liệu tốn thời gian tối đa (thời gian dài nhất) Ví dụ với ba số 1, 2, xếp theo thứ tự giảm dần thời gian thực thi dài (và trường hợp xấu nhất); xếp theo thứ tự tăng dần thời gian thực thi ngắn (và trường hợp tốt nhất) • Trường hợp trung bình (Average Case): miêu tả thời gian thực thi trung bình phép tính cấu trúc liệu • Trường hợp tốt (Best Case): tình mà thời gian thực thi phép tính cấu trúc liệudụ Thuật ngữ Cấu trúc liệuDữ liệu: Dữ liệu giá trị tập hợp giá trị • Phần tử liệu: Phần tử liệu đơn vị đơn lẻ giá trị • Các phần tử nhóm: Phần tử liệu mà chia thành phần tử gọi phần tử nhóm • Các phần tử bản: Phần tử liệu mà bị chia nhỏ thành phần tử gọi phần tử • Thuộc tính Thực thể: Một thực thể mà chứa vài thuộc tính đó, thuộc tính gán giá trị • Tập hợp thực thể: Các thực thể mà có thuộc tính tương tự cấu thành tập hợp thực thể • Trường: Trường đơn vị thông tin biểu diễn thuộc tính thực thể • Bản ghi: Bản ghi tập hợp giá trị trường thực thể cho • File: Là tập hợp ghi thực thể tập hợp thực thể cho Cài đặt IDE để biên dịch thực thi C Có số IDE có sẵn miễn phí để biên dịch thực thi chương trình C Bạn chọn Dev-C++, Code:: Blocks, Turbo C Tuy nhiên, lựa chọn phổ biến hay sử dụng Dev-C++ chương trình C loạt biên dịch thực thi Dev-C++ Bạn truy cập theo link sau để tải Dev-C++: Tải Dev-C++ Trên trang bao gồm Code:: Blocks Sau bạn tải xong, để cài đặt IDE này, bạn cần vào Google gõ "cài đặt dev-c++" có nhiều video hướng dẫn chi tiết, không cần trình bày thêm Sau cài đặt xong, để biên dịch thực thi chương trình C, bạn: (a) vào File -> New -> Project -> Console Application -> C project, sau nhập tên vào (b) File -> New -> Source File Cuối cùng, chép dán chương trình C vào file bạn vừa tạo Để biên dịch thực thi, chọn Execute -> Compile & Run Cài đặt để chạy Command Prompt Nếu bạn muốn cài đặt để biên dịch chạy Command Prompt, bạn nên đọc phần sau Nếu bạn muốn cài đặt chương trình C, bạn cần phải sử dụng phần mềm máy tính bạn: (a) Chương trình soạn văn - Text Editor (b) Bộ biên dịch C Text Editor Được sử dụng để soạn thảo chương trình Ví dụ vài trình editor Window Notepad, Notepad ++, vim hay vi… Tên phiên trình editor thay đổi theo hệ điều hành Ví dụ, Notepad sử dụng Windows, vim hay vi sử dụng Linux UNIX Các file bạn tạo trình editor gọi source file (file nguồn) chứa chương trình code Các file chương trình C thường đặt tên với phần mở rộng ".c" Trước bắt đầu chương trình bạn, chắn bạn có trình editor máy tính bạn có đủ kinh nghiệm để viết chương trình máy tính, lưu trữ file thực thi Bộ biên dịch C Mã nguồn viết file nguồn dạng đọc Nó biên dịch thành mã máy, CPU thực chương trình dựa lệnh viết Bộ biên dịch sử dụng để biên dịch mã nguồn (source code) bạn đến chương trình thực thi Tôi giả sử bạn có kiến thức biên dịch ngôn ngữ lập trình Bộ biên dịch thông dụng biên dịch GNU C/C++, mặt khác bạn có biên dịch khác HP Solaris với Hệ điều hành tương ứng Dưới phần hướng dẫn giúp bạn cách cài đặt biên dich GNU C/C++ hệ điều hành khác Tôi đề cập đến C/C++ biên dịch GNU gcc hoạt động cho ngôn ngữ C C++ Cài đặt môi trường UNIX/Linux Nếu bạn sử dụng Linux UNIX, bạn kiểm tra GCC cài đặt môi trường bạn chưa lệnh sau đây: $ gcc -v Nếu bạn có cài đặt GNU máy tính bạn, sau phản hồi thông báo sau: Using built-in specs Target: i386-redhat-linux Configured with: /configure prefix=/usr Thread model: posix gcc version 4.1.2 20080704 (Red Hat 4.1.2-46) Nếu GCC chưa cài đặt, bạn cài đặt với hướng dẫn đường link đây: http://gcc.gnu.org/install/ Bài hướng dẫn viết dựa Linux tất ví dụ dược biên dịch Cent OS hệ thống Linux Cài đặt môi trường Mac OS Nếu bạn sử dụng hệ điều hành Mac OS X, cách đơn giản để có GCC download môi trường phát triển Xcode, bạn sử dụng biên dịch GNU cho C/C++ Xcode sẵn link sau: developer.apple.com/technologies/tools/ Cài đặt Windows Để cài đặt GCC Windows bạn cần phải cài đặt MinGW Để cài đặt MinGW, bạn truy cập vào www.mingw.org, theo hướng dẫn trang download Download phiên cho chương trình MinGW, tên MinGW-.exe Khi cài đặt MinWG, bạn phải cài đặt gcc-core, gcc-g++, binutils MinGW runtime, bạn cài đặt nhiều Thêm thư mục bin nơi cài đặt MinGW vào biến môi trường PATH bạn, bạn sử dụng trực tiếp công cụ dạng command line dễ dàng Khi trình cài đặt hoàn tất, bạn chạy gcc, g++, ar, ranlib, dlltool công cụ GNU khác Windows command line Phân tích tiệm cận ? Phân tích tiệm cận giải thuật khái niệm giúp ước lượng thời gian chạy (Running Time) giải thuật Sử dụng phân tích tiệm cận, đưa kết luận tốt tình trường hợp tốt nhất, trường hợp trung bình, trường hợp xấu giải thuật Để tham khảo trường hợp này, bạn tìm hiểu chương Cấu trúc liệu ? Phân tích tiệm cận tức tiệm cận liệu đầu vào (Input), tức giải thuật Input kết luận cuỗi giải thuật chạy lượng thời gian cụ thể số Ngoài nhân tố Input, nhân tố khác xem không đổi Phân tích tiệm cận nói đến việc ước lượng thời gian chạy phép tính bước tính toán Ví dụ, thời gian chạy phép tính ước lượng hàm f(n) với phép tính khác hàm g(n2) Điều có nghĩa thời gian chạy phép tính tăng tuyến tính với tăng lên n thời gian chạy phép tính thứ hai tăng theo hàm mũ n tăng lên Tương tự, n nhỏ thời gian chạy hai phép tính gần Thường thời gian cần thiết giải thuật chia thành loại: • Trường hợp tốt nhất: thời gian nhỏ cần thiết để thực thi chương trình • Trường hợp trung bình: thời gian trung bình cần thiết để thực thi chương trình • Trường hợp xấu nhất: thời gian tối đa cần thiết để thực thi chương trình Asymptotic Notation Cấu trúc liệu giải thuật Dưới Asymptotic Notation sử dụng phổ biến việc ước lượng độ phức tạp thời gian chạy giải thuật: • Ο Notation • Ω Notation • θ Notation Big Oh Notation, Ο Cấu trúc liệu giải thuật Ο(n) cách để biểu diễn tiệm cận thời gian chạy thuật toán Nó ước lượng độ phức tạp thời gian trường hợp xấu lượng thời gian dài cần thiết giải thuật (thực thi từ bắt đầu kết thúc) Đồ thị biểu diễn sau: Ví dụ, gọi f(n) g(n) hàm không giảm định nghĩa số nguyên dương (tất hàm thời gian thỏa mãn điều kiện này): Ο(f(n)) = { g(n) : tồn c > n0 cho g(n) ≤ c.f(n) với n > n0 } Omega Notation, Ω Cấu trúc liệu giải thuật The Ω(n) cách để biểu diễn tiệm cận thời gian chạy giải thuật Nó ước lượng độ phức tạp thời gian trường hợp tốt lượng thời gian ngắn cần thiết giải thuật Đồ thị biểu diễn sau: Ví dụ, với hàm f(n): Ω(f(n)) ≥ { g(n) : tồn c > n0 cho g(n) ≤ c.f(n) với n > n0 } Theta Notation, θ Cấu trúc liệu giải thuật The θ(n) cách để biểu diễn tiệm cận tiệm cận thời gian chạy giải thuật Bạn nhìn vào đồ sau: θ(f(n)) = { g(n) g(n) = Ο(f(n)) g(n) = Ω(f(n)) với n > n0 } Một số Asymptotic Notation phổ biến cấu trúc liệu giải thuật số − Ο(1) logarit − Ο(log n) Tuyến tính (Linear) − Ο(n) n log n − Ο(n log n) Bậc hai (Quadratic) − Ο(n2) Bậc (cubic) − Ο(n3) Đa thức (polynomial) − nΟ(1) Hàm mũ (exponential) − 2Ο(n) Giải thuật tham lam (Greedy Algorithm) Trang trước Trang sau Giải thuật tham lam ? Tham lam (hay tham ăn) phương pháp phổ biến để thiết kế giải thuật Nếu bạn đọc truyện dân gian có câu chuyện này: mâm cỗ có nhiều ăn, ngon ta ăn trước, ăn hết ta chuyển sang ngon thứ hai, chuyển tiếp sang thứ ba, … Rất nhiều giải thuật tiếng thiết kế dựa ý tưởng tham lam, ví dụ giải thuật khung nhỏ Dijkstra, giải thuật khung nhỏ Kruskal, … Giải thuật tham lam (Greedy Algorithm) giải thuật tối ưu hóa tổ hợp Giải thuật tìm kiếm, lựa chọn giải pháp tối ưu địa phương bước với hi vọng tìm giải pháp tối ưu toàn cục Giải thuật tham lam lựa chọn giải pháp cho tốt thời điểm sau giải toán nảy sinh từ việc thực lựa chọn Lựa chọn giải thuật tham lam phụ thuộc vào lựa chọn trước Việc định sớm thay đổi hướng giải thuật với việc không xét lại định cũ dẫn đến kết giải thuật không tối ưu để tìm giải pháp toàn cục Bạn theo dõi toán đơn giản để thấy cách thực giải thuật tham lam lại nói giải thuật không tối ưu Bài toán đếm số đồng tiền Yêu cầu lựa chọn số lượng đồng tiền nhỏ cho tổng mệnh giá đồng tiền với lượng tiền cho trước Nếu tiền đồng có mệnh giá 1, 2, 5, 10 xu lượng tiền cho trước 18 xu giải thuật tham lam thực sau: • Bước 1: Chọn đồng 10 xu, 18 – 10 = xu • Bước 2: Chọn đồng xu, xu • Bước 3: Chọn đồng xu, lại xu • Bước 4: Cuối chọn đồng xu giải xong toán Bạn thấy cách làm ổn, số lượng đồng tiền cần phải lựa chọn đồng tiền Nhưng thay đổi toán chút hướng tiếp cận không đem lại kết tối ưu Chẳng hạn, hệ thống tiền tệ khác có đồng tiền có mệnh giá 1, 10 xu lượng tiền cho trước thay đổi thành 15 xu theo giải thuật tham lam số đồng tiền cần chọn nhiều Với giải thuật tham lam thì: 10 + + +1 + + 1, tổng cộng đồng tiền Trong toán xử lý việc chọn đồng tiền (7 + +1) Do kết luận rằng, giải thuật tham lam tìm kiếm giải pháp ưu bước lại thất bại việc tìm giải pháp tối ưu toàn cục Ví dụ áp dụng giải thuật tham lam Có nhiều giải thuật tiếng thiết kế dựa tư tưởng giải thuật tham lam Dưới số giải thuật này: • Bài toán hành trình người bán hàng • Giải thuật khung nhỏ Prim • Giải thuật khung nhỏ Kruskal • Giải thuật khung nhỏ Dijkstra • Bài toán xếp lịch công việc • Bài toán xếp ba lô Giải thuật chia để trị (divide and conquer) Trang trước Trang sau Giải thuật chia để trị (Divide and Conquer)là ? Phương pháp chia để trị (Divide and Conquer) phương pháp quan trọng việc thiết kế giải thuật Ý tưởng phương pháp đơn giản dễ hiểu: Khi cần giải toán, ta tiến hành chia toán thành toán nhỏ Tiếp tục chia toán nhỏ chia thêm nữa, ta giải toán nhỏ cuối kết hợp giải pháp tất toán nhỏ để tìm giải pháp toán ban đầu Nói chung, bạn hiểu giải thuật chia để trị (Divide and Conquer) qua tiến trình sau: Tiến trình 1: Chia nhỏ (Divide/Break) • Trong bước này, chia toán ban đầu thành toán Mỗi toán nên phần toán ban đầu Nói chung, bước sử dụng phương pháp đệ qui để chia nhỏ toán chia thêm Khi đó, toán gọi "atomic – nguyên tử", chúng biểu diễn phần toán ban đầu Tiến trình 2: Giải toán (Conquer/Solve) • Trong bước này, toán giải Tiến trình 3: Kết hợp lời giải (Merge/Combine) • Sau toán giải, bước kết hợp chúng cách đệ qui để tìm giải pháp cho toán ban đầu Hạn chế giải thuật chia để trị (Devide and Conquer) Giải thuật chia để trị tồn hai hạn chế, là: • Làm để chia tách toán cách hợp lý thành toán con, toán giải thuật toán khác phức tạp • Việc kết hợp lời giải toán thực Ví dụ giải thuật chia để trị Dưới số giải thuật xây dựng dựa phương pháp chia để trị (Divide and Conquer): • Giải thuật xếp trộn (Merge Sort) • Giải thuật xếp nhanh (Quick Sort) • Giải thuật tìm kiếm nhị phân (Binary Search) • Nhân ma trận Strassen • Giải thuật qui hoạch động (Dynamic Programming) Trang trước Trang sau Giải thuật Qui hoạch động (Dynamic Programming) ? Giải thuật Qui hoạch động (Dynamic Programming) giống giải thuật chia để trị (Divide and Conquer) việc chia nhỏ toán thành toán nhỏ sau thành toán nhỏ Nhưng không giống chia để trị, toán không giải cách độc lập Thay vào đó, kết toán lưu lại sử dụng cho toán tương tự toán gối (Overlapping Sub-problems) Chúng ta sử dụng Qui hoạch động (Dynamic Programming) có toán mà chia thành toán tương tự nhau, kết chúng tái sử dụng Thường giải thuật sử dụng cho tối ưu hóa Trước giải toán con, giải thuật Qui hoạch động cố gắng kiểm tra kết toán giải trước Các lời giải toán kết hợp lại để thu lời giải tối ưu Do đó, nói rằng: • Bài toán ban đầu nên phân chia thành toán gối nhỏ • Lời giải tối ưu toán thu sử dụng lời giải tối ưu toán • Giải thuật Qui hoạch động sử dụng phương pháp lưu trữ (Memoization) – tức lưu trữ lời giải toán giải, sau cần giải lại toán lấy sử dụng kết tính toán So sánh Giải thuật tham lam giải thuật qui hoạch động • Giải thuật tham lam (Greedy Algorithms) giải thuật tìm kiếm, lựa chọn giải pháp tối ưu địa phương bước với hi vọng tìm giải pháp tối ưu toàn cục • Giải thuật Qui hoạch động tối ưu hóa toán gối Giải thuật chia để trị giải thuật Qui hoạch động: • Giải thuật chia để trị (Divide and Conquer) kết hợp lời giải toán để tìm lời giải toán ban đầu • Giải thuật Qui hoạch động sử dụng kết toán sau cố gắng tối ưu toán lớn Giải thuật Qui hoạch động sử dụng phương pháp lưu trữ (Memoization) để ghi nhớ kết toán giảidụ giải thuật Qui hoạch động Dưới số toán giải sử dụng giải thuật Qui hoạch động: • Dãy Fibonacci • Bài toán tháp Hà Nội (Tower of Hanoi) • Bài toán ba lô • Giải thuật Qui hoạch động sử dụng hai phương pháp Phân tích (Topdown) Qui nạp (Bottom-up) tất nhiên dựa vào vòng đời làm việc CPU việc tham chiếu tới kết lời giải trước tốn việc giải lại toán Giải thuật Định lý thợ (Master Theorem) Trang trước Trang sau Giải thuật Định lý thợ (Master Theorem) ? Chúng ta sử dụng Định lý thợ (Master Theorem) để giải công thức đệ quy dạng sau cách hiệu : T(n) =aT(n/b) + c.n^k a>=1 , b>1 • Bài toán ban đầu chia thành a toán có kích thước n/b, chi phí để tổng hợp toán f(n) • Ví dụ : Thuật toán xếp trộn chia thành toán , kích thước n/2 Chi phí tổng hợp toán O(n) Định lý thợ a>=1, b>1, c, k số T(n) định nghĩa đệ quy tham số không âm T(n) = aT(n/b) + c.n^k + Nếu a> b^k T(n) =O(n^ (logab)) + Nếu a= b^k T(n)=O(n^k.lgn) + Nếu a< b^k T(n) = O(n^k) Chú ý: Không phải trường hợp áp dụng định lý thợ VD : T(n) = 2T(n/2) +nlogn a =2, b =2, không xác định số nguyên k ... vấn đề trên, cấu trúc liệu giải pháp tuyệt vời Dữ liệu tổ chức cấu trúc liệu theo cách để thực tìm kiếm phần tử liệu yêu cầu tìm thấy Độ phức tạp thời gian thực thi cấu trúc liệu giải thuật Có trường... cấu trúc liệu • Trường hợp tốt (Best Case): tình mà thời gian thực thi phép tính cấu trúc liệu Ví dụ Thuật ngữ Cấu trúc liệu • Dữ liệu: Dữ liệu giá trị tập hợp giá trị • Phần tử liệu: Phần tử liệu. .. giải thuật tiếng thiết kế dựa ý tưởng tham lam, ví dụ giải thuật khung nhỏ Dijkstra, giải thuật khung nhỏ Kruskal, … Giải thuật tham lam (Greedy Algorithm) giải thuật tối ưu hóa tổ hợp Giải thuật

Ngày đăng: 02/10/2017, 21:44

Từ khóa liên quan

Mục lục

  • Cấu trúc dữ liệu (Data Structure) là gì ?

  • Đặc điểm của một Cấu trúc dữ liệu

  • Tại sao Cấu trúc dữ liệu là cần thiết ?

  • Độ phức tạp thời gian thực thi trong cấu trúc dữ liệu và giải thuật

  • Thuật ngữ cơ bản trong Cấu trúc dữ liệu

  • Cài đặt IDE để biên dịch và thực thi C

  • Cài đặt để chạy trên Command Prompt

  • Text Editor

  • Bộ biên dịch C

  • Cài đặt trên môi trường UNIX/Linux

  • Cài đặt trên môi trường Mac OS

  • Cài đặt trên Windows

  • Phân tích tiệm cận là gì ?

  • Asymptotic Notation trong Cấu trúc dữ liệu và giải thuật

    • Big Oh Notation, Ο trong Cấu trúc dữ liệu và giải thuật

    • Omega Notation, Ω trong Cấu trúc dữ liệu và giải thuật

    • Theta Notation, θ trong Cấu trúc dữ liệu và giải thuật

    • Một số Asymptotic Notation phổ biến trong cấu trúc dữ liệu và giải thuật

    • Giải thuật tham lam (Greedy Algorithm)

      • Giải thuật tham lam là gì ?

      • Bài toán đếm số đồng tiền

      • Ví dụ áp dụng giải thuật tham lam

Tài liệu cùng người dùng

Tài liệu liên quan