Căi đặt tập hợp bằng vector Bit

Một phần của tài liệu Lập trình C (Trang 105 - 107)

V. CĐY TÌM KIẾM NHỊ PHĐN (BINARY SEARCH TREES)

1. Căi đặt tập hợp bằng vector Bit

Hiệu quả của một câch căi đặt tập hợp cụ thể phụ thuộc văo câc phĩp toân vă kích thước tập hợp. Hiệu quả năy cũng sẽ phụ thuộc văo tần suất sử dụng câc phĩp toân trín tập hợp. Chẳng hạn nếu chúng ta thường xuyín sử dụng phĩp thím văo vă loại bỏ câc phần tử trong tập hợp thì chúng ta sẽ tìm câch căi đặt hiệu quả cho câc phĩp toân năy. Còn nếu phĩp tìm kiếm một phần tử xảy ra thường xuyín thì ta có thể phải tìm câch căi đặt phù hợp để có hiệu quả tốt nhất.

Ở đđy ta xĩt một trường hợp đơn giản lă khi toăn thể tập hợp của chúng ta lă tập hợp con của một tập hợp câc số nguyín nằm trong phạm vi nhỏ từ 1.. n chẳng hạn thì chúng ta có thể dùng một mảng kiểu Boolean có n phần tử để căi đặt tập hợp (ta gọi lă vectơ bít), bằng câch cho phần tử thứ i của mảng năy giâ trị TRUE nếu i thuộc tập hợp hoặc cho mảng lưu kiểu 0- 1. Nếu nội dung phần tử trong mảng tại vị trí i lă 1 nghĩa lă i tồn tại trong tập hợp vă ngược lại, nội dung lă 0 nghĩa lă phần tử i đó không tồn tại trong tập hợp.

Ví dụ: Giả sử câc phần tử của tập hợp được lấy trong câc số nguyín từ 1 đến 10 thì mỗi tập hợp được biểu diễn bởi một mảng một chiều có 10 phần tử với câc giâ trị phần tử thuộc kiểu logic. Chẳng hạn tập hợp A={1,3,5,8} được biểu diễn trong mảng có 10 phần tử như sau:

1 2 3 4 5 6 7 8 9 10 1 0 1 0 1 0 0 1 0 0

Câch biểu diễn năy chỉ thích hợp trong điều kiện lă mọi thănh viín của tất cả câc tập hợp đang xĩt phải có giâ trị nguyín hoặc có thể đặt tương ứng duy nhất với số nguyín nằm trong một phạm vi nhỏ. Có thể dễ dăng nhận thấy khai bâo căi đặt như sau

const maxlength = 100;

// giâ trị phần tử lớn nhất trong tập hợp số nguyín không đm typedef int SET [maxlength];

Tạo một tập hợp rỗng

Để tạo một tập hợp rỗng ta cần đặt tất cả câc nội dung trong tập hợp từ vị trí 0 đến vị trí maxlength đều bằng 0. Cđu lệnh được viết như sau :

void makenull(SET a) { int i; for(i=0;i<maxlength;i++) a[i]=0; }

Biểu diễn tập hợp bằng vectơ bít tạo điều kiện thuận lợi cho câc phĩp toân trín tập hợp. Câc phĩp toân năy có thể căi đặt dễ dăng bằng câc phĩp toân Logic trong ngôn ngữ lập trình. Chẳng hạn thủ tục UNION(A,B,C) vă thủ tục INTERSECTION được viết như sau :

void SET_union (SET a,SET b,SET c) { int i; for (i=0;i<maxlength;i++) if ((a[i]==1)||(b[i]==1)) c[i]=1; else c[i]=0; }

void SET_intersection (SET a,SET b, SET c) { int i; for (i=0;i<maxlength;i++) if ((a[i]==1)&&(b[i]==1)) c[i]=1; else c[i]=0; }

Câc phĩp toân giao, hiệu,... được viết một câch tương tự. Việc kiểm tra một phần tử có thuộc tập hợp hay không, thủ tục thím một phần tử văo tập hợp, xóa một phần tử ra khỏi tập hợp cũng rất đơn giản vă xem như băi tập.

Một phần của tài liệu Lập trình C (Trang 105 - 107)