More Related Content
U.cs101 алгоритм программчлал-12 Лекц 7 (Давталтуудын Си хэлэнд) U.cs101 алгоритм программчлал-7 What's hot (20)
U.cs101 алгоритм программчлал-2 U.cs101 алгоритм программчлал-13 C++ vndsen oilgolt хичээл 1 U.cs101 алгоритм программчлал-5 zasvar badral(1) U.cs101 алгоритм программчлал-4-zasah U.cs101 laboratory 11 (1) си хэлний хичээлүүд 11 р анги Viewers also liked (19)
U.cs101 алгоритм программчлал-1(1) U.cs101 алгоритм программчлал-15 шатрын сургалтын технологи INNOMED-2015_Binderiya_Shutis Similar to U.cs101 алгоритм программчлал-14 (20)
Эрэмбэлэлт хайлтын аргууд u.cs101 "Алгоритм ба програмчлал" Лекц №5 U.cs101 алгоритм программчлал-3 U.cs101 алгоритм программчлал-5 өгөгдлийн санд боловсруулалт хийх U.cs101 алгоритм программчлал-14
- 1. ВИРТУАЛ ТЕХНОЛОГИЙН ТЭНХИМ,
Е-НЭЭЛТТЭЙ ИНСТИТУТ
Хайлтын алгоритм
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
www.emust.edu.mn
Лекц – 14
- 2. Агуулга:
01
Хайлтын тухай ойлголт
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
www.emust.edu.mn
01
02
02
Шугаман хайлт
03
2-тын хайлт
04 Шууд тэмдэгт мөрөөс хайх
- 4. Хайлтын тухай ойлголт
Өгсөн хүснэгтээс тодорхой шинж чанар бүхий элемэнтийг олох
бодлогыг хайлтын бодлого гэнэ. Хайлтын бодлогын энгийн
тохиолдол нь өгсөн утгатай тэнцүү элемент хаана байрлаж буйг
тогтоох бодлого юм. Бидэнд a[n] хүснэгт ба х гэсэн утга өгөгдсөн
байг. Тухайн хүснэгтээс a[i]=x нөхцөлийг хангах i гэсэн дугаарыг
ольё. Хайлтын бодлогын үр дүн нь дээрх нөхцөлийг хангах i, эсвэл
уг нөхцөлийг хангах элемент байхгүй гэсэн мэдээлэл болно.
Хэрвээ уг нөхцөлийг хангах элемент хэд хэд байвал хамгийн эхний
элементийн дугаарыг хариу болгож авна.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 5. Хайлтын олон арга байдаг бөгөөд хамгийн хялбар өргөн
хэрэглэгддэг аргууд нь шугаман ба хоёртын хайлт юм.
Компьютерийн программчлалд хамгийн их тохиолддог үйлдэл нь
хайлтын бодлого юм. Хайлтын бодлого гэдэг нь өгөгдсөн
аргумент x-тэй тэнцүү түлхүүр талбартай элементийг олох
зорилгыг агуулдаг. a[i].key = x – гэсэн нөхцөлийг хангаж байгаа I
индексийг ашиглан бусад талбарт хандах боломж бүрддэг. Бид
зөвхөн хайлтын бодлогыг сонирхож байгаа, мөн хайж байгаа
элементийн өгөгдлүүдийг анхаарах шаардлагагүй учраас Item
төрөл зөвхөн түлхүүр талбарыг агуулна гэж тооцъё.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 6. Шугаман хайлт
Энэ аргын үндсэн санаа нь хүснэгтийн элементүүдийг эхнээс нь
эхлэн өгсөн утгатай дэс дараалан жишиж өгсөн утгатай тэнцүү
элементийн дугаарыг олох явдал юм. Хэрвээ өгсөн утгатай тэнцүү
элемент олдохгүй байвал “Элемент байхгүй” гэсэн мэдээллийг
хэвлэнэ.Шугаман хайлтын биелэгдэх хугацааг T(n) гэвэл энэ нь
а[i]=x нөхцөлийг шалгах тоотой пропорциональ буюу T(n)=c*n=O(n)
байна гэдгийг хялбархан харж болно.
Массивын элементүүдийг дэс дараалан нэг, нэгээр авч харьцуулан
хайж байгаа элементтэй тэнцүү элемент олдох хүртэл, эсвэл бүх
элементүүдтэй харьцуулсан ч олдохгүй болох хүртэл хийгдэх
хайлтыг шугаман буюу дэс дараалсан хайлт гэнэ.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 7. Дараах 2 нөхцөл хайлтыг дуусгах нөхцөл болдог.
1. Хайж байгаа элемент олдсон бол a(i) = x
2. Бүх элементтэй харьцуулсан ч хайж байгаа элемент олдохгүй
бол
Үүний С хэл дээр илэрхийлбэл дараах байдалтай байна.
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 8. int i,n;
int index=-1;
n=17;
for (i=0;i<n;i++) {
cout<<”a[”<<i<<”]=”; cin >>a[i]; }
for (i=0;i<n;i++) {
if (a[i]==x) { index=i; break; }
}
return 0;
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
}
- 9. index хувьсагчид массивийн индексийн авах боломжгүй -1 гэсэн
утгыг хадгална. Дараа нь массивийн элементүүдтэй эхнээс нь
харьцуулж x-тэй тэнцүү элемент олдогц index хувьсагчид
массивийн индекс i-ийг хадгалаад давталтаас гарна. Давталт
дууссаны дараа index хувьсагчид -1 гэсэн утга хэвээр байвал
хайж байгаа элемент олдоогүй харин 0-
оос n-1-ийн хоорондох утга байвал хайж байгаа утга олдсон
бөгөөд түүний индекс нь энэ index хувьсагчид байна гэсэн үг.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 10. Энэ арга нь хайлтын хамгийн энгийн арга юм. Зөвхөн хайж буй
элемэнтийн утга мэдэгдэх бөгөөд түүний тухай болон хайлт
явуулах өгөгдлийн олонлогийн талаар ямар нэг нэмэлт мэдээлэл
байхгүй үед энэ аргыг ашиглана.
int LinearSearch (int a[],int x,int n)
{ for (int i = 0; i < n; i++)
if (a[i] == x) return i;
return -1;
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
}
- 11. Хоёртын хайлт
Өгсөн эрэмбэлэгдсэн хүснэгтээс x-тэй тэнцүү элементийг хайж
олоход бинар хайлтын аргыг хэрэглэх нь тохиромжтой юм. Энэ
аргын үндсэн санаа нь өгсөн хүснэгтийн голын элементтэй x
элементийг жишиж цаашид хүснэгтийн аль хэсэгт хайлт хийх ёстойг
тогтооно. Дараагийн алхамуудад x элемент оршиж болох хэсгийн
голын элементийг x-тэй жиших гэх мэтээр х-тэй тэнцүү элемент
олдох эсвэл уг утга өгсөн хүснэгтэд байхгүй гэдэг нь тогтоогдох
хүртэл жишилтийг давтан гүйцэтгэнэ.
Хайлт хийж байгаа массивийн өгөгдлийн талаар илүү мэдээлэл
байхгүй бол хайлтын хурдыг ихэсгэх ямар ч боломжгүй.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 12. Хэрэв массивын өгөгдөл эрэмбэлэгдсэн үед хайлтыг илүү үр
дүнтэй хурдан хийж болно. Жишээ нь утасны жагсаалт дээрх
хүний нэрс үсгийн дарааллаар биш бол аль нэг хүний утасны
дугаарыг олоход ашиглах боломжгүй байдаг.
Хэрэв а массив нь эрэмбэлэгдсэн бол түүний элементүүд дараах
нөхцөлийг хангасан байх ёстой. a[k], 0<k<N a[k-1]<a[k]
Массивын элементийн аль нэг элементийг санамсаргүйгээр авч
түүнийг хайж байгаа x аргументтай харьцуулж х-тэй тэнцүү бол
хайлт дуусдаг;
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 13. хэрэв массивын элемент нь х-ээс бага бол м-ээс бага буюу
тэнцүү бүх индексийг дараагийн хайлтаас хасдаг бол,
массивын элемент нь х-ээс их бол м-ээс их буюу тэнцүү бүх
индексийг хайлтаас хасаж элемент олдох буюу олдохгүй нь
тодорхой болтол үргэлжлүүлэн хайдаг. Ийм зарчмаар хайх
хайлтыг 2-тын хайлт гэдэг. Энэ хайлтад индекс хадгалах
зориулалттай а массивийн хэсэг элементийн зүүн баруун
төгсгөлийг хадгалдаг L ба R гэсэн 2 хувьсагчийг ашигладаг.
L=0; R=N-1; found = false;
while (L<R && ! found) {
m=L ба R-ийн хоорондох аль нэг утга
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 14. if (a[m]==x) found = true;
if (a[m]<x) l=m+1; else r=m-1;
}
Давталтын алхам бүрийн өмнө дараах нөхцөл хангагдана
(L<R) && (a[k]: 0<k<L: a[k]<x ) && (a[k]: R<k<N: a[k]>x)
Үүн дээр found логик хувьсагчийг нэмбэл
found || ((L<R) && (a[k]: 0<k<L: a[k]<x ) && (a[k]: R<k<N:
a[k]>x)) болно.
M хувьсагчийн анхны утгыг дураараа сонгох бөгөөд энэ
алгоритмын зөв ажиллах эсэхэд нөлөөлөхгүй.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 15. Гэхдээ үр ашигтай байдалд нөлөөлнө. Дараагийн хайлтыг хийх
хэсэг бүрт боломжийн хэрээр олон алхам бүрт хасах нь энэ аргын
гол зорилго бөгөөд харьцуулалтын үр дүн ямар байх нь чухал биш
юм. Хайлтын нийт алхмын харьцуулалтын дээд хэмжээ нь log2N -
ийн утгыг ойролцоох бүхэл тоотой тэнцүү байна. Иймээс энэ
алгоритм нь дэс дараалсан хайлтаас огцом сайжирч хайлтын тоо
нь бараг N/2 болж ирдэг.
Энд 2 if командыг сольсноор алгоритмыг үр ашигтай болгож
болно. Тэнцүү эсэхийг шалгах үйлдэл нь нэг л удаа хийгдэж
төгсөх нөхцөлд хүрдэг тул энэ үйлдлийг нь хоёр дох буюу
сүүлийнх болгож болно.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 16. Гэсэн ч илүү холбогдолтой асуулт нь дэс дараалсан хайлтанд
элемент олдсон үед шууд төгсгөх нөхцөлийг нэмэх явдал юм.
Хайж байгаа элементтэй тэнцүү элемент олдмогц хайлтыг
дуусгах нь арай хурдан хайлтын алгоритм болгон хувиргах
боломжийг нээдэг. Алхмын тоо нь log2N байна. Хайлт бүх
массивын элементийг шалгах хүртэл үргэлжилнэ.
L=0; R=N;
while (L<R) {
m=(L+R)/2;
if (a[m]<x) L=m+1; else R=m;
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
}
- 17. L<R нь төгсөх нөхцөл юм. Энэ нөхцөл биелэх нь баталгаатай
юу? Алхам бүрт R ба L-ын зөрөө нь багассан нөхцөл
байдлуудын үр дүнг үзүүлэх нь энэ баталгааг хангана. L<R
нөхцөлийг нь алхам бүрийн эхэнд шалгана. L, R-ын
арифметик дундаж нь m нь L<m<R байна. Ингээд L,R-ын
зөрөө L-д m+1 эсвэл R-д m-д олгоход багасаж L=R болоход
давталт дуусна. L=R нөхцөл хангагдсан үед хайсан элемент
олдохгүй байж болно. Мэдээж R=N болсон үед хайсан
элемент олдохгүй байна гэсэн үг. Эсрэг тохиолдолд a[R]
элемент хэзээ ч харьцуулахгүй байж болно. Мөн a[R]=x гэсэн
нөхцөлийг нэмнэ.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 18. Х нь дундаж элемэнт буюу голын элемэнтээс бага бол уг массив
эрэмбэлэгдсэн гэдгийг тооцоод голын элемэнтээс баруун тийш
байрлах бүх элемэнтүүдийг хяналтаас хасах ба энэ аргыг
массивын голын элемэнтээс зүүн гар талд орших хэсэгт хэрэглэх,
Х нь дундаж элемэнт буюу голын элемэнтээс их бол уг массив
эрэмбэлэгдсэн гэдгийг тооцоод голын элемэнтээс зүүн тийш
байрлах бүх элемэнтүүдийг хяналтаас хасах ба энэ аргыг
массивын голын элемэнтээс баруун гар талд орших хэсэгт
хэрэглэх маягаар 2-тын хайлт хийгддэг.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 19. Шууд тэмдэгт мөрөөс хайх
S тэмдэгт мөрт байгаа текстээс p гэсэн хэв загвар буюу үгийг
хайхыг шууд тэмдэгт мөрөөс хайх гэнэ. Энэ нь бүх текст
боловсруулах системийн үндэс нь энэ үйлдэл болдог бөгөөд энэ
бодлогыг шийдэх үр дүнтэй алгоритмыг олох сонирхолтой
байдаг. Шууд тэмдэгт мөрөөс хайх тооцооллыг гүйцэтгэх
алгоритмыг тодорхойлохоос өмнө шаардлагатай хайлтын үр дүнг
томъёолно. p[i][j] = a[k] : 0<k<j si+k = pk
Харьцуулалтын үйлдлийн давталт хэлбэрээр томъёолбол:
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 20. i=-1;
do { i++;
found = P(i,M);
} while(found || (i=N-M))
P-г тооцоолох нь үсэг тус бүрийн харьцуулах үйлдлийн давталт
хэлбэрээр жинхэнэ үр дүн гарна. Мөн дахин давталт дотор
сайжруулалтыг хийж болно.
i = -1;
j=0;
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 21. do while {
while (j < M) & (s[i+j] = p[j]) {
(* P(i, j+1) *) j++ }
(* Q(i) & P(i, j) && ((j ==M) || (s[i+j] != p[j])) *)
while(j == M) || (i == N-M);
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 22. Тэмдэгт мөрөөс хайх Кнут, Моррис, Праттын хайлт
Тэмдэгт мөрөөс хайх нэг алгоритмыг Кнут, Моррис, Пратт
боловсруулжээ. Энэ алгоритм нь тэмдэгт мөрийн эхнээс хайх
бүрт дараагийн загварыг(pattern) харьцуулж эхлэхийг ажигласан
ажиглалт дээр тулгуурлан үүсчээ. Өмнөх харьцуулалтаас
цугларсан мэдээллийг орхиж болно. Тэмдэгт мөрийн харгалзах
үсгүүдтэй загварын эхнээс хэсэгчлэн таарсны(тохирсны) дараа
текст бүхий тэмдэгт мөрөөс өмнөөс нь илүү хурдан хайхад
ашиглагдах зарим өгөгдлийг эмхтгэн цуглуулах ёстой.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 23. Доогуур нь зурсан үг нь харьцуулсан үгс юм. Харьцуулсан 2
үсэг зөрөх бүрт загварыг шууд шилжүүлдэг бөгөөд бага
хэмжээний үгийг шилжүүлсэн хэсгүүд нь бүтэн таарсан
тохирол биш юм.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 24. i=0; j=0;
while(j < M) && (i < N)
{
/* Q(i-j) && P(i-j, j) */
WHILE (j >= 0) & (s[i] == p[j]) {j := D } ;
i++; j++;
}
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 25. Энэ томъёолол нь үнэнийг хэлэхэд яг бүрэн биш, учир нь D гэсэн
тодорхойлогдоогүй шилжилтийн утгыг агуулж байна. Үүнийг бид
товчхон авч үзнэ. Гэвч эхлээд Q(i-j) ба P(i-j, j)-ийн нөхцөлийг ерөнхий
тогтмол болгон ашиглах ба үүн дээр 0<i<N ба 0<j<M хамаарлыг нэмж
болно. Текст доторх тэмдэгтийн эхний загварын тухайн үеийн
байрлалыг дандаа тэмдэглэдэг гэсэн ойлголтыг орхихыг бидэнд санал
болгож байна. Илүүтэйгээр загварын байрлалын зэрэгцүүлэлт нь одоо
i-j болно. Хэрэв j=M болоход алгоритм төгсөх бөгөөд P(i-M, M)-
тогтмолын хэрэглээ болох P(i-j, j) элемент нь i-M байрлалд олдсон үг
байдаг.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
- 26. Эсрэг тохиолдолд i = N нөхцөлөөр дуусах бөгөөд j < M үед Q(i)
тогтмол нь ямар ч үг олдсонгүй гэдгийг илэрхийлдэг. Энэ
тогтмолыг энэхүү алгоритм хэзээ ч өөрчилдөггүй.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ