đề tài danh sách liên kết

18 599 0
đề tài danh sách liên kết

Đ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

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG CƠ SỞ TẠI THÀNH PHỐ HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN _o0o _ BÁO CÁO CHUYÊN ĐỀ CÔNG NGHỆ PHẦN MỀM Đề tài: Danh sách liên kết Giáo viên hướng dẫn: Sinh viên thực hiện: Mã sinh viên: Lớp: Nguyễn Mạnh Sơn Nguyễn Quốc Dũng B14LDCN008 L14CNPM Hà Nội – 2/2016 MỤC LỤC Chương 1: Tổng quan danh sách liên kết 1 Giới thiệu danh sách liên kết Ưu điểm nhược điểm 2.1 Ưu điểm .2 2.2 Nhược điểm .2 Chương 2: Các loại danh sách liên kết thuật ngữ liên quan Các loại danh sách liên kết .3 1.1 Danh sách liên kết đơn .3 1.2 Danh sách liên kết kép .3 1.3 Danh sách liên kết vòng .3 Các thuật ngữ liên quan 2.1 Nút giả (Dummy node) .4 2.2 Danh sách trống (Empty lists) 2.3 Trường liên kết (Hash linking) So sánh loại cấu trúc liệu danh sách .4 3.1 Danh sách liên kết mảng động 3.2 Danh sách liên kết kép đanh sách liên kết đơn .5 3.3 Danh sách liên kết vòng danh sách liên kết đơn 3.4 Danh sách liên kết đơn danh danh sách khác .6 Chương 3: Các thao tác danh sách liên kết Thêm nút vào đầu danh sách Duyệt danh sách .10 Thêm nút vào cuối danh sách 10 Chèn vào sau nút danh sách .11 Chèn vào trước nút danh sách .11 Xóa nút danh sách 12 Chương 4: Xây dựng chương trình sử dụng danh sách liên kết java 14 KẾT LUẬN 15 TÀI LIỆU THAM KHẢO .16 NỘI DUNG CHUYÊN ĐỀ Chương 1: Tổng quan danh sách liên kết Giới thiệu danh sách liên kết Danh sách liên kết danh sách tuyến tính phần tử liệu phân tử liệu gọi điểm nút, điểm nút liên kết với giông trỏ Danh sách liên kết cấu trúc liệu bao gồm tập nút đứng cạnh chuỗi Mỗi nút bao gồm liệu liên kết tới nút kết tiếp chuỗi Cấu trúc cho phép thêm xoá cách hiệu phẩn tử vị trí chuỗi Ví dụ: Hình 1: Một danh sách liên kết đơn, nút chứa hai trường: giá trị nguyên liên kết tới nút Danh sách liên kết trọng cấu trúc liệu đơn giản phổ biến Chúng sử dụng để thực số kiểu liệu trừu tượng phổ biến khác lists, stack, queues, Tuy nhiên, dùng để thực cấu trúc liệu khác cách trực tiếp không sử dụng danh sách thực thi sở Lợi chủ yếu danh sách liên kết so với mảng thông thường danh sách phẩn tử dễ dàng thêm xoá mà không cần thiết lập lại vị trí hay cách tổ chức toàn cấu trúc thành phần liệu không lưu trữ kề nhớ, mảng phải khải báo mã nguồn trước dịch chạy chương trình Danh sách liên kết cho phép chèn xoá nút vị trí danh sách thực với số thao tác định liên kết trước với liên kết thêm vào xoá trì Danh sách liên kết thân không cho phép truy cập cách ngẫu nhiên vào liệu dạng số Do đó, nhiểu thao tác lấy nút cuối danh sách hay tìm kiểm nút với điểu kiện hay thiết đặt vị trí cho nút mới… cần phải duyệt hầu hết hoăc toàn phần tử danh sách Ưu điểm nhược điểm 2.1 Ưu điểm - Danh sách liên kết cấu trúc liệu động, tăng lên bớt đi, cấp phát thu hồi nhớ chương trình chạy - Thao tác chèn xoá nút thực cách dễ dàng - Các cấu trúc tuyến tính Stacks queues thực thi cách dễ dàng danh sách liên kết - Chúng giảm thời gian truy cập mở rộng theo thời gian thực mà không cần nhớ nhớ định 2.2 Nhược điểm - Chúng có xu hướng sử dụng thêm nhớ trỏ yêu cầu thêm không gian lưu trữ - Các nút danh sách liên kết phải đọc cách thứ tự từ đầu danh sách - Các nút lưu trữ không kề nhau, làm tăng thời gian truy cập vào phần tử đơn lẻ danh sách - Khó khăn thực duyệt ngược danh sách - Bộ nhớ heap hạn chế Chương 2: Các loại danh sách liên kết thuật ngữ liên quan Các loại danh sách liên kết 1.1 Danh sách liên kết đơn Danh sách liên kết đơn bao gồm phần tử có mối liên hệ với Mỗi phần tử nút, nút có trường liệu chứa thông tin trường liên kế chứa địa nút danh sách lưu trữ giá trị Null phần tử nằm cuối danh danh sách Các thao tác thực danh sách liên kết đơn bao gồm thêm, xoá duyệt nút Ví dụ: Hình 2: Danh sách liên kết đơn, nút chứa hai trường: giá trị nguyên liên kết tới nút 1.2 Danh sách liên kết kép Danh sách liên kết bao gồm phần tử có mối liên hệ với Mỗi phần tử nút, nút có trường liệu chứa thông tin hai trường liên kết chứa địa nút đứng trước sau danh sách Ví dụ: Hình 3: Danh sách liên kết kép, nút chứa ba trường: Một giá trị nguyên, liên kết với nút đứng trước liên kết với nút đứng sau Rất nhiều hệ điều hành sử dụng danh sách liên kết kép để trì tham số tiến trình hoạt động, luồng số đối tượng động khác 1.3 Danh sách liên kết vòng Danh sách liên kết vòng danh sách đơn (hoặc kép) mà phần tử cuối danh sách thay mang giá trị Null, trỏ tới phần tử đầu danh sách Ví dụ: HÌnh 4: Danh sách liên kết vòng Các thuật ngữ liên quan 2.1 Nút giả (Dummy node) Nút giả nút thiết kế để sử dụng danh sách liên kết điểm kết thúc Nó không chứa liệu quản lý cấu trúc liệu Việc sử dụng có nhiểu ưu điểm nhu tăng tốc độ thao tác, giảm độ phức tạp thuật toán chiểu dài code, làm cấu trúc liệu trở lên mạnh mẽ 2.2 Danh sách trống (Empty lists) Danh sách trống danh sách không chứa ghi liệu nút giả sử dụng, danh sách, danh sách gọi trống có nút giả 2.3 Trường liên kết (Hash linking) Trường liên kết phần nút Nếu ghi liệu lưu trữ mảng tham chiếu thông qua số trường liên kết lưu trữ mảng riêng với số giống sổ ghi liệu So sánh loại cấu trúc liệu danh sách 3.1 Danh sách liên kết mảng động Mảng động cấu trúc liệu cấp phát tất phần tử liên tiếp nhớ cố định số phần tử Nếu không gian có cho mảng động bị đầy, cấp phát lại chép phần tử Danh sách liên kết có số ưu điểm mảng động chèn thêm xoá phần tử vị trí danh sách, giả sử định số trỏ tới nút (trước vị trị cần xoá cần chèn thêm) rồi, thao tác với thời gian không đổi, việc chèn mảng động vị trí ngẫu nhiên yêu cầu di chuyển trung bình nửa số phần tử tất phần tử trường hợp xấu Trong xoá phần tử từ mảng thời gian không đổi cách đánh dấu chỗ chỗ trống, nguyên nhân gây phân mảnh, cản trở việc thực vòng lặp Ngoài ra, nhiểu phần tử thêm vào danh sách liên kết bị giới hạn tổng nhớ khả dụng; mảng động lấp đầy cấu trúc liệu mảng phải cấp phát lại, trí cấp phát lại nhớ bị phân mảnh, chi phí cấp phát lại lớn việc chèn chi phí chèn cấp phát lại trừ dần O(1) Điểu giúp việc gắn thêm phần tử cuối mảng, việc chèn (hoặc xoá) vào vị trí kéo theo chi phí trái phép liệu di chuyển để trì mảng có nhiểu phẩn tử xoá đưa trở lại kích thước yêu cầu để tránh lãng phí nhiểu nhớ Mảng động (cũng cấu trúc liệu mảng cố định) cho phép truy cập ngẫu nhiên với khoảng thời gian không đổi, danh sách liên kết cho phép truy cập phần tử Trong thực tế, danh sách liên kết đơn dễ dàng duyệt đường, nên làm cho danh sách liên kết không phù hợp với ứng dụng mà cần tìm kiếm phần tử số nhanh chóng Truy cập mảng hay mảng động nhanh danh sách liên kết nhiểu máy chúng tối ưu vị trí tham chiếu hữu ích để giấu liệu Một nhược điểm danh sách liên kết lưu trữ thêm cần thiết cho tham chiếu thường làm cho chúng không thực tế cho danh sách mục liệu nhỏ ký tự giá trị boolean, lưu trữ cho liên kết vượt gấp nhiều lần liệu Ngược lại, mảng động yêu cầu khoảng trống cho liệu (và số lượng nhỏ liệu điểu khiển) Nó chậm với cấp phát để cấp phát nhớ cho phần tử, vấn chung giải việc sử dụng bể nhớ (memory pools) Một vài giải pháp biến thể cố kết hợp hai ưu điểm hai loại danh sách Danh sách liên kết mở (Unrolled linked list) lưu trữ số phần tử nút danh sách, tăng khả lưu trữ giảm nhớ định cho tham chiếu 3.2 Danh sách liên kết kép đanh sách liên kết đơn Danh sách liên kết kép yêu cầu nhiểu không gian cho nút, thao tác chúng nhiều chi phí Nhưng chúng lại dễ dàng để thao tác tay chúng cho phép truy cập nhanh dễ dàng từ tất chiểu Một danh sách liên kết kép chèn thêm xoá nút số thao tác định cho địa nút Để làm tương tự danh sách liên kết đơn, ta phải có địa trỏ tới nút đó, dẫn cho toàn danh sách (trong trường hợp nút ) trường liên kết nút trước Một vài thuật toán yêu cầu truy cập từ tất chiểu Mặt khác danh sách liên kết kép không cho phép chi sẻ đoạn cuối danh sách (tail-sharing) sử dụng cấu trúc liệu bền vững 3.3 Danh sách liên kết vòng danh sách liên kết đơn Một danh sách liên kết vòng dùng để miêu tả mảng vòng tròn thực tế, ví dụ: góc đa giác, nhớ đệm sử dụng giải phóng thứ tự FIFO (Fisrt In, First Out)… Trong ứng dụng này, trỏ tới nút dùng làm dẫn tới toàn danh sách Với dánh sách liên kết vòng, trỏ tới nút cuối cho truy cập dễ dàng nút liên kết Do vậy, ứng dụng yêu cầu truy cập từ tất đầu danh sách (ví dụ: thực hàng đợi), cấu trúc vòng cho phép ta điểu khiển cấu trúc trỏ Một danh sách vòng tách thành hai danh sách vòng khoảng thời gian cố định việc cho biết địa nút cuối vòng Thao tác bao gồm trao đổi thông tin trường liên kết hai nút Thực thao tác tương tự với hai nút hai danh sách riêng biệt, ghép hai danh sách thành Đặc tính đơn giản số cấu trúc liệu giải thuật Sự miêu tả đơn giản cho danh sách vòng trống trỏ null, cho biết danh sách nút Không có trỏ null, nhiểu thuật toán phải kiểm tra trường hợp đặc biệt làm việc với theo cách khác Ngược lại, sử dụng null để biểu thị danh sách đơn trống tự nhiên xảy trường hợp đặc biệt 3.4 Danh sách liên kết đơn danh danh sách khác Trong danh sách liên kết kép danh sách liên kết vòng có ưu điểm danh sách liên kết đơn Nhưng danh sách liên kết đơn có ưu điểm làm cho chúng thích hợp số trường hợp Một danh sách liên kết đơn cấu trúc liệu đệ quy, chứa trỏ tới đối tượng nhỏ kiểu Chính lý đó, nhiểu thao tác danh sách liên kết đơn (như ghép hai danh sách, liệt kê phần tử đảo thứ tự) thường có thuật toán đệ quy đơn giản, đơn giản giải pháp sử dụng câu lệnh lặp Trong giải pháp đệ quy sửa lại cho phù hợp với danh sách liên kết kép liên kết vòng, thủ tục cần thêm tham số trường hợp phức tạp Danh sách liên kết đơn cho phép chia sẻ đoạn cuối danh sách (tail-sharing), Cụ thể, nút thêm vào vị trí bắt đầu danh sách, danh sách cũ trì đoạn cuối danh sách Chương 3: Các thao tác danh sách liên kết Trong Java bạn phép định nghĩa class (B) bên class (A) khác Class A gọi outer class class B gọi inner class Mục đích inner class sử dụng bên class hỗ trợ Dưới LinkedList class với inner Node class private static class Node { private AnyType data; private Node next; public Node(AnyType data, Node next) { this.data = data; this.next = next; } } Một inner class thành viên class chứa có truy cập tới thành viên khác outer class outer class có truy cập trực tiếp tới tất thành viên inner class Một inner class khai báo private, public, protected package private Có hai kiểu inner class: static non-static Một static inner class chuyển trực tiếp tới biến instance phương thức định nghĩa bên outer class nó: Nó sử dụng chúng qua đối tượng tham chiếu Chúng ta thực thi LinkedList class với hai inner class: static Node class nonstatic LinkedListIterator class public Iterator iterator() { return new LinkedListIterator(); } private class LinkedListIterator implements Iterator { private Node nextNode; public LinkedListIterator() { nextNode = head; } public boolean hasNext() { return nextNode != null; } public AnyType next() { if (!hasNext()) throw new NoSuchElementException(); AnyType res = nextNode.data; nextNode = nextNode.next; return res; } public void remove() { throw new UnsupportedOperationException(); } } Giả sử ta có danh sách liên kết đơn theo thứ tự bước thực bên Danh sách lưu trữ trạng thái khởi tạo trước dòng thực thi 1) head = head.next; 2) head.next = head.next.next; 3) head.next.next.next.next=head; Thêm nút vào đầu danh sách Phương thức tạo nút thêm vào trước nút bắt đầu danh sách public void addFirst(AnyType item) { head = new Node(item, head); } Duyệt danh sách Bắt đầu với head truy cập nút đến điểm null Không thay đổi tham số head Node tmp = head; while(tmp != null) tmp = tmp.next; Thêm nút vào cuối danh sách Tạo phương thức gắn nút vào điểm cuối danh sách Việc yêu cầu duyệt danh sách phải đảm bảo bạn dừng nút cuối public void addLast(AnyType item) { if(head == null) addFirst(item); else { Node tmp = head; while(tmp.next != null) tmp = tmp.next; tmp.next = new Node(item, null); } } Chèn vào sau nút danh sách Tìm nút chứa “key” chèn nút vào sau nút Trong hình bên dưới, chèn nút sau “E”: public void insertAfter(AnyType key, AnyType toInsert) { Node tmp = head; while(tmp != null && !tmp.data.equals(key)) tmp = tmp.next; if(tmp != null) tmp.next = new Node(toInsert, tmp.next); } Chèn vào trước nút danh sách Tìm nút chứa “key” chèn nút vào trước nút Trong hình bên dưới, chèn nút sau “A”: Để thuận tiện hơn, trì hai tham số prev cur Khi duyệt dọc danh sách di chuyển hai tham số này, giữ prev trước bước so với cur Chúng ta duyệt cur trạm đến nút trước nút cần chèn Nếu cur trạm đến null, không chèn mà chèn nút prev cur public void insertBefore(AnyType key, AnyType toInsert) { if(head == null) return null; if(head.data.equals(key)) { addFirst(toInsert); return; } Node prev = null; Node cur = head; while(cur != null && !cur.data.equals(key)) { prev = cur; cur = cur.next; } if(cur != null) prev.next = new Node(toInsert, cur); } Xóa nút danh sách Tìm nút chứa “key” xóa Trong hình bên xóa nút chứa “A”: Thuật toán xóa nút tương tự thuật toán chèn vào trước nút danh sách Chúng ta sử hai tham số prev cur Khi duyệt dọc theo danh sách di chuyển hai tham số cho tham số prev trước bước so với cur Chúng ta duyệt danh sách tham số cur trạm đến nút muốn xóa Có trường hợp ngoại lệ cần lưu ý: 1) Danh sách trống 2) Xóa nút 3) Nút không tồn danh sách public void remove(AnyType key) { if(head == null) throw new RuntimeException("cannot delete"); if( head.data.equals(key) ) { head = head.next; return; } Node cur = head; Node prev = null; while(cur != null && !cur.data.equals(key) ) { prev = cur; cur = cur.next; } if(cur == null) throw new RuntimeException("cannot delete"); prev.next = cur.next; } Chương 4: Xây dựng chương trình sử dụng danh sách liên kết java KẾT LUẬN Sau tìm hiểu danh sách liên kết, em học cách thêm, duyệt, chèn xóa nút vào danh sách Những thao tác hữu ích nhiều ứng dụng thực tế Ví dụ ứng dụng Microsoft Powerpoint, coi thuyết trình powerpoint danh sách, nút slide Trong trình tạo quản lý slide sử dụng thao tác chèn xóa nút danh sách liên kết Có nhiểu ứng dụng yêu cầu trừu tượng vấn đề danh sách Danh sách liên kết là cấu trúc liệu sử dụng rộng rãi chương trình ứng dụng Có cấu trúc liệu danh sách liên kết nâng cao khác mà em cần tìm hiểu mảng danh sách liên kết, danh sách liên kết danh sách liên kết hay danh sách đa liên kết Các cấu trúc sử dụng để thực ứng dụng yêu cầu cấu trúc liệu phức tạp TÀI LIỆU THAM KHẢO [1] Michiel T.Goodrich, Roberto Tamassia, Michael H.Goldwasser, “Data Structures and algorithms.” [2] Linked Lists, “www.cs.cmu.edu/ ~adamchik/15- 121/lectures/Linked%20Lists /linked%20lists.html” [3] Linked List Basics, “www.cslibrary.stanford.edu/103/LinkedListBasics.pdf” [...]... nút trong danh sách liên kết Có rất nhiểu ứng dụng yêu cầu chúng ta trừu tượng các vấn đề như một danh sách Danh sách liên kết là là một trong những cấu trúc dữ liệu được sử dụng rộng rãi trong các chương trình ứng dụng Có các cấu trúc dữ liệu danh sách liên kết nâng cao khác mà em cần tìm hiểu như mảng danh sách liên kết, danh sách liên kết trong danh sách liên kết hay danh sách đa liên kết Các cấu... cur.next; } Chương 4: Xây dựng chương trình sử dụng danh sách liên kết bằng java KẾT LUẬN Sau khi tìm hiểu về danh sách liên kết, em đã học được cách thêm, duyệt, chèn và xóa một nút vào danh sách Những thao tác này rất hữu ích trong rất nhiều ứng dụng thực tế Ví dụ như ứng dụng Microsoft Powerpoint, có thể coi một bài thuyết trình powerpoint như một danh sách, mỗi một nút là một slide Trong quá trình tạo... UnsupportedOperationException(); } } Giả sử ta có danh sách liên kết đơn và theo thứ tự mỗi bước thực hiện bên dưới Danh sách đó được lưu trữ trạng thái khởi tạo của nó trước mỗi dòng thực thi 1) head = head.next; 2) head.next = head.next.next; 3) head.next.next.next.next=head; 1 Thêm một nút vào đầu danh sách Phương thức tạo một nút và thêm vào trước nút bắt đầu của danh sách public void addFirst(AnyType item)... addFirst(AnyType item) { head = new Node(item, head); } 2 Duyệt danh sách Bắt đầu với head và truy cập mỗi nút cho đến khi đến điểm null Không thay đổi tham số head Node tmp = head; while(tmp != null) tmp = tmp.next; 3 Thêm một nút vào cuối danh sách Tạo phương thức gắn nút mới vào điểm cuối danh sách Việc này yêu cầu duyệt danh sách nhưng phải đảm bảo rằng bạn dừng ở nút cuối cùng public void... Xóa một nút trong danh sách Tìm một nút chứa “key” và xóa nó Trong hình bên dưới chúng ta xóa một nút chứa “A”: Thuật toán xóa một nút cũng tương tự như thuật toán chèn vào trước một nút trong danh sách Chúng ta sử hai tham số prev và cur Khi chúng ta duyệt dọc theo danh sách chúng ta cũng di chuyển hai tham số này sao cho tham số prev trước một bước so với cur Chúng ta duyệt danh sách cho đến khi tham... sau một nút trong danh sách Tìm một nút chứa “key” và chèn một nút mới vào sau nút đó Trong hình bên dưới, chúng ta chèn một nút mới sau “E”: public void insertAfter(AnyType key, AnyType toInsert) { Node tmp = head; while(tmp != null && !tmp.data.equals(key)) tmp = tmp.next; if(tmp != null) tmp.next = new Node(toInsert, tmp.next); } 5 Chèn vào trước một nút trong danh sách Tìm một nút... tham số này sao cho tham số prev trước một bước so với cur Chúng ta duyệt danh sách cho đến khi tham số cur trạm đến nút muốn xóa Có 3 trường hợp ngoại lệ cần lưu ý: 1) Danh sách trống 2) Xóa nút đầu tiên 3) Nút không tồn tại trong danh sách public void remove(AnyType key) { if(head == null) throw new RuntimeException("cannot delete"); if( head.data.equals(key) ) { head = head.next; return; } Node... Tìm một nút chứa “key” và chèn một nút mới vào trước nút đó Trong hình bên dưới, chúng ta chèn một nút mới sau “A”: Để thuận tiện hơn, chúng ta duy trì hai tham số prev và cur Khi chúng ta duyệt dọc danh sách chúng ta cũng di chuyển hai tham số này, giữ prev trước một bước so với cur Chúng ta cứ duyệt cho đến khi cur trạm đến nút trước nút chúng ta cần chèn Nếu cur trạm đến null, chúng ta không chèn... cần tìm hiểu như mảng danh sách liên kết, danh sách liên kết trong danh sách liên kết hay danh sách đa liên kết Các cấu trúc này được sử dụng để thực hiện các ứng dụng yêu cầu cấu trúc dữ liệu phức tạp TÀI LIỆU THAM KHẢO [1] Michiel T.Goodrich, Roberto Tamassia, Michael H.Goldwasser, “Data Structures and algorithms.” [2] Linked Lists, “www.cs.cmu.edu/ ~adamchik/15- 121/lectures/Linked%20Lists /linked%20lists.html”

Ngày đăng: 11/07/2016, 22:36

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

Tài liệu liên quan