Tải bản đầy đủ (.pdf) (30 trang)

theory 2

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (665.82 KB, 30 trang )

CẤU TRÚC DỮ LIỆU
CẤU

TRÚC

DỮ

LIỆU

VÀ GIẢITHUẬT


GIẢI

THUẬT
Lý thuyết
Ph

n 2
(
Chươn
g
3
)
( g)
Danh sách, Ngăn xếp và Hàng đợi
 Giới thiệu khái niệm ADT (Kiểu dữ liệu
trừutượng

Abstract Data Type)
trừu



tượng

Abstract

Data

Type)
 Danh sách
N ă ế

Ngă
n x
ế
p
 Hàng đợi
Vũ Anh Dũng - Khoa CNTT 2
Kiểu dữ liệu trừu tượng
 Là tập các đối tượng tương ứng với tập các
thao tác
thao

tác
 Danh sách, tập hợp,… có thể coi là kiểu dữ
liệutrừutượng
liệu

trừu

tượng

 C++ cho phép viết các thao tác và được gọi
là á hươ thứ

c
á
c p
hươ
n
g

thứ
c
 Ví dụ : Tập hợp là một ADT với các thao
Vũ Anh Dũng - Khoa CNTT 3
tác : add, remove, find, union,…
Danh sách (List)
 Danh sách tổng quát có dạng A
0
,A
1
,
A
2
,

,
A
N
-
1

2
,,
N
-
1
 Kích thước N và nếu N=0 : danh sách rỗng
Một ố th tá hổ biế

Một
s


th
ao

c p
hổ

biế
n :
 printList : in danh sách

makeEmpty
:
làm rỗng danh sách

makeEmpty
:

làm


rỗng

danh

sách
 find : trả về vị trí lần đầu tiên một phần tử xuất
hiện tron
g
danh sách
Vũ Anh Dũng - Khoa CNTT 4
g
Danh sách (List)
 Một số thao tác phổ biến (tiếp) :
 findKth : trả v


p
h

n tử ở v

trí c

th

p ị ụ
 insert : thêm 1 phần tử vào danh sách
 remove : xóa 1
p

h

n tử khỏi danh sách
p
Vũ Anh Dũng - Khoa CNTT 5
Sử dụng mảng để
cài đặt danh sách
 Các thao tác :

printList
:
thực
hiện
trong
thời
gian
tuyến
tính

printList
:

thực
hiện
trong
thời
gian
tuyến
tính
 findKth : chiếmthờigianhằng số


insert

remove
đòi
hỏi
tốn
kém

insert


remove

đòi
hỏi
tốn
kém
nhiềuthời gian (Ví dụ : trường
hợp thêm vào vị trí đầu tiên là
tốn kém thời gian nhất)
 Trườn
g
h
ợp
dùn
g
mản
g
lưutrữ danh sách

Vũ Anh Dũng - Khoa CNTT 6
g
ợp
g
g
không phảilàlựachọntốtnhất
Danh sách liên kết(LinkedList)
 Hình ảnh về danh sách liên kết
ế
 Danh sách liên k
ế
t tránh được việc chèn và
xóa phần tử theo chi phí tuyến tính (dịch
ể ế ố ầ
chu
yể
n liên ti
ế
p 1 s

ph

n tử)
Vũ Anh Dũng - Khoa CNTT 7
Danh sách liên kết(LinkedList)
 Danh sách liên kết :

Chuỗi các nút (node)

Chuỗi


các

nút

(node)
 Không cần lưu trữ liền kề trong bộ nhớ

Mỗi nút chứaphầntử và liên kết đến nút tiếp

Mỗi

nút

chứa

phần

tử



liên

kết

đến

nút


tiếp

theo (next link)

Nút cuối cùng có next link là NULL

Nút

cuối

cùng



next

link



NULL
Vũ Anh Dũng - Khoa CNTT 8
Danh sách liên kết(LinkedList)
 Phép xóa phần tử (remove):

 Phép thêm ph

n tử (insert):
Vũ Anh Dũng - Khoa CNTT 9
Danh sách liên kết(LinkedList)

 Loạibỏ mụccuối cùng :

P
hải tìm
mục
phía
trước
mục
cuối
cùng

P
hải

tìm

mục
phía
trước
mục
cuối
cùng
 Đổi liên kếtnext của nó thành NULL

Cập
nhật
liên
kết
duy
trì

nút
cuối
cùng

Cập
nhật
liên
kết
duy

trì
nút
cuối
cùng
 Có thể dùng ds liên kết đôi (nốikép):
Vũ Anh Dũng - Khoa CNTT 10
GiớithiệuSTL
 Ba thành phần chính của STL :

Container (Collection) :
các
cấu
trúc
dữ
liệu
sẵn

Container

(Collection)


:

các
cấu
trúc
dữ
liệu
sẵn
có như List, Vector, Set,….

Iterator
:
giống
con
trỏ
,
dùng
để
truy
cập
các
Iterator
:

giống
con

trỏ
,


dùng
để
truy
cập
các
phầntử trong Container
 Al
g
orithms : Các thu

t toán thao tác d

li

u
,

g


,
tìm kiếm, sắpxếp, …
Vũ Anh Dũng - Khoa CNTT 11
Vector
 Lợi thế củaviệcsử dụng vector là nó có thể
đánh
chỉ
số
trong

thời
gian
hằng
.
đánh
chỉ
số
trong
thời
gian
hằng
.
 Bấtlợicủacủa nó là thao tác chèn thêm các
mục
mới

loại
bỏ
các
mục
hiện


tốn
mục
mới

loại
bỏ
các

mục
hiện


tốn
kém, trừ khi những thay đổinàyđượcthực
hiện

cuối
vector
hiện


cuối
vector
.
Vũ Anh Dũng - Khoa CNTT 12
List
 Lợi thế củaviệcsử dụng list là việcchèn
thêm
mục
mới

việc
loại
bỏ
các
mục
hiện
thêm

mục
mới

việc
loại
bỏ
các
mục
hiện
có là chi phí thờigianthấp

Bất
lợi

danh
sách
không
dễ
dàng

thể

Bất
lợi

danh
sách
không
dễ
dàng


thể
đánh chỉ số.
Vũ Anh Dũng - Khoa CNTT 13
Vector và List trong STL
 Cả vector và list đềucómộtsố phương thức
chung
:
chung
:
 int size( ): trả về kích thướchiệntạicủa
đ

itư

n
g
chứa
(
container
)
.
ợ g
()
 void clear( ): xóa toàn bộ container.

bool
empty( )
:
trả về true nếu đốitượng

bool
empty(

)
:

trả

về

true

nếu

đối

tượng

chứa không bao chứa phần tử nào, và false nếu
ngược lại.
Vũ Anh Dũng - Khoa CNTT 14
Vector và List trong STL
 void push_back( const Object & x ): thêm x vào cuối danh
sách.
ố ố
 void pop_back( ): loại bỏ đ

i tượng ở cu

i danh sách.

 const Object & back( ) const: trả về đối tượng ở cuối của
danh sách (mộthàmbiến đổitrả về một tham chiếucũng
danh

sách

(một

hàm

biến

đổi

trả

về

một

tham

chiếu

cũng

được cung cấp).
 const Object & front ( ) const: trả về đối tượng ở đầu của
ế ổ ề ế
danh sách (một hàm bi

ế
n đ

i trả v

một tham chi
ế
u cũng
được cung cấp).
Vũ Anh Dũng - Khoa CNTT 15
Vector và List trong STL
 Hai phương thứcsauđây chỉđược cung cấp
cho
list (
nối
kép
):
cho
list

(
nối
kép
):
 void push_front( const Object & x ): thêm x vào
đ

u danh sách.
 void pop_front ( ): loạibỏđốitượng ở đầucủa
danh sách.

Vũ Anh Dũng - Khoa CNTT 16
Vector và List trong STL
 Các phương thứccủa Vector:
 v.
[
idx
]
: trả vềđốitư

n
g
ở v

trí idx tron
g
[
]
ợ g

g
vector, không có sự kiểm tra ranh giới.
 v.at(int idx): trả vềđốitượng ở vị trí idx
trong vector
 int capacity( ): kích thướccóthể lưutrữ
t ớ
khi

hát
l i


hát
l i



đôi
t


c
khi
c

p
phát
l

i
, c

p
phát
l

i
s


ng g


p
đôi
.
 void reserve(int newCapacity): thiết
lập
dung
lượng
mới
Vũ Anh Dũng - Khoa CNTT 17
lập
dung

lượng
mới
.
Iterator
 Trên danh sách đòi hỏi khái niệmvề vị trí,
trong
STL
vị
trí
được
đại
diện
bởi
iterator
trong
STL

vị

trí
được
đại
diện
bởi
iterator
 Trong list<string>, vị trí đượcthể
hiện
bởi
list<string>::
iterator
hiện
bởi
list<string>::
iterator
 Trong vector<int>, vị trí đượcthể hiện
bởi
vector<
int
>::
iterator
bởi
vector<
int
>::
iterator
Vũ Anh Dũng - Khoa CNTT 18
Iterator
 Trong STL list và các containers class trong
TLD,

đều

hai
phương
thức
:
TLD,

đều

hai

phương
thức
:
 iterator begin( ) trả về iterator
đầu
tiên
đầu
tiên
 iterator end( ) trả về iterator
ối
ù
cu
ối
c
ù
n
g
Vũ Anh Dũng - Khoa CNTT 19

Iterator
 Các phép toán trên iterator

itr
++

++
itr
:
chuyển
iterator
itr
tới

itr
++


++
itr
:

chuyển
iterator
itr
tới
vị trí tiếptheo
*
itr
:

truy
cập
đến
phần
tử
được
trỏ
tới

*
itr
:

truy
cập
đến
phần
tử
được
trỏ
tới
ở vị trí của iterator itr
 Ví dụ :
for( vector<int>::iterator itr = v.begin( ); itr !=
v.end
();++
itr
)
Vũ Anh Dũng - Khoa CNTT 20
v.end

(

);

++
itr
)
cout << *itr << endl;
Iterator
 Ba thao tác phổ biếnnhất đòi hỏi các
iterator đólàthêmvàlo

i
b
ỏ khỏidanh

sách (hoặc vector hoặc list)

iterator
insert(
iterator
pos,
iterator
insert(
iterator
pos,

const Object &x): thêm x vào danh sách,
trướcvị trí được đưarabởi iterator pos.
 iterator erase( iterator pos ):

loại bỏ đối tượng ở vị trí được cho bởi iterator,
ề ế
Vũ Anh Dũng - Khoa CNTT 21
trả v

iterator là vị trí ti
ế
p theo
Iterator
 Ba thao tác phổ biếnnhất đòi hỏi các
iterator đólàthêmvàlo

i
b
ỏ khỏidanh

sách (hoặc vector hoặc list) (tiếp)

iterator erase(iterator
start,
iterator

erase(iterator

start,

iterator end):loại bỏ tất cả các mục bắt
đầu ở vị trí start, cho tới nhưng không bao gồm
end
Vũ Anh Dũng - Khoa CNTT 22

Xóa các phầntử lẻ sử dụng
Iterator
1 template <typename Container>
2 void removeEveryOtherItem( Container & lst )
3
{
{
4 typename Container:iterator itr = lst.begin( );
5 while ( itr != lst.end( ) )
6
{
{
7 itr = lst.erase( itr );
9 if( itr != lst.end( ) )
10
++
itr
;
10

itr
;
11 }
12 }
Vũ Anh Dũng - Khoa CNTT 23
Const_Iterator
• iterator begin( )
• const_iterator begin( ) const
• iterator end
(


)
()
• const_iterator end( ) const
void print( const list < int> & lst, ostream & out = cout )
{
typename Container::iterator itr = lst.begin( );
while( itr != lst.end( ) )
{
*
i
dl
out <<
*
i
tr << en
dl
;
*itr = 0; // Chỗ này có thể bị lỗinếu dùng const_iterator
itr++;
}
Vũ Anh Dũng - Khoa CNTT 24
}
}
In một Collection
1 template <typename Container>
2 void printCollection( const Container & c, ostream & out = cout )
3 {
i
4

i
f( c.empty( ) )
5 out << "(empty)";
6 else
7 {
8 typename Container::const_iterator itr = c.begin( );
9 out << "[ " << *itr++; // In ra mục đầu tiên
10
11 while ( itr != c.end( ) )
12 out << ", " << *itr++;
13 out << " ]" << endl;
14 }
15
}
Vũ Anh Dũng - Khoa CNTT 25
}
In một đốitượng chứabấtkỳ

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×