bao cao chuong trinh demo splay tree

11
BÁO CÁO Người thực hiện: 1. Lê Thu Hà 2. Phạm Thị Thanh Tân 3. Trương Thị Hồng Thúy I. Giải thuật s-playtree (xin tham khảo thêm trong báo cáo về splaytree của nhóm) II. Xây dựng chương trình 1. Dữ liệu đầu vào và mô tả cây Thông qua giải thuật về splaytree, và hướng xây dựng chương trình, nhóm xác định đầu vào và dữ liệu của giải thuật như sau: - Các nút được mô tả trên một lớp: - Dữ liệu (value, cost) của mỗi nút là một số nguyên - Mỗi nút gồm một con trỏ trái, phải và cha - Lớp (class) Node định nghĩa nút của cây như sau: Node Class Fields cost father left right type Properties Cost Father Left Right Type Methods Node (+ 2 overloads) Trong đó: 1

Upload: do-hoa

Post on 15-Feb-2015

23 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Bao Cao Chuong Trinh Demo Splay Tree

BÁO CÁONgười thực hiện:

1. Lê Thu Hà2. Phạm Thị Thanh Tân3. Trương Thị Hồng Thúy

I. Giải thuật s-playtree(xin tham khảo thêm trong báo cáo về splaytree của nhóm)

II. Xây dựng chương trình1. Dữ liệu đầu vào và mô tả cây

Thông qua giải thuật về splaytree, và hướng xây dựng chương trình, nhóm xác định đầu vào và dữ liệu của giải thuật như sau:- Các nút được mô tả trên một lớp:- Dữ liệu (value, cost) của mỗi nút là một số nguyên- Mỗi nút gồm một con trỏ trái, phải và cha- Lớp (class) Node định nghĩa nút của cây như sau:

NodeClass

Fields

cost

father

left

right

type

Properties

Cost

Father

Left

Right

Type

Methods

Node (+ 2 overloads)

Trong đó:*) Các trường dữ liệu (Fields), được sử dụng nội bộ trong lớp Node:- cost: chứa giá trị của nút, có giá trị nằm trong miền số nguyên (int16).- father: là con trỏ dùng để trỏ tới nút cha của một nút trong cây; father có kiểu là Node- left: là con trỏ để trỏ tới nút con trái của một nút trong cây; left có kiểu là Node

1

Page 2: Bao Cao Chuong Trinh Demo Splay Tree

- right: là con trỏ trỏ tới nút con phải của một nút trong cây; right có kiểm là Node*) Các thuộc tính (Properties), có kiểu trả về cùng kiểu lớp Node:- Cost: Dùng để đặt, lấy giá trị của trường cost.- Father: Dùng để đặt, lấy nút cha tương ứng với một nút trong cây. Với nút gốc, trường father là null.Left: Dùng để đặt, lấy nút con trái tương ứng với một nút trong cây. Nếu một nút không có con trái, trường left có giá trị null, thuộc tính trả về giá trị null.Right: Dùng để đặt, lấy nút con phải tương ứng với một nút trong cây, tương tự nút con trái.*) Phương thức của lớp:Gồm 2 constructor : Node(int cost) và Node(int cost, int type, Node father)Cây splay được mô tả trong quá trình xây dựng như sau:

2. Các modul chức năngModul chức năng thực hiện các thao tác của thuật toán được mô tả bằng sơ đồ sau:

2

null

link fatherlink father

null

link rightLink left

Root (tree)

Right

null nullnull

Xác định giá trị cho father là null tương ứng với nút gốc của cây

Left

Page 3: Bao Cao Chuong Trinh Demo Splay Tree

Trong đó, các trường root, tree, tree22 có kiểu Node được sử dụng để lưu trữ cây trong quá trình thao tác.Các phương thức sử dụng trong modul:a) Phương thức Tách cây

Giải thuật:- Tìm nút cần tách- Chuyển nút về gốc- Gán tree2 = nhánh phải của cây- Đặt giá trị của nút con phải của gốc là nullMã chương trình:

Node node = Find(root.Left, k);//Tim nut can tach Focus(node);//Chuyen ve gocNode tree2 = null;

tree2 = root.Left.Right; //tach tree2if (rab1.Checked == true){

root.Left.Right = null;}else{

root.Left = tree2;tree2.Father = root;tree2.Type = -1;

}

3

Page 4: Bao Cao Chuong Trinh Demo Splay Tree

b. Find (tìm kiếm)*) Giải thuật:B1- So sánh giá trị cần tìm với nút hiện hành (bắt đầu từ gốc)B2- Nếu giá trị trùng nhau, trả về nút hiện tại => B5B3- Nếu giá trị của nút < giá trị cần tìm,

B3.1 nếu nút con phải bằng null => B5B3.2 duyệt nút con phải, quay về B1

B4- Nếu giá trị của nút > giá trị cần tìm B4.1 nếu nút con trái bằng null => B5B4.2 duyệt nút con trái, quay về B1

B5- Kết thúcB5.1 Nếu tìm thấy, Quay nút đã tìm về gốcB5.2 Nếu không tìm thấy trả về giá trị null

*) Mã chương trình- Đầu vào của modul

- node: nút hiện hành của cây- value: giá trị cần tìm

- Đầu ra: nút tìm tương ứng hoặc null.

private Node Find(Node node, int value) { if (node.Cost == value) return node; else { if (node.Cost < value) { if (node.Right == null) return node; else return Find(node.Right, value); } else { if (node.Left == null) return node; else return Find(node.Left, value); } }

}

c. Delete (xóa)*) Giải thuật:*) Mã chương trình- Đầu vào: Cây splaytree, giá trị cần xóa (hoặc nút cần xóa)- Đầu ra: Cây splaytree đã xóa một nút

4

Page 5: Bao Cao Chuong Trinh Demo Splay Tree

private void BtnDelete_Click(object sender, EventArgs e) { int k = int.MaxValue; try { k = Convert.ToInt16(txtValue.Text); } catch { MessageBox.Show("Giá trị tìm kiếm không hợp lệ"); txtValue.Focus(); } if (k < int.MaxValue) { Node node = Find(root.Left, k); Focus(node); tree = root.Left; Node nodeLeft = new Node(); Node nodeRight = new Node();

if(tree.Left != null) nodeLeft = tree.Left; else nodeLeft = null; if (tree.Right != null) nodeRight = tree.Right; else nodeRight = null;

if (nodeLeft != null) { root.Left = nodeLeft; nodeLeft.Type = -1; nodeLeft.Father = root; Node kk = FindMax(nodeLeft); Focus(kk); nodeRight.Father = root.Left; root.Left.Right = nodeRight; nodeRight.Type = 1; } else { root.Left = nodeRight; nodeRight.Father = root; nodeRight.Type = -1; }

5

Page 6: Bao Cao Chuong Trinh Demo Splay Tree

}}d. Tách cây*) Giải thuật*) Mã chương trình- Đầu vào: Cây splaytree (tree)- Đầu ra: Cây splaytree (tree, tree2)

private void btnSplit_Click(object sender, EventArgs e) { int k = int.MaxValue; try { k = Convert.ToInt16(txtValue.Text); } catch { MessageBox.Show("Giá trị tìm kiếm không hợp lệ"); txtValue.Focus(); } if (k < int.MaxValue) { Node node = Find(root.Left, k);//Tim nut can tach Focus(node);//Chuyen ve goc Node tree2 = null; tree2 = root.Left.Right; //tach tree2

if (rab1.Checked == true) { root.Left.Right = null; } else { root.Left = tree2; tree2.Father = root; tree2.Type = -1; } }

}e. Xoay cây (Rotare splaytree)*) Giải thuật*) Mã chương trình- Đầu vào: Cây splaytree

6

Page 7: Bao Cao Chuong Trinh Demo Splay Tree

- Đầu ra: Cây splaytreeprivate void Focus(Node k) { while (k.Father != root) // Xoay đến khi k về gốc { if (k.Father == root.Left) MoveNode(k); // Zig else { if (k.Type == k.Father.Type) // Zig Zig { MoveNode(k.Father); MoveNode(k); } else //Zig-Zag { MoveNode(k); MoveNode(k); } } } }Trong đó, thủ tục MoveNode(node s) được sử dụng để chuyển một nút với nút cha của nó.- Đầu vào: nút cần xoay- Đầu ra: Cây ban đầu đã được xoay một cấp tại vị trí của nút hiện tại

private void MoveNode(Node s) { Node f = s.Father; // f là nút cha của s Node g = f.Father; // g là nút cha của f, ông của s if (s.Type == -1) // s là con trái { if (s.Right != null) { s.Right.Father = f; s.Right.Type = -1; f.Left = s.Right; } else f.Left = null;

if (f.Type == -1) {

7

Page 8: Bao Cao Chuong Trinh Demo Splay Tree

s.Type = -1; g.Left = s; } else { s.Type = 1; g.Right = s; }

s.Father = g; s.Right = f; f.Type = 1; f.Father = s; } else // s là con phải { if (s.Left != null) { s.Left.Father = f; s.Left.Type = 1; f.Right = s.Left; } else f.Right = null; ;

if (f.Type == -1) { s.Type = -1; g.Left = s; } else { s.Type = 1; g.Right = s; } s.Father = g; s.Left = f; f.Type = -1; f.Father = s; }

}

8

Page 9: Bao Cao Chuong Trinh Demo Splay Tree

3. Hạn chế và hướng khắc phụcVì còn các vấn đề chuyên môn và hạn chế về sử dụng ngôn ngữ nên trong

quá trình xây dựng chương trình nhóm của em vẫn còn nhiều thiếu sót và hạn chế, đặc biệt trong quá trình tối ưu mã chương trình và sử dụng bộ nhớ cũng như vận dụng bài toán vào thực tế.

9