1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng cấu trúc dữ liệu chương 8 nguyễn xuân vinh

37 356 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 37
Dung lượng 221,22 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

• Các vấn đề cơ bản với ArrayList, Linked List• Bảng băm “hoàn hảo” • Hàm băm hoàn hảo • Phương pháp xây dựng hàm băm • Ưu điểm của bảng băm • Các cách giải quyết xung đột collision • Cá

Trang 1

[214331]

Trang 2

• Các vấn đề cơ bản với ArrayList, Linked List

• Bảng băm “hoàn hảo”

• Hàm băm hoàn hảo

• Phương pháp xây dựng hàm băm

• Ưu điểm của bảng băm

• Các cách giải quyết xung đột (collision)

• Các bảng băm phổ biến (đọc them)

• Java Map Interface

• Map implementations in Java

• HashMap example

Trang 3

Khắc phục?

Trang 4

• Bài toán: cần lưu trữ các mẫu tin và thực hiện các thao tác

– Thêm mẫu tin

– Xoá mẫu tin

– Tìm mẫu tin theo khóa

• Tìm cách thức thực hiện một cách hiệu quả?

Trang 5

– Xoá: chậm do tìm rồi xoá O(n)

– Tìm kiếm: tuần tự chậm O(n)

Trang 6

– Sử dụng mảng lưu trữ mẫu tin, có thứ tự

– Thêm: chèn vào đúng vị trí, chậm O(n)

– Xoá: phải dời các phần tử phía sau, chậm O(n)– Tìm: nhị phân, nhanh O(logn)

Trang 7

– Lưu trữ mẫu tin trong danh sách liên kết

– Thêm: nhanh, O(1)

– Xoá: nhanh khi xoá nút, chậm khi tìm O(n)– Tìm kiếm: tìm kiếm tuần tự O(n)

Trang 9

0012345 0033333

Thao

Minh Phuong Danh

An Binh

7.3 10.0 2.0

5.68

8.15 90

Trang 10

An :

: 9.0 :

:

: 4.9 :

: 9999999

Một cách “stupid” là lưu trữ mẫu tin trong mảng cực lớn 0 9999999 Index được sử dụng như là mã số sinh viên Khi đó mẫu tin sv với ms

0012345 được lưu trữ ở A[12345]!

Một cách “stupid” là lưu trữ mẫu tin trong mảng cực lớn 0 9999999 Index được sử dụng như là mã số sinh viên Khi đó mẫu tin sv với ms

0012345 được lưu trữ ở A[12345]!

Trang 11

• Dạng bảng băm với địa chỉ trực tiếp

– Mỗi vị trí tương ứng một khoá trong U

– Nếu 1 phần tử x có khoá k, thì T[k] chứa tham chiếu đến x

– Ngược lại T[k] = Ø được thể hiện là null

U (universe of key)

-

- -

-0 1 2 3 4 5 6 7 8 9

2 3 5

8

Trang 12

• Lưu trữ mẫu tin trong mảng lớn: chỉ mục tương đương khóa

• Thêm: rất nhanh O(1)

• Xóa: rất nhanh O(1)

• Tìm: rất nhanh O(1)

• Nhưng lãng phí rất nhiều bộ nhớ!

Trang 13

int Hash(KeyType key)

Giả sử có hàm “magic” hash Nó ánh xạ mã số của 1000 sinh viên vào các số 0 999, ánh xạ one to one Không có 2 mã số cùng giá trị ánh xạ.

Giả sử có hàm “magic” hash Nó ánh xạ mã số của 1000 sinh viên vào các số 0 999, ánh xạ one to one Không có 2 mã số cùng giá trị ánh xạ.

H(‘0012345’) = 134 H(‘0033333’) = 67 H(‘0056789’) = 764

… H(‘9908080’) = 3

Trang 14

Tung :

: 9.0 : 4.9 :

name score

An 8.15 :

:

Danh :

: : 5.68 :

:

0033333 :

9908080 : 0012345

: :

0056789 :

3 67 0

764 999

134

Để lưu trữ 1 mẫu tin, gọi Hash(stud_id) và lưu trữ vào vị trí Hash(stud_id) trong mảng

Để tìm một sinh viên, chỉ cần gọi Hash(stud_id).

Để lưu trữ 1 mẫu tin, gọi Hash(stud_id) và lưu trữ vào vị trí Hash(stud_id) trong mảng

Để tìm một sinh viên, chỉ cần gọi Hash(stud_id).

Hàm băm “hoàn hảo”

Trang 15

– Thêm: rất nhanh O(1)

– Xóa: rất nhanh O(1)

Trang 16

• Dung hòa tốt giữa thời gian truy xuất và dung lượng bộ nhớ

– Nếu ko giới hạn bộ nhớ: one-to-one, truy xuất tức thì

– Nếu dung lượng bộ nhớ có giới hạn thì tổ chức khóa cùng địa chỉ

• Bảng băm ứng dụng nhiều trong thực tế, thích hợp tổ chức dữ liệu

có kích thước lớn và lưu trữ ngoài

Trang 17

• Hàm băm: biến đổi khóa thành chỉ mục trên bảng băm

– Khóa có thể là dạng số hay dạng chuỗi

– Chỉ mục được tính từ 0 M-1, với M là số chỉ mục của bảng băm

– Hàm băm thường dùng: key % M, với M là độ lớn của bảng băm

• Hàm băm tốt phải thoả yêu cầu

Trang 18

 Ví dụ: cho bảng chữ cái alphabet, chữ cái a được băm vào địa chỉ

0, chữ cái b được băm vào địa chỉ 1, , của bảng băm

 Hàm băm sử dụng phương pháp chia

 Dùng số dư: h(x) = x % M

x là khóa, M là kích thước bảng băm (nên là số nguyên tố )

Trang 19

 Sử dụng phương pháp trung phương(Middle Square)

Với M = 2 k (k>=1) (M là kích thước của mảng)

W = 2 w (w: là số lượng bit của một số int = 32)

Trang 22

• Mỗi địa chỉ bảng băm tương ứng một DSLK

• Các nút bị xung đột nối kết với nhau trên một DSLK

• Danh sách liên kết từ 0 đến M-1

• Khi tìm địa chỉ hàm băm f(key) sẽ xác định địa chỉ i [0 M-1], ứng với danh sách thứ i chứa phần tử  tiếp tục tìm kiếm trên danh sách liên kết

Trang 23

• Bảng băm có tập khóa là số nguyên, tập địa chỉ có 10 địa chỉ

0 1 2 3 4 5 6 7 8 9

Bảng địa chỉ

Trang 24

 Nếu băm lần đầu bị xung đột thì băm lại lần 1, nếu bị xung đột nữa thì băm lai lần 2,… Quá trình băm lại diễn ra cho đến khi không còn xung đột nữa.

 Các phép băm lại (rehash function) thường sẽ chọn địa chỉ khác cho các phần tử

hi(key)=(h(key)+i) %M

với h(key) là hàm băm chính của bảng băm

Trang 25

 Hàm băm lại của phương pháp dò bậc hai là truy xuất các địa chỉ cách bậc 2

 Hàm băm lại hàm i được biểu diễn bằng công thức sau:

hi(key)=( h(key) + i2 ) % M

với h(key) là hàm băm chính của bảng băm

 Nếu đã dò đến cuối bảng thì trở về dò lại từ đầu bảng

 M nên là số nguyên tố

Trang 26

• Sinh viên đọc thêm tài liệu:

– Nguyễn Hồng Chương, CTDL ứng dụng và cài đặt bằng C, NXB TPHCM, 2005, p413

– http://en.wikipedia.org/wiki/Hash_table

– http://www.sparknotes.com/cs/searching/hashtables/section1.html

– http://www.cs.auckland.ac.nz/software/AlgAnim/hash_tables.html

Trang 27

public interface Map { Object put(Object key, Object value); Object get(Object key);

Object remove(Object key);

boolean containsKey(Object key);

boolean containsValue(Object value); int size();

Trang 28

• Map is an interface; you can't say new Map()

• There are two implementations:

– java.util.HashMap is best for most purposes

– we won't use the other one: TreeMap

• Preferred: Map m = new HashMap();

Not: HashMap m = new HashMap();

Trang 30

public class Birthday {

public static void main(String[] args){

Map m = new HashMap();

m.put("Newton", new Integer(1642));

m.put("Darwin", new Integer(1809));

Trang 31

• public Object get(Object key)

– returns the value at the specified key, or null if the key is not in the map (constant time)

• public boolean containsKey(Object key)

– returns true if the map contains a mapping for the specified key (constant time)

• public boolean containsValue(Object

Trang 32

• A map itself is not regarded as a collection

– Map does not implement Collection interface

– although, in theory, it could be seen as a collection of pairs, or

a relation in discrete math terminology

• Instead collection views of a map may be obtained

– Set of its keys

– Collection of its values (not a set why?)

Trang 33

• Map interface has no iterator method; you can’t get an Iterator directly

• must first call either

– keySet() returns a Set of all the keys in this Map

– values() returns a Collection of all the values in this Map

• then call iterator() on the key set or values

– Examples:

Iterator keyItr = grades.keySet().iterator();

Iterator elementItr = grades.values().iterator();

– If you really want the keys or element values in a more familiar collection such as an ArrayList, use the ArrayList constructor that takes a

Collection as its argument ArrayList elements = new ArrayList(grades.values());

Trang 34

• Usually iterate by getting the set of keys, and iterating over that

Set keys = m.keySet();

Iterator itr = keys.iterator();

while (itr.hasNext()) {

Object key = itr.next();

System.out.println(key + "=>" + m.get(key)); }

Output:

Darwin => 1809

Newton => 1642

Trang 35

• Write code to invert a Map; that is, to make the values the keys and make the keys the values.

Map byName = new HashMap();

byName.put("Darwin", "748-2797");

byName.put("Newton", "748-9901");

Map byPhone = new HashMap();

// your code here!

System.out.println(byPhone);

Output:

{748-2797=Darwin, 748-9901=Newton}

? Write a program to count words in a text file, using a hash map

to store the number of occurrences of each word.

Ngày đăng: 03/12/2015, 06:43

HÌNH ẢNH LIÊN QUAN

Bảng  địa chỉ - Bài giảng cấu trúc dữ liệu  chương 8   nguyễn xuân vinh
ng địa chỉ (Trang 23)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm