Vous êtes sur la page 1sur 34

ВИРТУАЛ ТЕХНОЛОГИЙН ТЭНХИМ,

Е-НЭЭЛТТЭЙ ИНСТИТУТ

Алгоритм ба програмчлал

Лекц - 12

www.emust.edu.mn
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Агуулга:

01 Хайлтын алгоритмууд
01
02
02 Шугаман хайлт

03 Хоёртын хайлт

04 Алгасах хайлт

05 Интерполяцийн Хайлт

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


www.emust.edu.mn
Хайлтын тухай ойлголт

Өгсөн хүснэгтээс тодорхой шинж чанар бүхий элемэнтийг олох


бодлогыг хайлтын бодлого гэнэ.
Хайлтын бодлогын энгийн тохиолдол нь өгсөн утгатай тэнцүү
элемент хаана байрлаж буйг тогтоох бодлого юм.
Бидэнд a[n] хүснэгт ба х гэсэн утга өгөгдсөн байг. Тухайн хүснэгтээс
a[i]=x нөхцөлийг хангах i гэсэн дугаарыг ольё.
Хайлтын бодлогын үр дүн нь дээрх нөхцөлийг хангах i, эсвэл уг
нөхцөлийг хангах элемент байхгүй гэсэн мэдээлэл болно.
Хэрвээ уг нөхцөлийг хангах элемент хэд хэд байвал хамгийн эхний
элементийн дугаарыг хариу болгож авна.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Шугаман хайлт /Linear search/

Энэ арга нь хайлтын хамгийн энгийн арга юм. Зөвхөн хайж буй
элементийн утга мэдэгдэх бөгөөд олон хайлт явуулах өгөгдлийн
олонлогийн талаар ямар нэг мэдээлэл байхгүй үед энэ аргыг
ашиглана.
Энэ аргын үндсэн санаа нь хүснэгтийн элементүүдийг эхнээс нь эхлэн
өгсөн утгатай дэс дараалан жишиж өгсөн утгатай тэнцүү элементийн
дугаарыг олох явдал юм.
Массивын элементүүдийг дэс дараалан нэг, нэгээр авч харьцуулан
хайж байгаа элементтэй тэнцүү элемент олдох хүртэл, эсвэл бүх
элементүүдтэй харьцуулсан ч олдохгүй болох хүртэл хийгдэх хайлтыг
шугаман буюу дэс дараалсан хайлт гэнэ

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Шугаман хайлт
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8
утга
30 60 6 54 89 23 38 55 1
23

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Шугаман хайлт
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8
утга
30 60 6 54 89 23 38 55 1
23

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Шугаман хайлт
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8
утга
30 60 6 54 89 23 38 55 1
23

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Шугаман хайлт
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8
утга
30 60 6 54 89 23 38 55 1
23

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Шугаман хайлт
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8
утга
30 60 6 54 89 23 38 55 1
23

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Шугаман хайлт
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8
утга
30 60 6 54 89 23 38 55 1

Элемент олдлоо. 23

Буцаах утга: 5

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Шугаман хайлт

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Шугаман хайлт
Гарах үр дүн:
#include <iostream> Hailtiin ur dun
using namespace std; arr[5]=23
int main()
{
int i,x;
int arr[]={30, 60, 6, 54, 89, 23, 38, 55, 1};
x=23;
cout<<"Hailtiin ur dun"<<endl;
for (i = 0; i < 8; i++) {
if (arr[i] == x)
cout<<"arr["<<i<<"]="<<arr[i];}
}

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Хоёртын хайлт /Binary search/
Өгсөн эрэмбэлэгдсэн хүснэгтээс x-тэй тэнцүү элементийг хайж олоход
бинар хайлтын аргыг хэрэглэх нь тохиромжтой юм.
Энэ аргын үндсэн санаа нь өгсөн хүснэгтийн голын элементтэй x
элементийг жишиж цаашид хүснэгтийн аль хэсэгт хайлт хийх ёстойг
тогтооно.
Дараагийн алхамуудад x элемент оршиж болох хэсгийн голын
элементийг x-тэй жиших гэх мэтээр х-тэй тэнцүү элемент олдох эсвэл
уг утга өгсөн хүснэгтэд байхгүй гэдэг нь тогтоогдох хүртэл жишилтийг
давтан гүйцэтгэнэ.
Хайлт хийж байгаа массивийн өгөгдлийн талаар илүү мэдээлэл байхгүй
бол хайлтын хурдыг ихэсгэх ямар ч боломжгүй.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Хоёртын хайлт /Binary search/
Хоёртын хайлт буюу таллан хуваах арга нь Шугаман хайлттай
харьцуулбал илүү үр дүнтэй аргын нэг юм.
Энэ арга нь өгөгдлийг 2 хэсэгт хуваан, хайх элемент аль хэсэгт
байгааг тодорхойлдог.

Энэ аргын үндсэн санаа нь:


1. Хайх элемент буюу Х тоо массивын дундаж элемент мөн үү
гэдгийг шалгах явдал юм. Хэрэв энэ нь үнэн бол бодлогын шийд
олдсон гэсэн үг.
2. Хэрэв тийм биш бол 2 тохиолдол байна.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Хоёртын хайлт /Binary search/
а. Х нь дундаж элемент буюу голын элементээс бага бол уг массив
эрэмбэлэгдсэн гэдгийг тооцоод голын элементээс баруун тийш
байрлах бүх элементүүдийг хасах ба голын элементийн зүүн талд
орших хэсэгт хэрэглэх
Б. Х нь дундаж элемент буюу голын элементээс их бол уг массив
эрэмбэлэгдсэн гэдгийг тооцоод голын элементээс зүүн тийш
байрлах элементийг хасаад массивын баруун талд орших хэсэгт
хэрэглэх

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Хоёртын хайлт /Binary search/
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8 9
утга
1 2 10 23 24 50 66 73 74 89

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Хоёртын хайлт /Binary search/
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8 9
утга
1 2 10 23 24 50 66 73 74 89

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Хоёртын хайлт /Binary search/
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8 9
утга
1 2 10 23 24 50 66 73 74 89

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Хоёртын хайлт /Binary search/
Хайх утга:

23
Хайлт явуулах олонлог:
i 0 1 2 3 4 5 6 7 8 9
утга
1 2 10 23 24 50 66 73 74 89
Элемент олдлоо.

Буцаах утга: 3

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Хоёртын хайлт /Binary search/
#include <iostream>
#include<conio.h>
using namespace std;
int main()
{
int n, i, arr[50], search, first, last, middle;
cout<<"Massiviin hemjeeg oruul :";
cin>>n;
cout<<n<<" elementtei massiv oruulna :"<<endl;
for (i=0; i<n; i++) {
cout<<"arr["<<i<<"]= ";
cin>>arr[i]; }

https://codescracker.com/cpp/program/cpp-program-binary-search.htm
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Хоёртын хайлт /Binary search/
cout<<"Haih toog oruul:";
cin>>search;
first = 0;
last = n-1;
middle = (first+last)/2;
while (first <= last)
{
if(arr[middle] < search) {
first = middle + 1; }
else if(arr[middle] == search) {
cout<<search<<" bairshil olloo "<<middle+1<<endl;
break; }
else {

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Хоёртын хайлт /Binary search/
else {
last = middle - 1; }
middle = (first + last)/2; }
if(first > last) {
cout<<"Oldsongui "<<search<<" massivd iim too alga"; }
getch();
}
Гарах үр дүн:
Massiviin hemjeeg oruul :10
10 elementtei massiv oruulna :
arr[0]=1 arr[4]= 24 arr[8]= 74
arr[1]= 2 arr[5]= 50 arr[9]= 89
arr[2]= 10 arr[6]= 66 Haih toog oruul:23
arr[3]= 23 arr[7]= 73 23 bairshil olloo 4
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Алгасах хайлт /Jump search/
Алгасах хайлт нь нь эрэмблэгдсэн алгоритм дээр ажилладаг алгоритм юм.
Алгасах хайлтыг өөрөөр блок хайлт /Block search/ гэж нэрлэдэг.
Алгасах хайлтийг ойлгохын тулд доорх жишээг харцгаая.

Эрэмблэгдсэн массиваас 13 гэсэн тоог хайя


i 0 1 2 3 4 5 6 7 8
утга
0 1 1 2 3 5 8 13 21

Массивын хэмжээ n=9


Алгасах хайхлтын үсрэх хэмжээг тогтоох: m=sqrt(9) =3

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгасаж хайх /Jump search/
13 тэнцүү тоог агуулсан элементийг олох хүртэл 4 алхмаар үсрэх хэрэгтэй
i 0 1 2 3 4 5 6 7 8
утга
0 1 1 2 3 5 8 13 21

21>13 учир шугаман хайлт хийж олно


i 0 1 2 3 4 5 6 7 8
утга
0 1 1 2 3 5 8 13 21

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгасах хайлт /Jump search/
Дараах массивыг авч үзье:
[0, 1, 5, 8, 10, 14, 17, 19, 24, 32, 39, 59, 60, 64, 86, 98].
Массивын урт 16 байна. 39 гэсэн утгыг хайж олохдоо Алгасах хайлт нь
хайлтыг 4 үсрэж хайхаар тооцоолно. Доорх алхамуудаар хайлт хийнэ.

Алхам 1: индекс 0-ээс индекс 4-ээс үсэрнэ.


Алхам 2: 4-р индексээс индекс 8-ээс үсэрнэ;
Алхам 3: 8-р индексээс 16-р индекс рүү үсэрнэ;
Алхам 4: 16-р индекс дэх элемент нь 39-өөс их учраас индекс 9 рүү үсэрч
алхамаа буцаана.
Алхам 5: Элементийг авахын тулд 9-р индексээс шугаман хайлт хийнэ.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгасах хайлт /Jump search/
#include <iostream>
#include <math.h>
using namespace std;
int jumpSearch(int arr[], int x, int n)
{
int step = sqrt(n);
int prev = 0;
while (arr[min(step, n)-1] < x)
{
prev = step;
step += sqrt(n);
if (prev >= n)
return -1;
} https://www.beginnersbook.in/jump-search-algorithm/
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Алгасах хайлт /Jump search/
while (arr[prev] < x)
{
prev++;
if (prev == min(step, n))
return -1;
}
if (arr[prev] == x)
return prev;
return -1;
}

https://www.beginnersbook.in/jump-search-algorithm/
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Алгасах хайлт /Jump search/
int main()
{
int arr[] = {0,1,5,8,10,14,17,19,24,32,39,59,60,64,86,98};
int x;
cout<<"Enter number to be search: ";
cin>>x;
int n = sizeof(arr) / sizeof(arr[0]);
int index = jumpSearch(arr, x, n);
cout << "\nNumber " << x << " is at index " << index;
return 0;
}
Гарах үр дүн:
Enter number to be search: 39
Number 39 is at index 10 https://www.beginnersbook.in/jump-search-algorithm/
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Интерполяцийн Хайлт /Interpolation Search/
Интерполяцийн Хайлт нь тохиолдлуудад хоёртын хайлтыг сайжруулсан
бөгөөд ялгаатай нь массив дахь утгууд нь жигд тархсан байдаг.

Хоёртын хайлт үргэлж дунд элемент уруу шалгадаг.

Интерполяцын хайлт нь хайж олох түлхүүр утгын дагуу өөр өөр байршилд
очиж болно.

Жишээлбэл, түлхүүр утга сүүлчийн элемент рүү ойртсон бол интерполяцын


хайлт төгсгөл талаас хайж эхэлнэ.

https://www.geeksforgeeks.org/interpolation-search/
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Интерполяцийн Хайлт /Interpolation Search/
Туршилт хийх байрлалыг олохын тулд дараах алхамаар хайна.

Алхам1: Давталтанд "пост" утгыг шалгалт тохируулгын албан томъёог


ашиглан тооцоолно.
Алхам2: Хэрэв энэ нь таарч байгаа бол тухайн зүйлийн индексийг буцааж,
гарах.
Алхам 3: Хэрэв энэ нь arr [arr] -ээс бага байвал зүүн дэд массивын шалгалт
тохируулгын байрлалыг тооцоолно. Өөрөөр хэлбэл баруун дэд-массивт
ижил байна.
Алхам 4: Хайлтыг олтол давтах эсвэл дэд массивд сөрөг хариуг гаргана

https://www.geeksforgeeks.org/interpolation-search/
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Интерполяцийн Хайлт /Interpolation Search/
Интерполяцийн Хайлт хийх байрлалыг олохын тулд дараах томьёог
ашиглана.

pos = lo + [ (x-arr[lo])*(hi-lo) / (arr[hi]-arr[Lo])]

Үүнд:

arr[] ==> Хайлт хийгдэх массив


x ==> хайх элементын утга
lo ==> arr[] массивын эхлэх утга
hi ==> arr[] массивын дуусах утга

https://www.geeksforgeeks.org/interpolation-search/
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Интерполяцийн Хайлт /Interpolation Search/
#include <iostream>
using namespace std;
int interpolationSearch(int arr[], int n, int x)
{
int lo = 0, hi = (n - 1);
while (lo <= hi && x >= arr[lo] && x <= arr[hi]) {
int pos = lo + (((double)(hi-lo) /
(arr[hi]-arr[lo]))*(x - arr[lo]));
if (arr[pos] == x) return pos;
if (arr[pos] < x) lo = pos + 1;
else
hi = pos - 1; }
return -1;
} https://www.geeksforgeeks.org/interpolation-search/
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Интерполяцийн Хайлт /Interpolation Search/
int main()
{
int arr[] = {10, 12, 13, 16, 18, 19, 20, 21, 22, 23,24, 33, 35, 42,
47};
int n = sizeof(arr)/sizeof(arr[0]);
int x = 18;
int index = interpolationSearch(arr, n, x);

if (index != -1)
cout<<"Element found at index "<<index;
else
cout<<"Element not found.";
return 0;
} https://www.geeksforgeeks.org/interpolation-search/
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Интерполяцийн Хайлт /Interpolation Search/
int main() {
int arr[] = {10, 12, 13, 16, 18, 19, 20, 21, 22, 23,24, 33, 35, 42, 47};
int n = sizeof(arr)/sizeof(arr[0]);
int x = 18;
int index = interpolationSearch(arr, n, x);

if (index != -1)
cout<<"Element found at index "<<index;
else
cout<<"Element not found.";
return 0; }
Гарах үр дүн:
Element found at index 4
https://www.geeksforgeeks.org/interpolation-search/
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ

Vous aimerez peut-être aussi

  • Lecture 11
    Lecture 11
    Document24 pages
    Lecture 11
    Amarsaikhan Tuvshinbayar
    100% (2)
  • Lecture 6 2018
    Lecture 6 2018
    Document50 pages
    Lecture 6 2018
    Amarsaikhan Tuvshinbayar
    100% (3)
  • Programming Lec 6
    Programming Lec 6
    Document51 pages
    Programming Lec 6
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture - 10
    Lecture - 10
    Document35 pages
    Lecture - 10
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 15
    Lecture 15
    Document40 pages
    Lecture 15
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lec1-1 Corporate Activity Shine
    Lec1-1 Corporate Activity Shine
    Document61 pages
    Lec1-1 Corporate Activity Shine
    Amarsaikhan Tuvshinbayar
    0% (1)
  • Lecture 13
    Lecture 13
    Document46 pages
    Lecture 13
    Amarsaikhan Tuvshinbayar
    100% (2)
  • Lecture 8 2018
    Lecture 8 2018
    Document54 pages
    Lecture 8 2018
    Amarsaikhan Tuvshinbayar
    100% (3)
  • Lecture 9
    Lecture 9
    Document46 pages
    Lecture 9
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • IT101 Lecture 4
    IT101 Lecture 4
    Document72 pages
    IT101 Lecture 4
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 7 20108
    Lecture 7 20108
    Document47 pages
    Lecture 7 20108
    Amarsaikhan Tuvshinbayar
    75% (4)
  • Lecture 4 2018
    Lecture 4 2018
    Document47 pages
    Lecture 4 2018
    Amarsaikhan Tuvshinbayar
    100% (4)
  • Lecture 5 2018
    Lecture 5 2018
    Document54 pages
    Lecture 5 2018
    Amarsaikhan Tuvshinbayar
    100% (2)
  • Lecture 2 2018
    Lecture 2 2018
    Document33 pages
    Lecture 2 2018
    Amarsaikhan Tuvshinbayar
    100% (1)
  • Lecture 3 2018
    Lecture 3 2018
    Document42 pages
    Lecture 3 2018
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Baikal Hotolbor
    Baikal Hotolbor
    Document2 pages
    Baikal Hotolbor
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 1 2018
    Lecture 1 2018
    Document39 pages
    Lecture 1 2018
    Amarsaikhan Tuvshinbayar
    100% (6)
  • Lecture 3
    Lecture 3
    Document72 pages
    Lecture 3
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 9
    Programming Lec 9
    Document39 pages
    Programming Lec 9
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 3
    Lecture 3
    Document72 pages
    Lecture 3
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 4
    Programming Lec 4
    Document39 pages
    Programming Lec 4
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Koosen 2018 Algorithm 2
    Koosen 2018 Algorithm 2
    Document48 pages
    Koosen 2018 Algorithm 2
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 8
    Programming Lec 8
    Document32 pages
    Programming Lec 8
    Amarsaikhan Tuvshinbayar
    100% (1)
  • Lecture 2
    Lecture 2
    Document80 pages
    Lecture 2
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 1
    Lecture 1
    Document54 pages
    Lecture 1
    Amarsaikhan Tuvshinbayar
    100% (2)
  • Koosen 2018 Algorithm Programming 3
    Koosen 2018 Algorithm Programming 3
    Document46 pages
    Koosen 2018 Algorithm Programming 3
    Amarsaikhan Tuvshinbayar
    100% (1)
  • PL - 3
    PL - 3
    Document47 pages
    PL - 3
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 6
    Programming Lec 6
    Document51 pages
    Programming Lec 6
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 7
    Programming Lec 7
    Document57 pages
    Programming Lec 7
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Koosen 2018 Algorithm Programming 1
    Koosen 2018 Algorithm Programming 1
    Document60 pages
    Koosen 2018 Algorithm Programming 1
    Amarsaikhan Tuvshinbayar
    100% (2)