Phương pháp Heuristic
ề
ẫ
y Trong nhi
ề
u
b
ài toán dùng
p
hương
p
háp th
ử
-saisẽ d
ẫ
n
đếnsố lượng thử quá lớn không chấpnhận được.
ề
ẫ
ế
y Heuristic chính là ướclượng v
ề
khả năng d
ẫ
n đ
ế
nlờigiải
củamộttrạng thái: phương pháp vét cạnnhưng có thêm tri
hứ
đi
kè
ối
bộ
ê
lý
h ớ
đíh
ê
t
hứ
c
đi
kè
m, t
ối
ưucục
bộ
, nguy
ê
n
lý
h
ư
ớ
ng
đí
c
h
, nguy
ê
n
lý sắpthứ tự,
í
d
y v
í
d
ụ:
Mộtembébị lạc đường về nhà, em nhớ nhà mình cao nhất
trong
khu
vực
em
sẽ
tìm
đến
tòa
nhà
cao
nhất
trong
vùng
em
trong
khu
vực
,
em
sẽ
tìm
đến
tòa
nhà
cao
nhất
trong
vùng
em
thấy, rồilạitiếptục ,
Giải
phương
trình
bậc
2
,
đoán
nghiệm
theo
Vi
-
ét
Giải
phương
trình
bậc
2
,
đoán
nghiệm
theo
Vi
ét
kiế
h
hiề
hiề
Tìm
kiế
mt
h
eo c
hiề
u sâu và c
hiề
u
rộng
rộng
y
Là
thử
sai
theo
nguyên
lý
mê
cung
hay
chính
là
thử
y
Là
thử
-
sai
theo
nguyên
lý
mê
cung
hay
chính
là
thử
-
sai kếthợplầnngược.
y
Ngược
với
tìm
kiếm
theo
chiều
sâu
tìm
kiếm
theo
chiều
y
Ngược
với
tìm
kiếm
theo
chiều
sâu
,
tìm
kiếm
theo
chiều
rộng mang hình ảnh củavếtdầu loang.
Giảithu
ậ
t
A
*
ậ
Phươn
g
p
há
p
trí tu
ệ
nhân t
ạ
o
g
pp
ệ
ạ
y
"
Dạy
"
máy
tính
để
có
"
trí
thông
minh
"
như
con
người
y
Dạy
máy
tính
để
có
trí
thông
minh
như
con
người
bắtchướckhả năng "suy luận" của con người.
ví
dụ
:
bài
toán
đong
nước
có
3
bình
A
B
và
C
có
dung
ví
dụ
:
bài
toán
đong
nước
,
có
3
bình
A
,
B
,
và
C
có
dung
tích 5, 8, và 13 lít. Làm sao đong được 11 lít nướctrong
bình
C?
Bình
C
ban
đầu
đầy
nước
bình
C?
Bình
C
ban
đầu
đầy
nước
.
Mộtsố phương pháp chuyểngiao
tri thức
1. Biểudiễntri thức
2
Hệ
hê
i
2
.
Hệ
c
h
uy
ê
ng
i
a
3. Máy học
MM
ảả
ng ng
ArrayArray
MM
ảả
ng ng
ArrayArray
Phạm Thế Bảo
Trường
Đạihọc Khoa họcTự nhiên Tp HCM
Trường
Đại
học
Khoa
học
Tự
nhiên
Tp
.
HCM
MảMả
AA
Mả
ng
Mả
ng
––
A
rray
A
rray
MộtMộtsốsố tínhtính chấtchất
Kh iKh i
bábá
ảả
tt
CC
Kh
a
iKh
a
i
bá
o
bá
om
ả
ngm
ả
ng
t
rong
t
rong
CC
TruyTruy xuấtxuất cáccác thànhthành phầnphần
TruyềnTruyền thamtham sốsố kiểukiểumảngmảng chocho hàmhàm
MộtMột
ốố
thth
tátá
ởở
MộtMột
s
ố
s
ố
th
ao
th
ao
tá
c
tá
ccơcơ s
ở
s
ở
MảngMảng nhiềunhiềuchiềuchiều
MảMả
Mộ ố íh hấMộ ố íh hấ
Mả
ng
Mả
ng
––
Mộ
t s
ố
t
í
n
h
c
hấ
t
Mộ
t s
ố
t
í
n
h
c
hấ
t
ểể
ấấ
MảngMảng làlà mộtmộtki
ể
uki
ể
ud
ữ
d
ữ
liệuliệucócó c
ấ
uc
ấ
utrúctrúc dodo ngườingườilậplập
trìnhtrình địnhđịnh nghĩanghĩa
DùDù
biểbiể
diễdiễ
áá
đốiđối
tt
dữdữ
liệliệ
ởở
dd
ộtột
Dù
ng
Dù
ng
biể
u
biể
u
diễ
n
diễ
nc
á
cc
á
c
đốiđối
t
ượng
t
ượng
dữdữ
liệ
u
liệ
u
ởở
d
ạng
d
ạng m
ột
m
ột
dãydãy cáccác thànhthành phầnphầncócó cùngcùng kiểukiểuvớivới nhaunhau ––kiểukiểucơcơ
sởsở
sởsở
NNLTNNLT CC luônluôn chỉchỉđịnhđịnh mộtmộtkhốikhốinhớnhớ liênliên tụctụcchocho
m
ộ
tm
ộ
tbi
ế
nbi
ế
nki
ể
uki
ể
umản
g
mản
g
ộộ
gg
KíchKích thướcthướccủacủamảngmảng đượcđượcxácxác địnhđịnh ngayngay khikhi khaikhai
báobáo vàvà khôn
g
khôn
g
baobao
g
iờ
g
iờ tha
y
tha
y
đ
ổ
iđ
ổ
i
gg
gg
yy
MảMả
Kh i bá CKh i bá C
Mả
ng
Mả
ng
––
Kh
a
i
bá
o trong
CKh
a
i
bá
o trong
C
tdftdf
kiể ơ ởkiể ơ ở
Tê kiểTê kiể
[[
Sốthà h hầSốthà h hầ
]]
t
ype
d
e
ft
ype
d
e
f
kiể
uc
ơ
s
ởkiể
uc
ơ
s
ở
Tê
n
kiể
u
Tê
n
kiể
u
[[
Sốthà
n
h
p
hầ
n
Sốthà
n
h
p
hầ
n
]]
;;
kiểucủamỗi thành phầnkiểucủamỗi thành phần
hằ ố ố thà h hầhằ ố ố thà h hầ
kiểu
của
mỗi
thành
phầnkiểu
của
mỗi
thành
phần
hằ
ng s
ố
, s
ố
thà
n
h
p
hầ
n
hằ
ng s
ố
, s
ố
thà
n
h
p
hầ
n
tối đa của mảngtối đa của mảng
do lập trình viên đặt têndo lập trình viên đặt tên
typedeftypedef intint
A
INT[
A
INT[100100];];
////AINTAINT là kiểu mảng biểu diễn dãy gồm 100 thành phần intlà kiểu mảng biểu diễn dãy gồm 100 thành phần int
AINTAINT a;a; //a: //a: biếnbiếnkiểukiểu AINTAINT
MảngMảng
Ví dVí d
Mảng
Mảng
––
Ví
d
ụ
Ví
d
ụ
#define
SIZE
10
#define
SIZE
10
int a[5]; // a dãy gồm5 số nguyên
long int big[100]; // big: chiếm 400 bytes!
double d
[
100
]
;
//
d: chiếm 800 b
y
tes!
[]
//
y
long double v[SIZE];// v:10 long doubles
long double d[2.5];
long double d[0];
long double d[-4];
long do ble d[n]
long
do
u
ble
d[n]
;
MảngMảng
Ví dVí d
khởitrị cho 5
Mảng
Mảng
––
Ví
d
ụ
Ví
d
ụ
i
[5] {1020304050}
khởi
trị
cho
5
thành phần
i
nt a
[5]
=
{
10
,
20
,
30
,
40
,
50}
;
double d[100] = { 1.5, 2.7};
short primes[] = { 1, 2, 3, 5, 7, 11, 13};
long b[50] = { 0 };
2 thành phần
đầutiênđược
đầu
tiên
được
khởi trị, phần
còn lại: 0
compiler xác định
kích thước gồm 7
thành phần
cách nhanh nhất để
int i = 7;
const int
c=5;
thành
phần
cách
nhanh
nhất
để
khởi trị tất cả các
thành phần bằng 0
const
int
c
=
5;
int a[i];
double d[c];
short
primes[];
short
primes[];
MảngMảng
––
TruyTruy
xuấtxuất
cáccác
phầnphần
tửtử
CácCác thànhthành phầnphầncủacủamảngmảng đượcđượctruytruy xuấtxuất thôngthông quaqua chỉchỉ sốsố
ủủ
húhú
00
ii
11
MảngMảng
TruyTruy
xuấtxuất
cáccác
phầnphần
tửtử
c
ủ
ac
ủ
ac
hú
ngc
hú
ng
00
s
i
zes
i
ze
11
ThaoThao táctác truytruy xuấtxuất khôngkhông kiểmkiểmtratra giớigiớihạnhạncủacủachỉchỉ sốsố
nhưngnhưng
giágiá
trịtrị
khôngkhông
kiểmkiểm
soátsoát
đượcđược
nhưngnhưng
giágiá
trịtrị
khôngkhông
kiểmkiểm
soátsoát
đượcđược
int main()
{
0
a
{
int a[6];
int i = 7;
a[0] = 59;
0
1
2
a[0]
=
59;
a[5] = -10;
a[i/2] = 2;
a[6] = 0;
2
3
4
a[6]
=
0;
a[-1] = 5;
return 0;
5
}
T ề th ố Mả hhàT ề th ố Mả hhà
T
ruy
ề
n
th
am s
ố
Mả
ng c
h
o
hà
m
T
ruy
ề
n
th
am s
ố
Mả
ng c
h
o
hà
m
ThTh
ốố
kiểkiể
ảả
đđ
t ềt ề
hh
hàhà
hí hhí h
làlà
địđị
hỉhỉ
Th
am
Th
am s
ố
s
ố
kiể
u
kiể
um
ả
ngm
ả
ng
đ
ược
đ
ược
t
ruy
ề
n
t
ruy
ề
nc
h
oc
h
o
hà
m
hà
mc
hí
n
h
c
hí
n
h
làlà
đị
a
đị
ac
hỉ
c
hỉ
củacủaphầnphầntửtửđầuđầu tiêntiên trêntrên mảngmảng
SốSố
thànhthành
phầnphần
trongtrong
thamtham
sốsố
mảngmảng
cócó
thểthể
đểđể
trốngtrống
SốSố
thànhthành
phầnphần
trongtrong
thamtham
sốsố
mảngmảng
cócó
thểthể
đểđể
trốngtrống
SốSố thànhthành phầnphầnthựcthựcsựsựđượcđượcsửsử dụngdụng phảiphảitruyềntruyền quaqua mộtmột
thamtham
sốsố
kháckhác
(vd(vd
::
size)size)
thamtham
sốsố
kháckhác
(vd(vd
::
size)size)
in
t
add e
l
e
m
e
n
ts(
in
t
a[],
in
t
s
iz
e)
t add_eeets( ta[], t s e)
{
int add_elements(int *p, int size)
{
Ví dụVí dụ
Ví
dụVí
dụ
#include <stdio.h>
id
(l [] i t)
1
primes
vo
id
sum
(l
ong
[]
,
i
n
t)
;
int main(void) {
long primes[6] = { 1, 2,
2
3
3, 5, 7, 11 };
sum(primes, 6);
printf("%li\n", primes[0]);
5
7
11
return 0;
}
11
a
void sum(long a[], int sz) {
int i;
long
total = 0;
sz
6
dùng để kiểmtra
long
total
=
0;
for(i = 0; i < sz; i++)
total += a[i];
a[0] total;
tổng đượclưu vào
dùng
để
kiểm
tra
giới hạn chỉ số
a[0]
=
total;
}
tổng
được
lưu
vào
phần tử đầu tiên
Chú ýChú ý
Chú
ýChú
ý
KhôKhô
thểthể
thth
hiệhiệ
áá
thth
tátá
héhé
ộiội
dd
ộtột
ảả
Khô
ng
Khô
ng
thểthể
th
ực
th
ực
hiệ
n
hiệ
nc
á
cc
á
c
th
ao
th
ao
tá
c
tá
cc
hé
pc
hé
pn
ội
n
ội
d
ung
d
ung m
ột
m
ột
m
ả
ngm
ả
ng
sang sang mảngmảng kháckhác
ChépChép
từngtừng
phầnphần
tửtử
mảngmảng
ChépChép
từngtừng
phầnphần
tửtử
mảngmảng
char A[3]={‘char A[3]={‘a’,’b’,’ca’,’b’,’c’};’};
char B[3];char B[3];
B = A; // ???B = A; // ???
for(for(intint ii=0; =0; ii<3; <3; ii++)++)
B[B[
ii
]A[]A[
ii
];];
B[B[
ii
]
=
A[]
=
A[
ii
];];
hoặchoặc chépchép khốikhốibộbộ nhớnhớ ((sẽsẽđượcđược đềđề cậpcậpsausau))
KhôngKhông
dùngdùng
phépphép
soso
sánhsánh
trựctrực
tiếptiếp
(==)(==)
nộinội
dungdung
trongtrong
haihai
KhôngKhông
dùngdùng
phépphép
so
so
sánhsánh
trựctrực
tiếptiếp
(==)
(==)
nộinội
dung
dung
trongtrong
haihai
mảngmảng
Phé
p
Phé
p
so so sánhsánh
(
A==B
)
so
(
A==B
)
so sánhsánh đ
ị
ađ
ị
achỉchỉ haihai vùn
g
vùn
g
nhớnhớ màmà A A vàvà B B
pp
()()
ịị
gg
chỉchỉđếnđến
Một ố th tá ởMột ố th tá ở
Một
s
ố
th
ao
tá
c cơ s
ởMột
s
ố
th
ao
tá
c cơ s
ở
NhậpNhập
ấấ
Xu
ấ
tXu
ấ
t
ThêmThêm mộtmột thànhthành phầnphầndữdữ liệuliệu
LoạiLoạibỏbỏ mộtmột thànhthành phầnphầndữdữ liệuliệu
TìmTìm
kiếmkiếm
TìmTìm
kiếmkiếm
SắpSắpxếpxếp
MảngMảng
Nhậ dữ liệNhậ dữ liệ
Mảng
Mảng
––
Nhậ
p
dữ
liệ
u
Nhậ
p
dữ
liệ
u
v
oid ReadData(int a[], int size)
{
int
i;
duyệt qua tất cả các
int
i;
f
o
r
(
i =
0;
i <
s
iz
e;
i++
)
phần tử
o( 0; s e; )
{
printf(“Nhap thanh phan %d: ”, i);
scanf(“%d”, &a[i]);
}
}
}
nh
ập
dữ li
ệ
u cho a
[
i
]
ập ệ []
MảngMảng
X ấtdữ liệ àhìhX ấtdữ liệ àhìh
Mảng
Mảng
––
X
u
ất
dữ
liệ
u ra m
à
n
hì
n
hX
u
ất
dữ
liệ
u ra m
à
n
hì
n
h
void WriteData(int a[], int size)
{
i
i
i
nt
i
;
for(i = 0; i < size; i++)
for(i
=
0;
i
<
size;
i++)
printf(“%d ”, a[i]);
printf(“\n”);
}
MảngMảng
Nhậ ấtdữ liệNhậ ấtdữ liệ
Mảng
Mảng
––
Nhậ
p xu
ất
dữ
liệ
u
Nhậ
p xu
ất
dữ
liệ
u
#include <stdio h>
#include
<stdio
.
h>
void ReadData(int [], int );
v
oi
d
WriteData(int [], int );
void main()
{
int
a[100] n;
int
a[100]
,
n;
clrscr();
printf(“Nhap so thanh phan cua day: “);
scanf(“%d”, &n);
printf(“Nhap cac thanh phan cua day: “);
ReadData(a n);
ReadData(a
,
n);
printf(“Day vua nhap: \n“);
WriteData(a, n);
}