Một số bài toán quan trọng

Một phần của tài liệu nghiên cứu phụ thuộc mạnh trong cơ sở dữ liệu (Trang 52 - 72)

Trong [15] J.Demetrovics và Vũ Đức Thi đã liệt kê bốn bài toán sau, những bài toán này đóng vai trò quan trọng trong quá trình nghiên cứu cấu trúc và lôgic của họ phụ thuộc mạnh.

Bài toán 2.9.14. (Xây dựng quan hệ Armstrong) Cho trước sơ đồ mạnh G=(U,S)xây dựng quan hệ R trên U sao cho SR= S+.

Bài toán 2.9.15. (Bài toán suy diễn phụ thuộc) Cho trước quan hệ R trên U xây dựng sơ đồ mạnh G=(U,S) sao cho S+

=SR.

Bài toán 2.9.16 (Bài toán kéo theo phụ thuộc mạnh-quan hệ) Cho trước sơ đồ mạnh G=(U,S)và quan hệ R trên U, xác định xem SR S+.

Bài toán 2.9.17(Bài toán tương đương phụ thuộc mạnh-quan hệ) Cho trước sơ đồ mạnh G= (U,S) và quan hệ R trên Uxác định xem SR =S+

Tính đa thức của các bài toán trên đã được khẳng định trong [15]. Tuy nhiên ở đây, chúng ta cung cấp một chứng minh khác trên cơ sở sử dụng các Vậy sơ đồ mạnh cần tìm là G=(U,S)

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

kết quả đã được chỉ ra ở trên. Trong đó độ phức tạp của các bài toán này cũng được chứng minh là đa thức.

Mệnh đề sau là rõ ràng từ mệnh đề 2.9.11

Mệnh đề 2.9.18. Bài toán 2.9.14 được giải quyết trong thời gian đa thức theo kích thước của G.

Từ thuật toán 2.9.12, mệnh đề sau là rõ ràng.

Mệnh đề 2.9.19. Bài toán 2.9.15được giải quyết trong thời gian đa thức theo kích thước của R.

Mệnh đề 2.9.20. Bài toán 2.9.16 được giải quyết trong thời gian đa thức theo kích thước của R và G.

Chứng minh: Gọi G=(U,S) là một sơ đồ mạnh và Rlà một quan hệ trên U. Từ quan hệ R, ta xây dựng sơ đồ mạnh G1=(U,S1) sao cho = SR theo thuật toán 2.9.12. Biết rằng thời gian xây dựng G1là đa thức theo kích thước R.

Theo cách xây dựng trên, rõ ràng SR S+ khi và chỉ khi =S+.

Do đó, việc kiểm tra SR S+tương đương với kiểm tra =S+. Tuy nhiên, việc kiểm tra =S+

là thời gian đa thức theo kích thước R và G.

Suy ra Bài toán 2.9.16 được giải quyết trong thời gian đa thức theo kích thước của R và G.

Mệnh đề được chứng minh. □

Bởi Hệ quả 2.9.6, mệnh đề sau là rõ ràng.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

kích thước của R và G.

2.10 Kết luận

Chương này đã thu được một số kết quả sau. Chứng minh, một số tính chất của bao đóng của tập thuộc tính. Tìm hiểu một thuật toán đa thức tìm bao đóng của tập thuộc tính trên quan hệ.

Kết quả quan trọng trong chương này là phát biểu và chứng minh một điều kiện cần và đủ để một quan hệ bất kỳ là quan hệ Armstrong của một sơ đồ mạnh. Trên cơ sở định lý này, đưa ra thuật toán đa thức xây dựng một quan hệ Armstrong của một sơ đồ mạnh cho trước, và thuật toán đa. thức xây dựng sơ đồ mạnh của một quan hệ cho trước sao cho quan hệ này là quan hệ Armstrong của sơ đồ mạnh.

Cuối cùng, chứng minh bốn bài toán quan trọng đối với việc nghiên cứu cấu trúc và lôgic của họ phụ thuộc mạnh: bài toán xây dựng quan hệ Armstrong của một sơ đồ mạnh cho trước, bài toán xây dựng sơ đồ mạnh đúng trên một quan hệcho trước, bài toán kéo theo phụ thuộc mạnh-quan hệ và bài toán tương đương phụ thuộc mạnh-quan hệ, để có thể giải quyết bằng các thuật toán thời gian đa thức.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Chƣơng 3: CÀI ĐẶT MỘT SỐ THUẬT TOÁN VỀ PHỤ THUỘC MẠNH TRONG CƠ SỞ DỮ LIỆU

Trong phần này tác giả sẽ xây dựng chương trình trên chạy trên Window mô phỏng lại một số thuật toán về phụ thuộc mạnh.

3.1Lựa chọn bài toán để cài đặt (adsbygoogle = window.adsbygoogle || []).push({});

Bài toán 1(Xây dựng quan hệ Armstrong) Cho trước sơ đồ mạnh G=(U,S) xây dựng quan hệ R trên U sao cho SR= S+.

Bài toán 2 (Bài toán suy diễn phụ thuộc) Cho trước quan hệ R trên U xây dựng sơ đồ mạnh G=(U,S) sao cho S+=SR.

Đây là hai bài toán trong tổng số bốn quan trọng trong quá trình nghiên cứu cấu trúc và lôgic của họ phụ thuộc mạnh.

Với bài toán 1 – xây dựng quan hệ Armstrong. Đầu vào là một sơ đồ mạnh G = (U, S) với U là tập các thuộc tính, S là tập các phụ thuộc mạnh. Đầu ra là xây dựng quan hệ R sao cho SR= S+(là một quan hệ Armstrong của G).

Với bài toán 2 - bài toán suy diễn phụ thuộc. Đầu vào là một quan hệ R trên tập U. Đầu ra là xây dựng một sơ đồ mạnh G = (U, S) sao cho S+ = SR. Vậy đây là 2 bài toán ngược nhau.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

3.2 Thuật toán sử dụng trong chƣơng trình Thuật toán 1(Tìm tập phản khoá)

Vào: hệ Sperner K = {B1,…,Bm} trên U. Ra: K-1.

Phương pháp:

Bước 1. Đặt K1 = {U-{a} |a B1}.Rõ ràng K1= {B1}-1.

Buớc q+1 (q < m). Giả sử Kq =Fq {X1,,,, Xtq} với X1,... , Xtq chứa Bq+1 và Fq={A Kq|Bq+1 A}. Với mọi i (i = 1,2,...,tq), xây dựng các phản khoá của {Bq+1} trên Xi tương tự như K1. Ký hiệu chúng là ,…, (i=1, 2…tq )

Đặt : Kq+1 = Fq { | A Fq A, 1 ≤ i ≤ tq , 1 ≤ p ≤ ri} Cuối cùng đặt K-1

= Km

Thuật toán 2 (Tính tập bao đóng {a}+

)

Vào: sơ đồ mạnh G = (U,S) với S ={Ai i| i=1,2,... , m} và a U. Ra: bao đóng {a}+

, Phương pháp: tính {a}+

bằng quy nạp. Buớc1: Đặt X0

= {a}.

Bước i+1: Nếu có một phụ thuộc mạnh Aj Bj S sao cho Aj X(i) và Bj (i) thì ta tính

X(i+1) = X(i) ( j)

Trong trường hợp ngược lại, ta đặt {a}+

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Rõ ràng tồn tại một số nguyên nhỏ nhất kđể

{a} = X(0) X(1) … X(k) X(k+1)… Khi đó đặt : {a}+

= X(k)

Thuật toán 3(Tìm họ các tập tối tiểu)

Vào: sơ đồ mạnh G=(U,S) và a U(U = {ai, … , an }). Ra:Ka họ các tập tối tiểu của a.

Phương pháp:

Buớc 1. Đặt Ka = ; (adsbygoogle = window.adsbygoogle || []).push({});

Bước i+l. (i = 1,2,... , n) Tính

Thuật toán 4 (Xây dựng quan hệ Armstrong của sơ đồ mạnh) Vào: sơ đồ mạnh G = (U,S).

Ra: Quan hệ R sao cho SR = S+ Phương pháp:

Bước 1: Tính họ các tập tối tiểu Kavới mỗi thuộc tính a Utheothuật toán 2 Bước 2: Với mỗi họ Ka, tính tập phản khoá theothuật toán 1

Buớc 3. Đặt

Bước 4: Ký hiệu các phần tử của Max(S+

) là A1,…, AtXây dựng quan hệ R= {h0,h1,…, hi} như sau:

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

với mỗi a U,h0(a) = 0, i = 1,2,...,t

Thuật toán 5 (Xây dựng sơ đồ mạnh G = (U, S) của quan hệ R trên U cho trước sao cho R là quan hệ Armstrong của G)

Vào: quanhệ R={h1,.., hm} trên U. Ra: sơ đồ mạnh G=(U,S) sao cho S+

=SR. Phương pháp:

Bước 1: Tính hệ bằng nhau SR.

Bước 2: Với mỗi thuộc tính a U tính bao đóng theo thuật toán 2.7.2:

Bước 3: Xây dựng sơ đồ mạnh G=(U,S) với S = {{a} a U}.

3.3 Cài đặt chƣơng trình 3.3.1 Yêu cầu hệ thống

Chương trình được viết trên nền Window, tương tích các phiên bản. Ngôn ngữ thể hiện là C# trên bộ Visualt Studio 2013, sử dụng .Net Framework 4.0 trở nên.

Mã nguồn đã được biên dịch thành file thực thi .exe, chỉ cần cài đặt các bộ thư viện đã yêu cầu ở trên có thể chạy được chương trình.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

3.3.2 Cấu trúc của chƣơng trình

C# là một ngôn ngữ lập trình hệ thống mạnh, ổn định. Đặc biệt C# hỗ trợ các Collection được sử dụng để xử lý các dạng dữ liệu kiểu mảng đối tượng và có cấu trúc luôn thay đổi. Các Collection này được sử dụng để lưu trữ và xử lý các tập mục và các giao dịch trong thuật toán.

Chƣơng trình thiết kế bao gồm các lớp sau:

- Lớp ArmstrongRelation: Thực hiện một số công việc sau (Lưu trữ và khởi tạo các tập các thuộc tính; tìm họ các tập tối tiểu Ka; Tìm các tập phản khóa; Tìm tập MAX; in kết quả

- Lớp EqualSystem: Thực hiện một số công việc sau ( xử lý các hệ bằng nhau, sau đó đưa ra kết quả).

3.4Một số đoạnmã lệnh sử dụng trong chƣơng trình 3.4.1 Phần mô tả mã lệnh của bài toán 1

namespace StrongDependency {

public class ArmstrongRelation {

// Tập các thuộc tính public List<string> universal;

// Tập các thuộc tính vế trái trong suy diễn public Dictionary<int, List<string>> leftRe; // Tập các thuộc tính vế phải trong suy diễn public Dictionary<int, List<string>> rightRe; // Khởi tạo giá trị leftRe, rightRe

public void Initial(List<string> universal, Dictionary<int, List<string>> leftRe, Dictionary<int, List<string>> rightRe) (adsbygoogle = window.adsbygoogle || []).push({});

{ this.universal = universal; this.leftRe = leftRe; this.rightRe = rightRe; } // Tìm họ các tập tối thiểu Ka

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

public Dictionary<string,List<string>> FindMinimumSet() {

Dictionary<string, List<string>> result = new Dictionary<string, List<string>>(); Dictionary<string, List<string>> closure = new Dictionary<string, List<string>>(); foreach (string item in universal)

{

closure.Add(item,FindClosure(item)); }

foreach (string attr in universal) {

List<string> tmp = new List<string>(); foreach (string attrTmp in universal)

{ if (closure[attrTmp].Contains(attr)) { tmp.Add(attrTmp); } } result.Add(attr, tmp); } return result; } // Tìm các tập phản khóa K^-1

public Dictionary<string, List<string>> FindAntiKey(Dictionary<string,List<string>> input)

{

Dictionary<string, List<string>> result = new Dictionary<string, List<string>>(); foreach (KeyValuePair<string, List<string>> item in input)

{ result.Add(item.Key,universal.Except(item.Value).ToList()); } return result; } // Tìm tập MAX+

public List<List<string>> FindMAX(Dictionary<string, List<string>> input) {

List<List<string>> result = new List<List<string>>(); List<string> tmp=new List<string>();

CustomerComparer compare = new CustomerComparer(); foreach (KeyValuePair<string, List<string>> item in input) {

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

if (!result.Contains(item.Value,compare) && item.Value.Count>0) { result.Add(item.Value); } } return result; } // In kết quả

public StringBuilder PrintRelation(List<List<string>> input) {

StringBuilder result = new StringBuilder(); foreach (string item in universal)

{

result.Append(item + " "); }

result.Append(Environment.NewLine); foreach (string item in universal) {

result.Append(0 + " "); }

result.Append(Environment.NewLine); int count = 0;

foreach (List<string> item in input) {

count++;

for (int i = 0; i < universal.Count; i++) { if (item.Contains(universal[i])) { result.Append(0 + " "); } else { result.Append(count + " "); } } result.Append(Environment.NewLine); } return result; } // Tìm {attr}+

public List<string> FindClosure(string attr) {

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ (adsbygoogle = window.adsbygoogle || []).push({});

List<string> result = new List<string>(); // Đưa vào giá trị đầu là chính thuộc tính đó result.Add(attr);

int count = 0; while (count == 0) {

int check = 0;

foreach (KeyValuePair<int, List<string>> pair in leftRe) { if (pair.Value.Intersect(result).Any()) { if (rightRe[pair.Key].Except(result).Any()) { check++; result = (result.Union(rightRe[pair.Key])).ToList(); } } } if (check == 0) { count = 1; } } return result; } }

3.4.1 Phần mô tả mã lệnh của bài toán 2

namespace StrongDependency {

public class EqualSystem {

private int numOfRow; private int numOfColumn; private double[,] database;

private Dictionary<int, string> dict; private List<List<int>> system;

private Dictionary<int, List<int>> closure;

public EqualSystem(List<List<double>> database, List<string> attrs) {

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

this.numOfRow = database.Count; this.numOfColumn = database[0].Count;

this.database = new double[numOfRow,numOfColumn]; for (int i = 0; i < this.numOfRow; i++)

{

for (int j = 0; j < this.numOfColumn; j++) {

this.database[i, j] = database[i][j]; }

}

dict = new Dictionary<int, string>(); for (int i = 0; i < attrs.Count; i++) {

dict.Add(i, attrs[i]); }

}

public List<List<int>> CalcEqualSystem() {

List<string> dist = new List<string>(); this.system = new List<List<int>>(); List<int> partition;

string tmp;

for (int i = 0; i < this.numOfRow - 1; i++) {

for (int j = i + 1; j <= this.numOfRow - 1; j++) {

partition = new List<int>(); tmp = String.Empty;

for (int k = 0; k < numOfColumn; k++) {

if (this.database[i,k]==this.database[j,k]) {

// Thêm chỉ số cột, tham chiếu đến tên thuộc tính partition.Add(k); (adsbygoogle = window.adsbygoogle || []).push({});

tmp += k; } }

// Kiem tra da ton tai trong day ket qua if (!dist.Contains(tmp)&&!tmp.Equals(""))

{ dist.Add(tmp);

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ this.system.Add(partition); } } } return system; }

public StringBuilder PrintEqualSystem() {

StringBuilder builder = new StringBuilder(); builder.Append(" Hệ bằng nhau Er = {");

foreach (List<int> item in this.system) {

builder.Append("{");// + item + "},"); foreach (int child in item)

{ builder.Append(this.dict[child] + ","); } if (builder.Length > 1) { builder.Remove(builder.Length - 1, 1); } builder.Append("},"); } if (builder.Length > 1) { builder.Remove(builder.Length - 1, 1); } builder.Append("}" + Environment.NewLine); return builder; }

public Dictionary<int, List<int>> CalcClosure() {

closure = new Dictionary<int, List<int>>(); // Duyệt toàn bộ các thuộc tính

List<int> universal = new List<int>(); for (int i = 0; i < this.numOfColumn; i++) {

universal.Add(i); }

List<int> tmp;

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

{

tmp = universal.ToList();

foreach (List<int> item in this.system) { if (item.Contains(i)) { tmp = tmp.Intersect(item).ToList(); } } closure.Add(i, tmp); } return closure; }

public StringBuilder PrintScheme() {

StringBuilder builder = new StringBuilder();

builder.Append(" Sơ đồ mạnh cần tìm G = (U,S)" + Environment.NewLine + " Với S = {");

foreach (KeyValuePair<int,List<int>> item in this.closure) {

builder.Append("{"+this.dict[item.Key]+"} -> {"); foreach (int child in item.Value)

{ builder.Append(this.dict[child] + ","); } if (builder.Length > 1) { builder.Remove(builder.Length - 1, 1); } builder.Append("},"); } if (builder.Length > 1) { builder.Remove(builder.Length - 1, 1); }

builder.Append("}" + Environment.NewLine + Environment.NewLine); return builder;

} }

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

3.5 Chƣơng trình minh họa cho bài toán Bài toán 1

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

3.6 Hƣớng dẫn và sử dụng chƣơng trình (adsbygoogle = window.adsbygoogle || []).push({});

Việc nhập dữ liệu cho chương trình là thông qua file văn bản trong mục

chọn tệp.

Dữ liệu đầu vào bài toán 1: là 1 file Text có cấu trúc bao gồm các dòng a b c d : đây là dòng các thuộc tính

a,b c : đây là các phụ thuộc mạnh (vế trái và vế phải cách nhau 1 space)

b a,d : giữa các thuộc tính cách nhau dấu (,) d b

Dữ liệu đầu vào bài toán 2: là 1 file Text có cấu trúc bao gồm các dòng a b c d : đây là dòng các thuộc tính

0 0 0 0 : Các quan hệ R trên tập U = {a,b,c,d} 0 1 0 1

2 2 0 2

Sau khi các dữ liệu đầu vào được nhập, phần bên của chương trình hiển thị dạng của bài toán và cho ra kết quả phần dưới.

3.7 Đánh giá kết quả thực nghiệm

Hai bài toán trên được giải quyết trong thời gian đa thức, theo kích thước của R. Tính đa thức của bài toán đã được khẳng định ở [15]. Trong đó độ phức tạp của các bài toán này cũng được là đa thức.

Chương trình đã giải quyết được khi cho một quan hệ R bất kỳ là quan hệ Armstrong của một sơ đồ mạnh G = (U,S) cho trước tính toán ra được SR= S+. Ngược lại, thuật toán đa thức xây dựng sơ đồ mạnh G của quan hệ R cho trước sao cho SR= S+cũng được giải quyết.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

KẾT LUẬN

Dựa trên cơ sở các kết quả nghiên cứu, quá trình thiết kế các hệ CSDL theo các ràng buộc dữ liệu này được rõ ràng, sáng tỏ và đơn giản, các kết quả nghiên cứu làm cho việc thiết kế trở lên có giá trị.

Những kết quả đạt được trong luận văn Đối với phụ thuộc hàm

Nhắc lại một số kiến thức cơ bản về hệ tiên đề Armstrong, bao đóng của tập phụ thuộc hàm và tập thuộc tính, khóa tối tiểu của sơ đồ quan hệ và các dạng chuẩn cũng như các dạng tương đương của họ phụ thuộc hàm. Phát hiện một số tính chất tương quan giữa tập phản khóa, tập các khóa tối tiểu. Trong một vài trường hợp độ phức tạp của tập phản khóa là đa thức. Cuối cùng nghiên cứu tính chất của hệ sperner, xây dựng hai quan hệ trên hệ sperner, từ đó đưa ra các điều kiện cần và đủ để một hệ sperner bất kỳ khi nào là bão hòa, được nhúng và bao hàm. Xác định mối quan hệ giữa các hệ sperner đặc biệt này.

Đối với phụ thuộc mạnh

Chứng minh một số tính chất của bao đóng của tập thuộc tính. Tìm hiểu một thuật toán đa thức xác định bao đóng của tập thuộc tính trên quan hệ.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

là khái niệm đóng vai trò quan trọng trong việc xây dựng quan hệ Armstrong của sơ đồ mạnh. Tìm hiểu các tính chất và thuật toán đa thức xây dựng họ Ka.

Phát biểu và chứng minh một điều kiện cần và đủ để một quan hệ R bất kỳ là quan hệ Armstrong của một sơ đồ mạnh G = (U,S) cho trước, nghĩa là SR= S+Trên cơ sở định lý này, đưa ra thuật toán đa thức xây dựng một quan hệ Armstrong R của sơ đồ mạnh G cho trước. Ngược lại, thuật toán đa thức xây dựng sơ đồ mạnh G của quan hệ R cho trước sao cho SR= S+

Một vài vấn đề nghiên cứu tiếp.

Trên cơ sở của một số khái niệm và kết quả đã có, một vài hướng nghiên cứu tiếp có thể được đề xuất như sau:

Nghiên cứu độ phức tạp của bài toán tương đương phụ thuộc hàm - quan hệ. Đây là môt bài toán mờ, cho đến nay độ phức tạp của nó vẫn chưa xác định được.

Tiếp tục nghiên cứu thêm một số đặc trưng mới của các dạng chuẩn (2NF, 3NP và BCNP) để làm sáng tỏ thêm bản chất toán học của chúng.

Xác định thêm một số tính chất mới của các hệ Sperner đặc biệt. Nghiên cứu vấn đề chuẩn hoá đối với phụ thuộc mạnh.

Xây dựng thuật toán tìm quan hệ Armstrong cực tiểu trong trường hợp khi quan hệ Armstrong cho một tập các phụ thuộc mạnh là tồn tại. Đánh giá độ phức tạp thời gian cho thuật toán đó.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

TÀI LIỆU THAM KHẢO (adsbygoogle = window.adsbygoogle || []).push({});

Tiếng Việt

[1]. Nguyễn Kim Anh (1993), Các phụ thuộc logic trong mô hình dữ liệu quan hệ, Luận án tiến sĩ khoa học Toán lý, Trường Đại học Bách khoa Hà Nội, Hà Nội.

[2]. Nguyễn Xuân Huy, Lê Hoài Bắc (2003), Bài tập cơ sở dữ liệu, Nhà xuất bản Thống kê, Hà Nội.

[3]. Nguyễn Hoàng Sơn, Nguyễn Việt Hùng (2002), “Một số kết quả về khoá trong cơ sơ dữ liệu quan hệ”, Tạp chí Tin học và Điều khiển học18 (3), tr. 285-289.

Tiếng Anh

[4]. Armstrong W. W (1974),“Dependency structure of database relationship”,

Information Processing 74, Nortk-Holland Pub. Co.,pp. 580-583.

[5]. Beeri C., Dowd M., Fagin R., Staman R.(1984), “On the structure of Armstrong relations for functional dependencies”, J. ACM, 31(1), pp. 30-46.

[6]. Codd E.F.(1970), “A relational model for large shared data banks”,

Communications ACM 13,pp. 377-387.

[7]. Czédli G. (1980), “Dependendes in the relational model of data”,

Alkalmaz Mat Lapok 6, pp. 131-143.

[8]. Czédli G.(1981), “On dependencies in the relational model of data”EIK 17, pp. 103-112.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Một phần của tài liệu nghiên cứu phụ thuộc mạnh trong cơ sở dữ liệu (Trang 52 - 72)