- vừa được xem lúc

Chương 3: LINKED LISTS - 5.Doubly Linked List hiệu quả về bộ nhớ

0 0 12

Người đăng: Đặng An

Theo Viblo Asia

3.9 Doubly Linked List hiệu quả về bộ nhớ

Trong cách triển khai thông thường, chúng ta cần giữ một con trỏ next trỏ đến mục tiếp theo trong danh sách và một con trỏ prev trỏ tới mục trước đó.
Điều đó có nghĩa là, các phần tử trong triển khai danh sách được liên kết kép bao gồm dữ liệu, một con trỏ đến nút tiếp theo và một con trỏ đến nút trước đó trong danh sách như được hiển thị bên dưới.

Conventional Node Definition

 public class DLLNode{ private int data; private DLLNode next; private DLLNode prev; ............... }

Hiện tại chúng ta có một cách triển khai thay thế của danh sách liên kết kép ADT, với các thao tác chèn, duyệt và xóa. Việc triển khai này dựa trên sự khác biệt của con trỏ. Mỗi nút chỉ sử dụng một con trỏ để duyệt qua lại danh sách.
Nó còn được gọi là XOR Linked List

New Node Definition

 public class ListNode{ private int data; private ListNode ptrdiff; ............... }

Con trỏ ptrdiff chứa sự khác biệt giữa con trỏ tới nút tiếp theo và con trỏ tới nút trước đó. Sự khác biệt của con trỏ được tính bằng cách sử dụng phép toán exclusive-or ()(⊕)

ptrdiff = pointer to previous node pointer to next node

Điểm chính của nút bắt đầu (head node) là của NULL và nút tiếp theo của head.
Tương tự, điểm thứ tự của nút kết thúc là của nút trước đó (trước đến nút cuối) và NULL.
Ví dụ, hãy xem xét danh sách liên kết sau đây.

Trong ví dụ trên,

  • Con trỏ tiếp theo của A là: NULL B
  • Con trỏ tiếp theo của B là: A C
  • Con trỏ tiếp theo của C là: B D
  • Con trỏ tiếp theo của D là: C NULL


Why does it work?
Để tìm câu trả lời cho câu hỏi này, chúng ta hãy xem xét các thuộc tính của ⊕:

  • X ⊕ X = 0
  • X ⊕ 0 = X
  • X ⊕ Y = Y ⊕ X (symmetric - tính đối xứng)
  • (X ⊕ Y) ⊕ Z = X ⊕ (Y ⊕ Z) (transitive - tính bắc cầu)

Với ví dụ trên, chúng ta hãy giả sử rằng chúng ta đang ở nút C và muốn chuyển đến nút B.
Chúng ta biết rằng ptrdiff của nút C được định nghĩa là B ⊕ D.
Nếu chúng ta muốn di chuyển đến B, thực hiện ⊕ trên điểm thứ ba của C với D sẽ cho B.
Điều này là do thực tế rằng,

Tương tự, nếu chúng ta muốn chuyển đến D, thì chúng ta phải áp dụng ⊕ cho ptrdiff của C với B để có được D.

Từ thảo luận trên, chúng ta có thể thấy rằng chỉ bằng cách sử dụng một con trỏ duy nhất, chúng ta có thể di chuyển qua lại.
Có thể triển khai danh sách liên kết kép một cách hiệu quả về bộ nhớ mà không ảnh hưởng đến hiệu quả thời gian một cách tối thiểu.

Note: Ở đây mình không implement vì nếu chúng ta cần lấy XOR của hai địa chỉ, chúng ta cần truyền địa chỉ bộ nhớ thành số nguyên, điều này không thể thực hiện được trong java. Nó có thể implement sử dụng C/C++, các bạn nếu muốn tìm hiểu thêm có thể tham khảo ở đây

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đôi chút về cấu trúc dữ liệu và thuật toán

Theo anh Phạm Huy Hoàng (toidicodedao) đã viết trong blog của mình là kiến thức trong ngành IT có 2 loại, một là càng để lâu thì càng cũ, lạc hậu và trở lên vô dụng. Hai là càng để lâu thì càng có giá trị thậm chí ngày càng có giá.

0 0 32

- vừa được xem lúc

Cấu trúc dữ liệu Merkle Tree

Cây Merkle là một cây nhị phân có thứ tự được xây dựng từ một dãy các đối tượng dữ liệu (d1, d2,...,dn) sử dụng hàm băm h. Các “lá” của cây là các giá trị băm h(di) đối với 1 ≤ i ≤ n.

0 0 47

- vừa được xem lúc

Cách xây dựng cấu trúc dữ liệu Stack và Queue.

Mở đầu. Hello các bạn, hôm nay mình sẽ chia sẻ với các bạn cách để có thể tự xây dựng 2 loại cấu trúc dữ liệu stack(ngăn xếp) và queue(hàng đợi) sử dụng mảng trong C++;.

0 0 31

- vừa được xem lúc

Tối ưu ứng dụng với cấu trúc dữ liệu cơ bản

Ở Việt Nam có một nghịch lý ai cũng biết: hầu hết sinh viên ngành CNTT đều đã học cấu trúc dữ liệu và giải thuật, thuộc các môn bắt buộc. Thế nhưng lại rất hiếm khi ứng dụng vào công việc hoặc bị loại

0 0 36

- vừa được xem lúc

Chương 1: Introduction - Analysis of Algorithrms

Trong bài viết này mình sẽ nói về cách chúng ta sẽ sử dụng để phân tích và so sánh các loại thuật toán khác nhau. 1.

0 0 16

- vừa được xem lúc

Chương 1: Introduction - Các khái niệm cơ bản

Lời nói đầu. Trước khi có máy tính, đã có các thuật toán.

0 0 17