Tải bản đầy đủ (.ppt) (87 trang)

sap xep va tim kiem

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 (3.21 MB, 87 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<i><b>SẮP XẾP VÀ TÌM KIẾM</b></i>



<i><b>SẮP XẾP VÀ TÌM KIẾM</b></i>



<i><b>Nhóm thực hiện:</b></i>


<i><b>Nhóm thực hiện:</b></i>


1. Trần Văn Trọng


1. Trần Văn Trọng


2. Phạm Thị Mai


2. Phạm Thị Mai


3. Nguyễn Thị Bích Phương


3. Nguyễn Thị Bích Phương


4. Bùi Thị Kim Ngân


4. Bùi Thị Kim Ngân


5. Nguyễn Thị Mơ


5. Nguyễn Thị Mơ


6. Nguyễn Hữu Đạt


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

<i><b>PHẦN I:SẮP XẾP </b></i>




</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

<i><b>NỘI DUNG CẦN TÌM HIỂU</b></i>



<i><b>Các Phương Pháp Sắp Xếp Phức Tạp</b></i>



<i><b>Các Phương Pháp Sắp Xếp Đơn Giản </b></i>



<i><b>Những Nhận Xét Chung</b></i>



<b>SẮP XẾP</b>



<b>SẮP XẾP</b>



<b>1</b>


<b>2</b>
<b>3</b>


<b>4</b>


<i><b>Khái Niệm và Các Phương Pháp Sắp Xếp</b></i>



</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

<i><b>YÊU CẦU CẦN NẮM VỮNG</b></i>



<i><b>Các thuật toán </b></i>



<b>2</b>



<i><b>Nội dung các phương pháp</b></i>




<b>31</b>



<i><b>Biết vận dụng linh hoạt các thuật toán</b></i>



</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

<i><b> KHÁI NIỆM VÀ CÁC PHƯƠNG </b></i>


<i><b>PHÁP SẮP XẾP</b></i>



<i><b>Phương Pháp Sắp Xếp Phức Tạp </b></i>



<b>3</b>



<i><b>Các Khái Niệm</b></i>



<b>31</b>



<i><b>Phương Pháp Sắp Xếp Đơn Giản </b></i>



</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

<i><b>KHÁI NIỆM</b></i>



<i><b>Sắp xếp</b></i>

<i><b> là q trình bố trí lại các phần tử </b></i>



</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

<i><b>KHÁI NIỆM</b></i>



Khái niệm

<sub>nghịch thế</sub>




Giả sử xét mảng có thứ tự tăng dần, nếu có i<j và


ai>aj thì ta gọi đó là nghịch thế.



Mục tiêu của sắp xếp là khử các nghịch thế (bằng
cách hoán vị).


Quy ước

:

<sub> Các phương pháp sắp xếp đều được </sub>


sắp xếp theo chiều tăng dần.


<b>a1</b>

<b>a2</b>

<b>a3</b>

<b>…….</b>



</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

<i><b>PHƯƠNG PHÁP SẮP XẾP ĐƠN GIẢN</b></i>



<i><b>Phương pháp lựa chọn .</b></i>


<i><b>Phương pháp chèn .</b></i>



</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

<i><b>Phương pháp sắp xếp kiểu lựa chọn</b></i>



<i><b>Phương pháp sắp xếp kiểu lựa chọn</b></i>



<i><b>Giải Thuật</b></i>



<b>2</b>



<i><b>Ý Tưởng Thuật Toán </b></i>



<b>31</b>



<i><b>Đánh giá </b></i>



<b>34</b>




<i><b>Vi dụ</b></i>



</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

<i><b>Ý TƯỞNG THUẬT TOÁN</b></i>



Giả sử ta có n số cần sắp xếp khi đó:


 <b>Bước 1</b>:ta chọn ra số nhỏ nhất trong n số để ở vị trí


thứ 1.


 <b>Bước 2</b>: ta chọn ra số nhỏ nhất trong n-1 số để ở vị


trí thứ 2.


 ………


 <b>Bước i</b>: ta chọn ra số nhỏ nhất trong k<sub>i</sub>,k<sub>i+1</sub>,…,k<sub>n</sub> số để


ở vị trí thứ i.


 ………..


 <b>Bước n-1</b>: ta chọn ra số nhỏ nhất trong 2 số để ở vị


trí thứ n-1.


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

<i><b>GIẢI THUẬT</b></i>



<i><b>GIẢI THUẬT</b></i>



 <b>Bước 1</b>: i=1; //xét từ đầu dãy


 <b>Bước 2</b>: min:=i;


 <b>Bước 3</b>:j:=i+1; <i>//tìm vị trí của phần tử nhỏ nhất.</i>


trong khi j<=n


Nếu a[j]<a[min] thì
min:= j;


j=j+1;


 <b>Bước 4</b>:Nếu (a[min]<a[i])


thì


hoán vị (a[i] ,a[min]);


 <b>Bước 5</b>: i=i+1;


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12></div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

<i><b>ĐÁNH GIÁ</b></i>



 Đây là phương pháp sắp xếp đơn giản nhất.


 Ở lượt thứ i,để chọn ra khóa nhỏ nhất bao giờ cũng
cần (n-i) phép so sánh.Nên độ phức tạp của thuật
toán là O(n2).


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

<i><b>PHƯƠNG PHÁP CHÈN TRỰC TIẾP</b></i>




<i><b>PHƯƠNG PHÁP CHÈN TRỰC TIẾP</b></i>



<i><b>Ý Tưởng Thuật Toán</b></i>


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

<i><b>Ý TƯỞNG THUẬT TOÁN</b></i>



 Giả sử cho dãy n phần tử cần sắp xếp k<sub>1</sub>,k<sub>2</sub>,…,k<sub>n</sub>.
 Coi dãy con chỉ gồm mỗi k<sub>1</sub> đã được sắp xếp rồi.


 Thêm k<sub>2</sub>,ta so sánh với k<sub>1 </sub>nếu k<sub>2</sub><k<sub>1</sub> thì chèn trước k<sub>1</sub>.


 Đối với k<sub>3</sub>,ta xét dãy k<sub>1</sub>,k<sub>2</sub> đã sắp xếp và tìm cách chèn
k3vào dãy để được thứ tự sắp xếp.


 ………


 Cứ như vậy ta sẽ sắp xếp dãy k<sub>1</sub>,k<sub>2</sub>,…,k<sub>i</sub> trong điều kiện
dãy k1,k2,…,ki-1 đã được sắp xếp rồi bằng cách chèn ki


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

<i><b>GIẢI THUẬT</b></i>



<b>Bước 1</b>: i = 2; <i>// giả sử có đoạn a[1]</i> <i>đã được sắp </i>


<b>Bước 2</b>: x = a[i];


Tìm vị trí vt thích hợp trong đoạn a[1] đến
a[i-1] để chèn a[i] vào


<b>Bước 3</b>: Dời chỗ các phần tử từ a[vt]đến a[i-1] sang


phải 1 vị trí để dành chỗ cho a[i]


<b>Bước 4</b>: a[vt]= x; <i>// có đoạn a[1]..a[i] </i> <i>đã được </i>
<i>sắp xếp</i>


<b>Bước 5</b>: i = i+1;


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17></div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

<i><b>ĐÁNH GIÁ</b></i>



 Trong trường hợp tốt nhất: tổng số phép so sánh là
n-1.


 Trong trường hợp xấu nhất là dãy số có thứ tự
ngược lại với thứ tự cần sắp xếp thì ở lượt thứ i cần
có i-1 phép so sánh và tổng phép so sánh là:


(n-1)+(n-2)+…+2+1=n*(n-1)/2.


 Trường hợp các giá trị xuất hiện một cách ngẫu
nhiên,thì ở lượt thứ i cần i/2 phép so sánh.Như vậy
tổng số phép so sánh là:


(1/2)+(2/2)+…+(n/2)=n*(n+1)/4.


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

“Chèn trực tiếp” , “Chọn trực tiếp”, “Nổi bọt”



đều là những thuật tốn có độ phức tạp là



<b>O(n</b>

<b>2</b>

<b>)</b>




Dễ cài đặt, dễ kiểm lỗi



“Chèn trực tiếp” tốt hơn “Chọn trực tiếp”, nhất



là khi mảng đã có thứ tự sẵn.



Cần có những giải thuật hiệu quả hơn cho việc



</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

<b>Nhó</b>


<i><b>Phương pháp sắp xếp kiểu nổi bọt</b></i>



<i><b>Đánh Giá</b></i>


<i><b>Giải Thuật</b></i>



<i><b>Ý Tưởng Thuật toán</b></i>



</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

<i><b>Ý TƯỞNG THUẬT TỐN.</b></i>



 Giả sử ta có n số cần sắp xếp khi đó:
 So sánh hai số liên tiếp:


Nếu đúng thứ tự thì để nguyên.
Nếu ngược thì thứ tự đổi chỗ.


 Sau vịng 1 thì số bé nhất đổi lên ở vị trí 1.


 Sau vịng 2 thì số bé nhất trong n-1 số còn lại nổi lên ở
vị trí 2.



 ………


 Sau vịng n-1 thì số bé nhất trong 2 số còn lại sẽ nổi lên
ở vị trí n-1.


</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

<b>GIẢI THUẬT</b>



<b>Bước 1: </b>


i = 1;


<b>Bước 2:</b>


j = N;


Trong khi (j > i) thực hiện:


Nếu a[j]<a[j-1]: Hoán vị a[j] và a[j-1]


j = j-1;


<b>Bước 3:</b>


i = i+1;


</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23></div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

<b>ĐÁNH GIÁ THUẬT TOÁN</b>



<b>ĐÁNH GIÁ THUẬT TOÁN</b>



 Trong mọi trường hợp thì số phép so sánh là:


(n-1)+(n-2)+…+2+1=n*(n-1)/2


Vì vậy độ phức tạp của thuật tốn là O(n2).


</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

<i><b>NHỮNG PHƯƠNG PHÁP SẮP </b></i>


<i><b>XẾP PHỨC TẠP</b></i>



Phương pháp sắp xếp nhanh-Quick Sort.



Phương pháp sắp xếp vun đống-Heap Sort.



</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

<b>Nhó</b>


<i><b>PHƯƠNG PHÁP SẮP XẾP </b></i>


<i><b>NHANH</b></i>



<i><b>QUICK SORT</b></i>



<i><b>Ý Tưởng Thuật Tốn</b></i>



<b>1</b>



<i><b>Giải Thuật</b></i>



<b>2</b>



<b>5</b>

<i><b>Ví dụ</b></i>


</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

<i><b>Ý TƯỞNG THUẬT TỐN</b></i>




 Giả sử ta có dãy n số khi đó:


 Nếu n<=1 thì ta khơng cần làm gì cả.


 Ngược lại ta chọn bất kỳ phần tử nào đó làm chốt.


 Mọi phần tử nhỏ hơn chốt ta xếp vào vị trí đứng
trước chốt,mọi phần tử lớn hơn chốt ta xếp vào vị trí
sau chốt.


</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

<i><b>GIẢI THUẬT</b></i>



<b>Cho dãy </b>

<b>a</b>

<b>L</b>

<b>, a</b>

<b>L+1</b>

<b>, … a</b>

<b>R</b>


<b>Bước 1:</b>



Phân hoạch dãy a

L

… a

R

thành các dãy con:



Dãy con 1: a

<sub>L </sub>

… a

<sub>j</sub>

< x


Dãy con 2: a

<sub>j+1</sub>

… a

<sub>i-1</sub>

=x


Dãy con 3: a

<sub>i</sub>

… a

<sub>R</sub>

> x



<b>Bước 2:</b>



</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

<b> </b>


<b>Bước 1: </b>


Chọn tùy ý một phần tử a[k] trong dãy là giá trị
mốc, L≤k≤R



x=a[k], i=L, j=R
<b>Bước 2: </b>


Phát hiện và hiệu chỉnh cặp a[i] và a[j] nằm sai chỗ:
Bước 2a: Trong khi (a[i]<x) i++


Bước 2b: Trong khi (a[j]>x)


j--Bước 2c: Nếu (i<j) Hoán vị a[i] và a[j]
<b>Bước 3:</b>


Nếu i<j: Lặp lại bước 2


Ngược lại: Dừng phân hoạch


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

 Độ phức tap trong trường hợp xấu nhất là khi dãy
khóa đã được sắp xếp rồi <b>O(n2).</b>


 Độ phức tạp trung bình <b>O(n*log<sub>2</sub>n). </b>Độ phức tạp của
thuật toán tùy thuộc vào cách chọn phần tử “chốt”:


 Nếu chọn được phần tử có giá trị trung bình, thì
chia thành 2 dãy bằng nhau;


 Nếu chọn phải phần tử nhỏ nhất (hay lớn nhất) thì
sau mỗi lượt ta chỉ tách ra được một phân đoạn có
kích thước nhỏ hơn trước.Vì vậy ta quay lại phương
pháp sắp xếp nổi bọt.



</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>

<i><b>PHƯƠNG PHÁP VUN ĐỐNG</b></i>


<i><b>HEAP SORT</b></i>



<i><b>Đánh giá</b></i>


<i><b>Ví Dụ</b></i>


<i><b>Giải Thuật</b></i>



</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=32>

<i><b>ĐỊNH NGHĨA ĐỐNG</b></i>



 Đống là một cây nhị phân hoàn chỉnh mà mọi nút
cha đều có trường khóa lớn hơn khóa của hai nút
con.


10


1
4


6


2


8
7


</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=33>

<b>VUN ĐỐNG</b>



Nhận xét:



 Nếu cây nhị phân hồn chỉnh đã là đống thì các cây con của



các nút(nếu có)cũng là cây nhị phân hoàn chỉnh và cũng là
đống.


 Trên cây nhị phân hồn chỉnh có n nút thì chỉ có[n/2] nút


cha.


 Một nút lá bao giờ cũng có thể coi là đống.


 Gỉa sử gốc r và hai nút con là 2r và 2r+1 đã là đống:


 So sánh hai nút con để tìm con lớn hơn.
 So sánh gốc với con lớn


• Nếu gốc lớn hơn con thì xong.


</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>

<i><b>VÍ DỤ VUN ĐỐNG </b></i>



 Vun đống cây sau:


Gốc 2 và gốc 3 đã là đống.


 Gốc 1 chưa là đống nên cần vun gốc 1 thành đống.


16


40


8 2



6


10


1


2 3


</div>
<span class='text_page_counter'>(35)</span><div class='page_container' data-page=35>

<i><b>Ý TƯỞNG THUẬT TỐN</b></i>



Thuật tốn:



Bước 1:Vun cây ban đầu thành đống.
Bước 2:Sắp xếp

.



</div>
<span class='text_page_counter'>(36)</span><div class='page_container' data-page=36>

<i><b>PHƯƠNG PHÁP SẮP XẾP HÒA NHẬP</b></i>


<i><b>MERGE SORT</b></i>



<i><b>1. Phép trộn hai đường</b></i>



<i><b>1. Phép trộn hai đường</b></i>


<i><b>1. Phép trộn hai đường</b></i>



<i><b>1. Phép trộn hai đường</b></i>



<i><b>2. Ý tưởng thuật toán</b></i>



<i><b>2. Ý tưởng thuật toán</b></i>


<i><b>2. Ý tưởng thuật toán</b></i>




<i><b>2. Ý tưởng thuật toán</b></i>



<i><b>3. Giải thuật sắp xếp</b></i>



<i><b>3. Giải thuật sắp xếp</b></i>


<i><b>3. Giải thuật sắp xếp</b></i>



<i><b>3. Giải thuật sắp xếp</b></i>



<i><b>4. Ví dụ minh họa</b></i>



<i><b>4. Ví dụ minh họa</b></i>


<i><b>4. Ví dụ minh họa</b></i>



<i><b>4. Ví dụ minh họa</b></i>



<i><b>5. Đánh giá </b></i>



<i><b>5. Đánh giá </b></i>


<i><b>5. Đánh giá </b></i>



</div>
<span class='text_page_counter'>(37)</span><div class='page_container' data-page=37>

<i><b>PHÉP TRỘN HAI ĐƯỜNG TRỰC TIẾP</b></i>



 Phép trộn 2 đường là phép hợp nhất hai dãy khóa <i>đã </i>


<i>sắp xếp</i> ghép lại thành một dãy khóa có kích thước
bằng tổng kích thước của hai dãy khóa ban đầu và
dãy khóa tạo thành cũng có thứ tự sắp xếp.



 Nguyên tắc trộn:


So sánh hai khóa đứng đầu hai dãy,chọn ra khóa
nhỏ nhất để đưa vào miền sắp xếp và đặt vào vị trí
thích hợp.Khóa này bị loại khỏi dãy chứa nó.


</div>
<span class='text_page_counter'>(38)</span><div class='page_container' data-page=38>

<i><b>VÍ DỤ PHÉP TRỘN HAI ĐƯỜNG</b></i>



Ta có hai mảng sau:(1,3,10,11)và(2,4,9).



Kết quả sau phép trộn hai mảng



(1,2,3,4,9,10,11)



<b>Mảng 1</b>

<b>Mảng 2</b>

<b>So sánh</b>

<b>Miền sắp </b>


<b>xếp</b>



<b>(10,11)</b>

<b>Ø</b>

<b>(1,2,3,4,9,</b>



<b>10,11)</b>


<b>(3,10,11) (2,4,9)</b>

<b>3>2</b>

<b>(1,2)</b>



<b>(1,3,10,11)</b>

<b><sub>(2,4,9)</sub></b>

<b><sub>1<2</sub></b>

<b><sub>(1)</sub></b>



<b>(3,10,11) (4,9)</b>

<b>3<4</b>

<b>(1,2,3)</b>



</div>
<span class='text_page_counter'>(39)</span><div class='page_container' data-page=39>

<i><b>Ý TƯỞNG SẮP XẾP HỊA NHẬP</b></i>



 Coi danh sách cần sắp xếp(có n phần tử) là n danh
con mà mỗi danh sách con gồm 1 phần tử.Như vậy


là các danh sách con đã được sắp xếp.Trộn từng cặp
hai danh sách con kề cận nhau thành một danh sách
có 2 phần tử ta nhận được n/2 danh sách con đã
được sắp xếp.


 Xem danh sách cần sắp xếp như n/2 danh sách con
đã được sắp xếp,ta lại tiếp tục trộn từng cặp hai
danh sách kế cận thành từng danh sách có 4 phần
tử đã được sắp xếp và nhận được n/4 danh sách
con.


</div>
<span class='text_page_counter'>(40)</span><div class='page_container' data-page=40>

<i><b>GIẢI THUẬT SẮP XẾP HÒA NHẬP</b></i>



 <b>Bước 1</b>:kiểm tra n


 Nếu n<2 thì return;


 Ngược lại ta chuyển xuống bước 2;


 <b>Bước 2</b>: n1=n/2 ; //chia đôi mảng.


n2=n-n1;


 <b>Bước 3</b>:trong khi mà i<=n1


 A1[i]=a[i];//chuyển các phần tử a[i] vào mảng mới A1


 <b>Bước 4</b>:trong khi j<=n2


 A2[i]=a[i+n1];//chuyển các phần tử a[i+n1] vào mảng mới A2



 <b>Bước 5</b>:Mergesort(A1,n1);//tiếp tục chia đôi mảng A1


Mergesort(A2,n2);//tiếp tục chia đôi mảng A2


</div>
<span class='text_page_counter'>(41)</span><div class='page_container' data-page=41>

<i><b>PHẦN II:Tìm kiếm</b></i>



</div>
<span class='text_page_counter'>(42)</span><div class='page_container' data-page=42>

Nội dung



<b>Bài tốn tìm kiếm</b>


1



<b>Tìm kiếm tuần tự</b>


2



<b>Tìm kiếm nhị phân</b>


3



<b>Cây nhị phân tìm kiếm</b>


4



<b>Tìm kiếm dựa vào giá trị khóa</b>


</div>
<span class='text_page_counter'>(43)</span><div class='page_container' data-page=43>

Bài tốn tìm kiếm



 Cho một bảng gồm n bản ghi R<sub>1</sub>, R<sub>2</sub>, R<sub>3</sub>, …, R<sub>n</sub>. Mỗi bản ghi R<sub>i</sub> (1≤i≤n)



tương ứng với một khố ki.


 X được gọi là <i>khố tìm kiếm</i> hay <i>đối trị tìm kiếm</i> (argument).


 Cơng việc tìm kiếm hồn thành khi một trong hai tình huống sau xảy ra:
 Tìm kiếm được bản ghi có giá trị khố tương ứng bằng X, lúc đó ta


nói phép <i>tìm kiếm được thoả</i> (successfull).


 Khơng tìm thấy bản ghi nào có giá trị bằng X cả: <i>Phép tìm kiếm khơng </i>


<i>thoả</i> (unsuccessfull). Khi đó bổ sung thêm bản ghi mới có khoá bằng
X vào bảng được gọi là giải thuật tìm kiếm có bổ sung.


 Khố của mỗi bản ghi chính là đặc điểm nhận biết của bản ghi đó trong tìm


</div>
<span class='text_page_counter'>(44)</span><div class='page_container' data-page=44>

Tìm kiếm tuần tự (seaquential


searching)



Nội dung:



 Tìm kiếm tuần tự là kỹ thuật tìm kiếm rất đơn giản và cổ điển.
 Ta có thể tóm tắt nội dung như sau:


 “Bắt đầu từ bản ghi thứ nhất, lần lượt so sánh khố tìm kiếm với


</div>
<span class='text_page_counter'>(45)</span><div class='page_container' data-page=45>

Tìm kiếm tuần tự…



Giải thuật:




Type Mg=array[1..1000] of integer;


Function sequen_search(var k:Mg; n,x: integer):integer;
Begin


i:=1; k[n+1]:=x;


while k[i]<>x do i:=i+1;


if i = n + 1 then sequen_search:=0
else sequen_search:=i;


End;


</div>
<span class='text_page_counter'>(46)</span><div class='page_container' data-page=46>

Tìm kiếm tuần tự…



Ví dụ:cho dãy khóa sau

:



 Nếu X = 87: Phép tìm kiếm được thực hiện như sau:


Phép tìm kiếm được thỏa mãn


11 23 36 42 58 65 74 87 94 99


11 23 36 42 58 65 74 8787 94 99 87


</div>
<span class='text_page_counter'>(47)</span><div class='page_container' data-page=47>

Tìm kiếm tuần tự…



 Nếu X = 51: Phép tìm kiếm được thực hiện như sau:



 Phép tìm kiếm trên khơng được thỏa


11 23 36 42 58 65 74 87 94 99 51


</div>
<span class='text_page_counter'>(48)</span><div class='page_container' data-page=48>

Tìm kiếm tuần tự…



Phân tích đánh giá:



Ở đây để đánh giá hiệu lực của pháp tìm kiếm ta



cũng dựa vào số lượng phép so sánh.



Ta thấy với giải thuật trên thuận lợi thì chỉ cần một



phép so sánh: C

min

= 1; còn xấu nhất thì C

max

= n+1.



Trường hợp xấu nhất cũng như trung bình, cấp độ



lớn của thời gian thực hiện giải thuật trên là O(n).



Thời gian trung bình nhỏ hơn nếu được sắp xếp



</div>
<span class='text_page_counter'>(49)</span><div class='page_container' data-page=49>

Nội dung



<b>Bài tốn tìm kiếm</b>


1



<b>Tìm kiếm tuần tự</b>



2



<b>Tìm kiếm nhị phân</b>


3



<b>Cây nhị phân tìm kiếm</b>


4



<b>Tìm kiếm dựa vào giá trị khóa</b>


</div>
<span class='text_page_counter'>(50)</span><div class='page_container' data-page=50>

Tìm kiếm nhị phân (Binary search)


Được sử dụng khi danh sách được sắp xếp theo thứ tự (tăng
dần)


Ta có một khóa trung bình là ktb và ta có:
Tb=(n+1)/2.


Tại mỗi bước ta chia nửa danh sách ra và giữ lại nửa chứa
khóa cần tìm bỏ nửa khơng chứa khóa.


</div>
<span class='text_page_counter'>(51)</span><div class='page_container' data-page=51>

Tìm kiếm nhị phân…



 Giải thuật:


Type Mg=array[1..1000] of integer;


Function binary_search(var k:Mg; x, n: integer):integer;


Var d, c, g: integer; found: boolean;


Begin


d := 1; c := n; found := false;
while not found and (d <= c) do
begin


g := (d + c) div 2;


if k[g] = x then found := true
else if x > k[g] then d := g + 1
else c := g - 1;


end;`


</div>
<span class='text_page_counter'>(52)</span><div class='page_container' data-page=52>

Tìm kiếm nhị phân…



Giải thuật viết dưới dạng đệ quy:



Function Loc(Var k: Mg; x, d, c: integer): integer;
Var g: integer;


Begin


if (d > c) then Loc := 0
else


begin



g := (d + c) div 2;


if k[g] = x then Loc := g
else if (k[g] > x) then


Loc := Loc(k, x, d, g - 1)
else Loc := Loc(k, x, g + 1, c)
end;


</div>
<span class='text_page_counter'>(53)</span><div class='page_container' data-page=53>

Tìm kiếm nhị phân…



Ví dụ: với dãy khóa:



Nếu x = 23: Phép tìm kiếm được thỏa mãn và các



bước sẽ như sau:



Tìm thấy x = 23 ở vị trí thứ 2

phép tìm kiếm được



thỏa mãn



11 23 36 42 58 65 74 87 94 99


11 23 36 42 58 65 74 87 94 99


</div>
<span class='text_page_counter'>(54)</span><div class='page_container' data-page=54>

Tìm kiếm nhị phân…



Nếu x = 71: Phép tìm kiếm khơng thỏa các bước



thực hiện như sau:




Phép tìm kiếm khơng được thỏa



</div>
<span class='text_page_counter'>(55)</span><div class='page_container' data-page=55>

Tìm kiếm nhị phân…



Phân tích đánh giá:



Ta thấy số lượng phép tốn so sánh phụ thuộc vào x.



Độ phức tạp tính tốn của giải thuật tìm kiếm nhị phân trong



trường hợp tốt nhất là:O(1), trong trường hợp xấu nhất là


O(log

2

n) trong trường hợp trung bình cũng là O(log

2

n).



Rõ ràng là so với tìm kiếm tuần tự, chi phí tìm kiếm nhị phân



ít hơn khá nhiều.



Tuy nhiên ta cũng không nên quên rằng trước khi sử dụng tìm



kiếm nhị phân dãy khóa đã phải được sắp xếp rồi, nghĩa là


thời gian chi phí cho sắp cũng phải kể đến.



Nếu dãy khóa ln biến động (được bổ sung thêm hoặc loại



</div>
<span class='text_page_counter'>(56)</span><div class='page_container' data-page=56>

Nội dung



<b>Bài tốn tìm kiếm</b>


1




<b>Tìm kiếm tuần tự</b>


2



<b>Tìm kiếm nhị phân</b>


3



<b>Cây nhị phân tìm kiếm</b>


4



<b>Tìm kiếm dựa vào giá trị khóa</b>


</div>
<span class='text_page_counter'>(57)</span><div class='page_container' data-page=57>

Cây nhị phân tìm kiếm (binary


search tree)



 Định nghĩa:


 Cây nhị phân tìm kiếm là cây nhị phân mà khóa tại mỗi nút cây lớn hơn khóa khác của tất cả các nút


thuộc cây con bên trái,và nhỏ hơn tất cả các nút thuộc cây con phải.


 Ví dụ:


Duyệt theo thứ tự giữa ta sẽ
thu được một dãy tăng dần là:
17, 25, 34, 50, 66, 68, 71, 94



71
66


34


17


50
25


</div>
<span class='text_page_counter'>(58)</span><div class='page_container' data-page=58>

Cây nhị phân tìm kiếm…



Đối với một cây nhị phân tìm kiếm để tìm xem một khóa



X nào đó có trên cây đó khơng ta thực hiện các bước sau:



So sánh X với khóa gốc sẽ xảy ra 1 trong 4 trường hợp :



1. Khơng có gốc (cây rỗng): X khơng có trên cây,cho nên phép tìm


kiếm khơng thỏa.


2. X trùng với khóa gốc, phép tìm kiếm đươc thỏa.


3. X nhỏ hơn khóa gốc, thì ta xét cây con trái của gốc,và cứ tiếp


tục so sánh với khóa gốc.


4. X lớn hơn khóa gốc ta xét cây con phải của gốc,cây con phải là



</div>
<span class='text_page_counter'>(59)</span><div class='page_container' data-page=59>

Cây nhị phân tìm kiếm…



Ví dụ: Nếu X = 68 ta thực hiện như sau:



71
66
94
34
17
50
25
68


1. So sánh X với 34, X >34 ta
chuyển sang cây con phải.
2. So sánh X với 66, X >66 ta


chuyển sang cây con phải.
3. So sánh X với 71, X<71 ta


chuyển sang cây con trái.


4. So sánh X với 68, X=68 vậy
tìm kiếm được thỏa.


34


66


71



</div>
<span class='text_page_counter'>(60)</span><div class='page_container' data-page=60>

Cây nhị phân tìm kiếm…



Ngồi phép tìm kiếm được thỏa,cịn có một số



trường hợp phép tìm kiếm khơng thỏa. Khi đó


ta bổ sung ln X vào cây nhị phân tìm kiếm.



</div>
<span class='text_page_counter'>(61)</span><div class='page_container' data-page=61>

Cây nhị phân tìm kiếm…



Type Tree = ^Node; Node = record
Info: integer; Left, Right: Tree;
end;


Procedure Them(var T: Tree; x: integer);
Begin


if T = NIL then begin
new(T);


T^.Info:= x;


T^.Left:= NIL; T^.Right:= NIL;
end


else if x < T^.Info then Them(T^.Left, x)


</div>
<span class='text_page_counter'>(62)</span><div class='page_container' data-page=62>

Cây nhị phân tìm kiếm…



Với giải thuật trên ta có thể dựng được cây nhị



phân tìm kiếm ứng với một dãy khóa đưa vào bằng


cách liên tục bổ sung các nút ứng với từng khóa,


bắt đầu từ một cây rỗng.



</div>
<span class='text_page_counter'>(63)</span><div class='page_container' data-page=63>

Cây nhị phân tìm kiếm…



42 23 74 11 65 94


42


23 74


65 94


</div>
<span class='text_page_counter'>(64)</span><div class='page_container' data-page=64>

Cây nhị phân tìm kiếm…



Nhận xét:



Với giải thuật này cấp độ lớn của thời gian thực hiện



</div>
<span class='text_page_counter'>(65)</span><div class='page_container' data-page=65>

Cây nhị phân tìm kiếm…



Loại bỏ trên cây nhị phân tìm kiếm:



Phép loại bỏ trên cây nhị phân tìm kiếm khơng đơn



giản như phép bổ sung hay phép tìm kiếm.



Muốn xóa một giá trị trong cây nhị phân tìm kiếm




</div>
<span class='text_page_counter'>(66)</span><div class='page_container' data-page=66>

Loại bỏ trên cây nhị phân tìm kiếm



Nút D là nút lá, trường hợp này ta chỉ việc đem mối nối



cũ trỏ tới nút D (từ nút cha của D) thay bởi nil, và giải


phóng bộ nhớ cấp cho nút D.



4


1


2


5
3


6


</div>
<span class='text_page_counter'>(67)</span><div class='page_container' data-page=67>

Loại bỏ trên cây nhị phân tìm kiếm…



Nút D chỉ có một nhánh con, khi đó ta đem gốc của nhánh



con đó thế vào chỗ nút D, tức là chỉnh lại mối nối: Từ nút cha


của nút D không nối tới nút D nữa mà nối tới nhánh con duy


nhất của nút D. Cuối cùng, ta giải phóng bộ nhớ đã cấp cho



nút D

<sub>4</sub>


1



2


3


5


</div>
<span class='text_page_counter'>(68)</span><div class='page_container' data-page=68>

Loại bỏ trên cây nhị phân tìm kiếm…



 Nút D có cả hai nhánh con trái và phải, khi đó có hai cách đều làm
hợp lý cả:


 Hoặc tìm nút chứa khóa lớn nhất trong cây con trái, đưa giá trị chứa


trong đó sang nút D, rồi xóa nút này.


4


1


2


6
3


5


</div>
<span class='text_page_counter'>(69)</span><div class='page_container' data-page=69>

Loại bỏ trên cây nhị phân tìm kiếm…



 Hoặc tìm nút chứa khóa nhỏ nhất trong cây con phải, đưa giá trị chứa



trong đó sang nút D, rồi xóa nút này.


4


1


2


6
3


5


</div>
<span class='text_page_counter'>(70)</span><div class='page_container' data-page=70>

Loại bỏ trên cây nhị phân tìm


kiếm…



 <b>Procedure </b> xoa(var p: nut);
 <b> Var </b>


 <b> </b>q,p1:nut;
 Begin


 if (p^.right=NIL) then
 begin


 q:=p;
 p:=p^.left;
 end


 else if (p^.left=NIL) then


 begin


 q:=p;


 p:=p^.right;
 end else


 begin


 q:= p^.left;
 if q^.right=NIL then
 begin


 p^.key:=q^.key;
 p^.left:=q^.left;
 end else begin


</div>
<span class='text_page_counter'>(71)</span><div class='page_container' data-page=71>

Nội dung



<b>Bài tốn tìm kiếm</b>


1



<b>Tìm kiếm tuần tự</b>


2



<b>Tìm kiếm nhị phân</b>


3




<b>Cây nhị phân tìm kiếm</b>


4



<b>Tìm kiếm dựa vào giá trị khóa</b>


</div>
<span class='text_page_counter'>(72)</span><div class='page_container' data-page=72>

<b>Giới thiệu phương pháp:</b>



 Phương pháp tìm kiếm này dựa vào bản thân giá trị của từng


khoá.


<b>Nội dung phương pháp:</b>



Thiết lập một hàm địa chỉ h(k) thực hiện phép ánh xạ tập các giá trị


của k lên bảng địa chỉ (các số nguyên từ 0 → m-1 trong đó m là độ
dài của bảng). Như vậy ta ln có 0≤ h(k)≤ m. Giá trị của h(k) sẽ
được sử dụng khi lưu trữ và tìm kiếm




</div>
<span class='text_page_counter'>(73)</span><div class='page_container' data-page=73>

<b>Ví dụ: </b>





Xét bản ghi chứa các khóa sau:
1090, 1342, 6907 và 6498
chọn 3 chữ số cuối của mỗi


bản ghi làm địa chỉ đặc


chưng cho mỗi bản ghi thì
ta có:




1090

1090

090

090





1342

1342

342

342





6907

6907

907

907





6498

6498

498

498



</div>
<span class='text_page_counter'>(74)</span><div class='page_container' data-page=74>

 Khi đó thì khóa được đặc chưng bởi địa chỉ của nó cịn địa chỉ sẽ được sự


dụng cho khóa.


 Tuy nhiên có những trường hợp thì các địa chỉ trùng nhau dù các bản ghi


có khóa khác nhau theo cách chọn địa chỉ như trên vì thế ta cần khắc phục
đụng độ!!!





</div>
<span class='text_page_counter'>(75)</span><div class='page_container' data-page=75>

<b>Hàm rải:</b>

<b> có ba phương pháp:</b>




- phương pháp phân đoạn


- phương pháp chia



</div>
<span class='text_page_counter'>(76)</span><div class='page_container' data-page=76>

<b>Phương pháp phân đoạn</b>

:



Được áp dụng khi khóa có kích thước lớn và thay đổi!!! Chúng


ta chia khóa thành nhiều đoạn bằng nhau và có độ dài bằng độ


dài của địa chỉ!





</div>
<span class='text_page_counter'>(77)</span><div class='page_container' data-page=77>

<b>Các kỹ thuật trong phân đoạn:</b>




-

Tách: tách các đoạn ra, xếp mỗi đoạn thành một hàng, dóng



thẳng theo đầu trái hoặc đầu phải.



- Gấp: gấp các đoạn lại theo đường biên tương tự như gấp giấy.


Các chữ số rơi vào cùng một chỗ được đặt thành hàng dóng


thẳng với nhau.



- Sau đó thì các đoạn đó được kết hợp theo một cách nào đó.



</div>
<span class='text_page_counter'>(78)</span><div class='page_container' data-page=78>

<b>Ví dụ: </b>






Cho khóa có giá trị như sau: 19188772



+ Bằng phương pháp tách đoạn ta phân khóa thành ba đoạn


bằng nhau theo tứ tự từ phải qua trái:



772


+ 118


019


909



Và ta chọn 909 là địa chỉ của khóa ban đầu!



</div>
<span class='text_page_counter'>(79)</span><div class='page_container' data-page=79>





+ Bằng phương pháp gấp thì ta có:



277



+ 188



910



1375



Và khi này thì ta có thể chọn theo nhiều cách để được địa chỉ,



có thể như: 137, 375 làm địa chỉ rải !!!



</div>
<span class='text_page_counter'>(80)</span><div class='page_container' data-page=80>

<b>Phương pháp băm:</b>





</div>
<span class='text_page_counter'>(81)</span><div class='page_container' data-page=81>

<b>Phương pháp chia:</b>





-

Lấy số dư của phép chia giá trị khố cho kích thước m của


bảng rải để làm địa chỉ rải. Nghĩa là: h(k) = k mod m.



- Thông thường: Chọn m* là số nguyên tố, gần m và nhỏ hơn m


để thay cho m. Tức là h(k) = k mod m* để khắc phục hiện



</div>
<span class='text_page_counter'>(82)</span><div class='page_container' data-page=82>

- Ví dụ:



- Ví dụ:

Với m*=997

:

<sub>:</sub>



423
Giá trị khóa


5042 417


7042


402
0402



</div>
<span class='text_page_counter'>(83)</span><div class='page_container' data-page=83>

83


<b>Tìm Kiếm Dựa Vào Khóa</b>



<b>Tìm Kiếm Dựa Vào Khóa</b>



<b>Phương pháp nhân:</b>



-

Giá trị khố được nhân với chính nó, sau đó lấy con số bao



gồm một số chữ số ở “giữa” kết quả để làm địa chỉ rải.


- Ví dụ:





K
5402
0367
1426
K2
29181604
00134689
02033476


H(K) gồm 3
chữ số
181 hoặc 816
134 hoặc 346
033 hoặc 334



</div>
<span class='text_page_counter'>(84)</span><div class='page_container' data-page=84>

<b>Khắc phục đụng độ:</b>



Có nhiều cách khắc phục đụng độ nhưng chúng ta chỉ


nghiên cứu:



</div>
<span class='text_page_counter'>(85)</span><div class='page_container' data-page=85>

<b>Phương pháp địa chỉ mở</b>

:



Phương pháp địa chỉ mở đơn giản nhất là phương pháp thử


tuyến tính.



Hiện tượng đụng độ khắc phục bằng cách:



- Xét xem vị trí bên cạnh vị trí bận.



- Nếu vị trí đó trống thì đưa bản ghi mới vào.



<b> - </b>

Nếu bận thì tiếp tục tìm kiếm tuần tự, nếu đã tới cuối (đầu)



bảng thì phải quay lại đầu (cuối) cho tới khi tìm được chỗ


trống hoặc đã quay lại vị trí cũ mà khơng tìm thấy một chỗ



trống nào khi đó ta nói bảng rơi vào tình trạng tràn.



<i><b> </b></i>



</div>
<span class='text_page_counter'>(86)</span><div class='page_container' data-page=86>

<b>Ví dụ:</b>



</div>
<span class='text_page_counter'>(87)</span><div class='page_container' data-page=87>

548


548 <sub>228</sub>228<sub>228</sub>228 <sub>503</sub>503 <sub>727</sub>727 <sub>983</sub>983 <sub>249</sub>249 <sub>491</sub>491



V<sub>7</sub>
V<sub>0</sub>
V<sub>4</sub>
V<sub>5</sub>
V<sub>2</sub>
V<sub>3</sub>
V<sub>6</sub>


V<sub>1</sub> Trống nên 548 được sếp vàoTrống nên 548 được sếp vào


Trống nên 228 được sếp vào


Trống nên 228 được sếp vào


Trống nên 503 được sếp vào


Trống nên 503 được sếp vào


V<sub>6</sub> bận nên chuyển xuống V<sub>7</sub>




V<sub>6</sub> bận nên chuyển xuống V<sub>7</sub>




Trống nên 983 được sếp vào


Trống nên 983 được sếp vào



V<sub>4</sub> bận nên chuyển xuống V<sub>5</sub>




V<sub>4</sub> bận nên chuyển xuống V<sub>5</sub>




Trống nên 491được sếp vào


Trống nên 491được sếp vào


548


548 <sub>228</sub>228<sub>228</sub>228 <sub>503</sub>503 <sub>727</sub>727 <sub>983</sub>983 <sub>249</sub>249 <sub>491</sub>491
548


548 <sub>228</sub>228<sub>228</sub>228 <sub>503</sub>503 <sub>727</sub>727 <sub>983</sub>983 <sub>249</sub>249 <sub>491</sub>491
548


</div>

<!--links-->

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

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