CẤU TRÚC DỮ LIỆU+GIẢI THUẬT 2
Cấu trúc dữ liệu và giải thuật 2:
Một số ví dụ thuật toán:
Vd1: tính tổng của số tự nhiên từ 1-n:
Begin
Input n
I:=1
Sum:=0
While (i<=n) do
Sum:=sum +1;
I:=i+1;
End do
Vd2: tìm ước chung lớn nhất của 2 số
Cách 1:
Function ucln(a,b:integer) : integer
Vả
Begin
If (a:=0) or (b:=0) then
ucln := a+b
Else begin
While (a<>b) do
If a>b then
a:= a-b
else b:= b-a
end;
ucln1:= a;
end
cách 2: euclid
var x,y: integer
x:=a; y:=b;
while (y<>0) do
r:= xmody;
x:=y;
y:=r;
end;
ucln:=x
vd3:hàm kiểm tra n có là số nguyên tố ko?
Function check_NT (n: integer) : boolean
Var i;
flag:= boolean;
i:= integer;
i:=2; flag:= false;
while (i<= sqrt(n)) do
if nmodi =0 then
flag := true;
break;
end;
i:=i+1;
end;
check_NT:= flag;
end.
1)TÌM KIẾM
A) TÌM KIẾM TUẦN TỰ
Type mang=array[1..5] of integer
Function search_TT(var a : mang; n: integer; key: integer): boolean
Var i:integer; flag: boolean;
Begin
Flag:= false; i:=1;
While (i<= N and notflag) do
Begin
a[i] := key then flag := false;
i:=i+1;
end;
search_TT = flag;
end.
B) TÌM KIẾM NHỊ PHÂN
Type mang=array[1..5] of integer
Function search_NP( var a: mang; n:integer; key:integer): boolean;
Var low, high , mid : integer;
flag : boolean;
flag:=false;
low:=1; high:=n;
while (low<= high and notflag) do
mid:= (low + high) div 2;
if a[mid] := key then
flag := true
else if key < a[mid] then
high:= mid -1
else low :=mid;
end;
search_NP:= flag;
end.
BTVN: viết 1 thủ tục để in số nguyên tố từ 1-n:
Procedure indayso(n:integer)
Var i: integer;
Begin
For i:=1 to n do
If check_NT(i) = false then
Display(i)
End;
2) SẮP XẾP
A) SELECTION SORT
Procedure selectionsort(var a:mang; n: integer);
Var i,j: integer;
Min_index : integer;
Begin
For i:=1 to n -1 do
Begin
Min_index :=1 ;
For j:= i+1 to n do
If a[j] < a[Min_index] then
Min_index := j;
If Min_index <> I then
Hoanvi(a[i] , a[Min_index]);
B) BUBBLE SORT (SẮP XẾP NỔI BỌT)
* BOTTOM UP < DƯỚI – TRÊN>:
Procedure bubble_sort (var a: mang; n: integer)
Var i,j : integer ;
Begin
For i:=1 to n-1 do
For j:=1 to n-I do
If a[j] > a[j+1] then
Hoanvi(a[j],a[j+1]);
End;
------------------------------
C) ĐỆ QUY
1 SỐ VÍ DỤ:
Viết hàm tính n!
Function giaithua(n: integer) : integer;
Var
Begin if n=0 then
Giaithua:=1
Else giaithua := giaithua(n-1)*n;
BT1: tính USCLN của 2 số nguyên dương :
Funtion UCLN (a,b:integer) : integer;
Var
Begin
If a=0 or b:=0 then
UCLN := a+b;
Else begin
If a>b then
UCLN1:= UCLN1(a-b,a)
Else
UCLN1:= UCLN1(a,b-a)
End;
BT2: euclid
Function UCLN(a,b: integer): integer;
Var
Begin
If b=0 then
UCLN2:=a
Else
UCLN2:= UCLN2(b,amodb);
+ viết chương trình con in ra dãy số Fibonaci
C1: không dùng đệ quy
a:=0 ; b:=1; c:=0; n=5;
for i:=1 to n do
c:=a+b;
a:=b;
b:=c;
display (c)
end;
C2: đệ quy:
Function fb(n: integer): integer;
Begin
If (n=0 or n=1) then fb:=n;
Else
fb:= fb(n-1) + fb(n-2);
end;
for i:=1 to n do
display fb(i)
+tìm kiếm nhị phân:
Function search_BR(var a: mang; low,high:integer; n: integer; key: integer);
Var
Begin
if low>high then
Search_BR : = false;
Else begin
Mid:= (low+high) div2;
If a[mid] >= key then
search_BR:= true ;
else if a[mid] < key then
search_BR(a, mid+1, high,nn key)
-----------------------
D) QUICKSORT (SẮP XẾP NHANH)
Procedure quicksort(var a: mang; l,r: integer);
Var i,j,x: integer;
Begin j:=r;
i:=l;
x:= a[(l+r) div 2];
repeat
while a[i] < x do inc(i); //i:=i+1
while a[j] >x do dec(j); // j:=j+1
if (i<=j) then
hoanvi(a[i],a[j]);
inc(i);
dec(j);
end;
until i>j;
if l < j then quicksort(a,l,j);
if r > i then quicksort(a,i,r);
end;
---------------------
3) TẬP HỢP
CÀI DẶT TẬP HỢP TỪ DANH SÁCH (MẢNG)
Const maxsize – 100;
Type set= record;
count:integer;
element:array [1..maxsize] of elementtype
End;
- Khởi tạo tập rỗng:
Procedure initialize(var a:set );
Begin
a.count := 0;
end;
- Xác định phần tử có trong tập a?
Function member (x:elementtype; a:set) : boolean;
Var flag : boolean;
i: integer;
flag:= false;
i:=1;
while (i <= a.count) and (notflag) do
if x = a.element[i] then
flag := true
else
i:= i+1;
end;
member:= flag;
end;
- Chèn 1 phần tử từ tập x vào tập a
Procedure insert(x: elementtype; var a:set);
Var
Begin
If (a.count <= maxsize) and (notmember(x,a))
Then
Begin
a.count := a.count +1;
a.element[a.count] := x;
end
else write(‘the set is full’);
end.
- phép hợp
Procedure union(a,b: set ; var c: set);
Var i : integer;
Begin
For i:=1 to a.count do
insert(a. element[i], c );
for i:=1 to b.count do
if notmember(b.element[i],a) then
insert (b.element[i],c);
end;
- Phép toán giao:
Procedure intersection (a,b: set ; var c: set)
Var i: integer;
Begin
Initialize(c)
For i:=1 to b.count do
If member(b. element[i],a)
Then
insert( b. element[i],c)
end;
- Phép trừ:
Procedure diference(a,b: set, var c: set)
Var i: integer;
Begin
initialize(c);
for i:= 1 to a.count do
if notmember( a. element[i],b) then
insert(a. element[i],c)
end;
4) DANH SÁCH LIÊN KẾT
(1) DANH SÁCH LIÊN KẾT ĐƠN
A) CẤU TRÚC DỮ LIỆU
List = ^pointer;
pointer = record
data: elementtype;
next: list
end;
var head.list;
B) MỘT SỐ PHÉP TOÁN
Khởi tạo danh sách rỗng:
head:= nil;
+ Chèn một phần tử p vào sau phần tử được trỏ bởi con trỏ q:
Procedure InsertAfter(x: elementtype; q: list; var head: list);
Var p: list;
Begin
New(p) //cấp phát bộ nhớ
P^.next := x;
If head = nil then
Begin
p^.next:= nil;
head := p;
end;
else
p^.next := q^.next;
q^.next := p;
end;
+ Chèn phần tử p vào trước 1 phần tử được trỏ bởi q:
Procedure InsertBefore( x: elementtype; q: list; var head: list);
Var p: list;
Begin
New(p);
If ( q = head) then
Begin
p^.data := x;
p^.next := q;
head := p;
end
else begin
p^.next := q^.next;
q^.next := p;
p^.data := q^.data;
q^.data := x;
end;
+ xóa phần tử được trỏ bởi q:
Procedure Delete( q,r : list ; var head);
Begin if q = head then
head := q^.next;
else
r^.next := q^.next;
disponse(q);
end;
+ phép toán tìm kiếm:
Procedure Search (x: elementtype; head : list; var q: list; var found : boolean);
Begin
q:= head;
while (q <> nil) and (not found) do
if (q^.data = x) then
found := true
else q^ := q^.next;
end;
---
Procedure Search2 (x: elementtype; head : list; var q,r : list; var found : boolean);
Begin
a:= head;
found := false;
r:= nil;
while ( q <> nil ) and ( not found) do
if a^.data =x then
found := true
else begin r := q;
q := q^.next;
end;
end;
+ duyệt danh sách:
Procedure Traverse( head : list);
Var q: list;
Begin
q:= head;
while ( q <> nil) do
writeln(q^.data);
q := q^.next;
end;
VD:
BÀI 1: BIỂU DIỄN ĐA THỨC BỞI DANH SÁCH LIÊN KẾT ĐƠN
a0 + a1 x^1 + a2 x^2 + … + aN x^N
list = ^pointer;
pointer = record ;
heso: real;
luythua: integer;
next : list
end;
(2) DANH SÁCH LIÊN KẾT KÉP
A) CẤU TRÚC DỮ LIỆU
Note = ^pointer;
Pointer = record
Data : elementtype;
Pre,next : Note;
End;
List : record
First, last : Note;
End;
B) MỘT SỐ THAO TÁC
+ duyệt xuôi:
Procedure forwards(q: list)
Var p: Note;
Begin
p:= q.first;
while p<> nil do
writeln( p^.data);
p:= p^.next;
end;
end;
+ duyệt ngược:
Procedure backwards(q: list);
Var p: list;
Begin p:= q^.last;
While ( p <> nil) do
Begin
Writeln(p^.data);
p:= p^.pre;
end;
end;
+ chèn 1 phần tử mới vào sau phần tử được trỏ bởi con trỏ q
Procedure InsertAfter (x: elementtype; p: Note ; var DS: list)
var p: Note;
new(p);
p^.data := x;
p^.next = q^.next;
p^.pre =q;
if q^.next = nil then
DS.last := p;
Else
(q^.next)^.pre := p;
q^.next := p;
end;
+Chèn 1 phần tử mới vào trước phần tử được trỏ bởi q:
Procedure InsertBefore (x: elementtype; p: Note ; var DS: list)
var p: Note;
new (p); p^.data:= x;
p^.next := q;
p^.pre := q^.pre;
if p^.pre = nil then
DS.first := p
Else
(q^.pre)^.next := p;
q^.pre := p;
end;
+ chèn vào đầu danh sách:
Procedure InsertBeginning(x: elementtype; p: Note ; var DS: list)
var p: Note;
if DS.first = nil then
new(p);
p^.data := x;
p^.next := nil;
p^.pre:= nil;
DS.first := p;
DS.last := p;
End
Else InsertBefore (x,DS.first;DS);
End;
+ chèn 1 phần tử mới vào cuối danh sách:
Procedure InsertEnd(x: elementtype; p: Note ; var DS: list)
var p: Note;
if DS.last =nil then
InsertBeginning(x,DS)
Else
InsertAfter(x; DS.last, DS);
End;
+ xóa 1 phần tử được trỏ bởi con trỏ q
Procedure Delete(p: Note ; var DS: list)
if q^.next := nil then
DS.last := q^.pre;
End
Else q^.pre := nil then
Begin
DS.first := q^.next;
End
Else
Begin
q^.pre^.next := q^.next;
q^.next^.pre := q^.pre;
end;
disponse(q);
end;
(3) DANH SÁCH LIÊN KẾT VÒNG
A) CẤU TRÚC DỮ LIỆU
list = ^pointer;
pointer = record
data : elementtype ;
next : list;
end;
var basic: list;
B) BA THAO TÁC CƠ BẢN (CHÈN TRÁI, PHẢI, XÓA TRÁI)
+ chèn 1 phần tử vào bên trái danh sách
Procedure insertleft(x: elementtype, var basic : list)
Var p: list;
Begin
If basic := nil then
Begin
New(p);
P^.data := x;
P^.next := p;
basic := p^.next;
end
else begin
p^.next := basic;
basic^.next := p;
end;
+Chèn 1 phần tử vào bên phải danh sách
Procedure insertright(x: elementtype, var basic : list)
Var p: list;
Begin
If basic := nil then
Begin
New(p);
P^.data := x;
P^.next := p;
basic := p^.next;
end
else
basic^.next := p;
p^.next := basic;
end;
5) STACK
(1) CÀI ĐẶT STACK = CẤU TRÚC MẢNG
A) CẤU TRÚC DỮ LIỆU
Const max = n;
Type stack = record
Top : 0..max
Data : array[1..max] of elementtype;
End;
Var s: stack;
B) MỘT SỐ THAO TÁC
+ khởi tạo stack rỗng:
Procedure initialize(var s: stack);
Begin
Stop := 0;
End;
+ kiểm tra stack rỗng
Function isempty( s: stack): boolean;
Begin
isempty := (s.top =0 );
end.
+ kiểm tra stack đầy:
Funtion isfull( s: stack): boolean;
Begin
Isfull := (stop = max);
End.
+ thêm 1 phần tử vào đỉnh stack:
Procedure push(x: elementtype; var s: stack)
Begin
If not isnull(s) then
Begin
s.top : s.top + 1;
s.data[s.top]:= x
end;
end;
+lấy 1 phần tử ra khỏi stack:
Procedure pop(var x: elementtype; var s: stack)
Begin
If not isempty(s) then
Begin
x:= s.data[s.top];
s.top:= s.top -1;
end;
end;
(2) CÀI ĐẶT STACK BỞI DANH SÁCH LIÊN KẾT
A) CẤU TRÚC DỮ LIỆU
Type stack = ^pointer;
Pointer = record
Data: elementtype;
Next : list;
End;
Var s : stack;
B) MỘT SỐ THAO TÁC
+ khởi tạo stack rỗng:
Procedure initialize(var s: stack);
Begin
s:= nil;
end;
+kiểm tra stack rỗng:
Function isempty( var s: stack): boolean;
Begin
isempty:= (s = nill);
end;
+ thêm 1 phần tử vào đỉnh stack
Procedure push(x: elementtype; var s:stack)
Var p: stack;
new(p);
p^.data:= x;
p^.next := s;
s:=p;
end;
+lấy 1 phần tử ra khỏi danh sách
Procedure pop(x: elementtype; var s:stack)
Var p: stack;
if not isempty (s) then
p:=s;
x:= p^.data;
s:= s^.next;
dispose(p);
end;
(3) BÀI TẬP ÁP DỤNG
A) DÙNG STACK ĐỂ CHUYỂN ĐỔI 1 SỐ HỆ THẬP PHÂN SANG HỆ NHỊ PHÂN
Procedure nhiphan( n: integer);
Begin
While (n <> 0) do
Begin
Push(nmod2,s);
n:= ndiv2;
end
while (not isempty(s)) do
pop(x,s);
write(x);
end
end;
C) CHUYỂN ĐỔI BIỂU THỨC TRUNG TỐ THÀNH HẬU TỐ( INFIX --> POSTFIX)
#: kết thúc biểu thức
top: phần tử đỉnh stack
pri(x): độ ưu tiên của x
procedure convert(E: infix; var E1: postfix);
read(E,x);
while x<>’#’ do
if x là toán hạng then E1 = E1 + x;
if x= ‘(‘ then push(x,s);
if x=’)’ then
while (top <> ‘(‘ ) do
pop(y,s);
E1:= E1 +y;
End;
End;
If x là toán tử then begin
While (pri(top) >= pri(x)) do
Begin
Pop(y,s);
E1 := E1 +y ;
Pop(y,s); // xóa ‘(‘
End;
Push (x, s);
End;
Read(E,x);
6) HÀNG ĐỢI (QUEUE) (FIFO)
1) Cài đặt queue bằng mảng
a)CTDL
const max=N
type queue =record
first, list : 0.. max;
data: array[0..max] of elementtype;
end;
var Q: queue;
b) một số thao tác
+thêm
procedure Addqueue( x: elementtype; var Q: queue)
if not isfull(Q) then
Q.last:= Q.last +1;
Q.data[Q.last]:= x;
End;
+xóa
Procedure DeleteQueue( var x: elementtype; var Q: queue)
if not isempty(Q) then
x := Q.data[Q.first];
if Q.first = Q.last then
Q.first := 1;
Q.last := 0;
End
Else Q.first := Q.first +1;
End;
End;
2) cài đặt queue bởi danh sách liên kết
a) cấu trúc dữ liệu
List : ^pointer
Pointer = record
data : elementtype;
next: list;
end;
queue =record
first, list : list;
end;
b) thao tác
+ khởi tạo
Procedure initialize (var Q: queue);
Begin
Q.first =nil;
End;
+ thêm 1 phần tử vào cuối hàng
Procedure addqueue(x: elementtype;var Q: queue)
Var p: list;
Begin
New(p);
p^.data := x;
p^.next := nil;
if isempty(Q) then
Q.first :=p;
Q.list :=p;
End
Else
Begin
Q.list^.next := p;
Q.list := p;
End;
+ lấy 1 phần tử từ đầu queue
Procedure deletequeue (var x: elementtype;var Q: queue)
Var p: list;
if not isempty(Q) then
p:= Q.first;
x:= p^.data;
Q.first := Q.first^.next;
Disponse(Q);
End;
Bạn đang đọc truyện trên: AzTruyen.Top