Эрэмбэлэлт ба
хайлтын энгийн
аргууд
Lecture 14
Programming Language
Агуулга
 Түргэн эрэмбэлэх арга – Quick sort
 Хайлтын тухай
 Шугаман хайлтын арга
 Хоѐртын хайлтын арга
 Шугаман хайлтын арга
Түргэн эрэмбэлэх арга – Quick sort
 Элемэнтийн байрыг солих үйлдэл дээр үндэслэн
эрэмбэлэлтийн аргыг мэдэгдэхүйц сайжруулан
боловсронгуй болгож болно.
 Энэ сайжруулалт өнөө үеийн массивыг эрэмбэлэх
хамгийн шилдэг арга хуваалттай солилцох
эрэмбэлэлтийн арга болсон.
 Энэ аргыг 1962 онд Ч.А.Р.Хоар анх санал болгосон.
Маш өндөр бүтээмжтэй арга болохынх нь хувьд түүнийг
“түргэн эрэмбэлэлт” гэж ч нэрлэдэг
Түргэн эрэмбэлэх арга – Quick sort
Аргын үндсэн зарчим:
 1. Эрэмбэлэлт хийгдээгүй анхны массив дотроос
ямар нэг элемэнтийг (x) сонгон авна. Түүнийгээ саад
элемэнт гэж нэрлэнэ.
 2. Массивын элемэнтүүдийг х-ээс зүүн талд түүнээс
бага буюу тэнцүү бүх элемэнт байрлаж байхаар,
баруун талд нь түүнээс их массивын бүх элемэнт
байрлаж байхаар тус тус сэлгэн байрлуулна.
Түргэн эрэмбэлэх арга – Quick sort
 Дээрх 2 алхамыг хийсний дараа x элемэнт к-р
байрлалд байрласан гэвэл А массив нь анхны
массив A[k]- элемэнт (саад)-ээр тусгаарлагдсан
эрэмбэлэгдээгүй хоѐр хэсэгт хуваагдана:
 (A[1], A[2],..., A[k-1]) / элемэнт бүр нь A[k]-аас
бага /
 (A[k+1], A[k+2],..., A[n])/ элемэнт бүр нь A[k]тай
тэнцүү буюу түүнээс их /хэлбэртэй болно.
 Тиймээс A[k] нь эрэмбэлэгдсэн массивт байх
өөрийнхөө байрлалыг эзэлсэн байна
Түргэн эрэмбэлэх арга – Quick sort
 3. Эрэмбэлэгдээгүй хоѐр хэсэг тус бүрийн хувьд (1)
ба (2) алхамуудыг давтан гүйцэтгэж, энэ процессоо
нэг элемэнтээс тогтох массивын хэсэг үлдэх хүртэл
буюу бүх массив эрэмбэлэгдэх хүртэл үргэлжлүүлнэ
Түргэн эрэмбэлэх арга – Quick sort
QuickSort функц:
void QuickSort(int a[],int low,int high){
if(low<high){
Int pivot=partition(a,low,high);
QuickSort(a,low,pivot-1);
QuickSort(a,pivot+1,high);
}
}
Түргэн эрэмбэлэх арга – Quick sort
int partition(int a[],int low,int high)
{ int pivot, p_pos,i,j;
p_pos=low; pivot=a[p_pos];
for(i=low+1;i<=high;i++){
if(a[i]<pivot){ p_pos++; swap(a,p_pos,i);
}
}
swap(a,low,p_pos); return p_pos;}
Түргэн эрэмбэлэх арга – Quick sort
Түргэн эрэмбэлэх арга – Quick sort
Түргэн эрэмбэлэх арга – Quick sort
Түргэн эрэмбэлэх арга – Quick sort
Түргэн эрэмбэлэх арга – Quick sort
Түргэн эрэмбэлэх арга – Quick sort
Түргэн эрэмбэлэх арга – Quick sort
Түргэн эрэмбэлэх арга – Quick sort
Түргэн эрэмбэлэх арга – Quick sort
Хайлтын
тухай
Хайлтын тухай
 Хайлт нь тодорхой нэг (хэсэг) мэдээллийг өмнө үүсгэн
хадгалсан их хэмжээний мэдээллийн сангаас олох
үйлдэл юм.
 Ерөнхий тохиолдолд мэдээлэл нь олон тооны
бичлэгүүдээс тогтох ба бичлэг бүр хайх түлхүүр талбартай
байдаг.
 Ихэнх тохиолдолд хайлтын гол зорилго нь хайх түлхүүрээс
гадна түүнд харгалзах бичлэгийг олоход оршдог.
 Жишээ: Англи хэлний электрон толиос үг хайхдаа бид тэр
үгний орчуулга болон тайлбарыг олох зорилготой байдаг.
 Энэ мэдээллийн системд үг нь "түлхүүр" болох бөгөөд
тухайн үгний тайлбар болон орчуулга нь "бичлэг" болдог
Хайлтын тухай
Хайлт хийхэд давхардсан түлхүүртэй бичлэгүүдийг хэрхэн
боловсруулалт хийх нь тухайн хэрэглээнээс хамаардаг.
Үүнийг зохицуулах аргууд:
1. Бичлэгүүдийг агуулах үндсэн өгөгдлийн бүтэц нь зөвхөн
ялгаатай түлхүүрүүд бүхий бичлэгийг агуулна. Харин бичлэг
бүр ижил түлхүүртэй бичлэгүүдийг заах нэмэлт холбоос
агуулж болно. Энэ тохиолдолд зөвхөн нэг удаагийн хайлтаар
өгөгдсөн түлхүүр бүxий бүх бичлэгийг олж авдаг.
Хайлтын тухай
 2.Давхардсан түлхүүртэй бичлэгүүдийг үндсэн
өгөгдлийн бүтцэд тэр чигээр нь үлдээж харин
хайлтаар эхэлж олдсон нэг бичлэгийг авдаг.
 Энэ аргыг давхардсан түлхүүртэй бичлэгүүдийн аль нь
сонгогдох нь чухал биш хэрэглээнд ашигладаг.3.
Түлхүүрээс гадна бусад бичлэгт утга i давтагдахгүй
талбарыг тодорхойлж болно. Энэ үед хайлтыг түлхүүр
болон(давтагдахгүй) талбарын утгаар хийх болно
Шугаман хайлтын арга– Linear Search
 Энэ арга нь хайлтын хамгийн энгийн арга юм.
 Зөвхөн хайж буй элемэнтийн утга мэдэгдэх бөгөөд
түүний тухай болон хайлт явуулах өгөгдлийн
олонлогийн талаар ямар нэг нэмэлт мэдээлэл
байхгүй үед энэ аргыг ашиглана,
int LinearSearch (int a[],int x,int n) {
for (int i = 0; i < n; i++)
if (a[i] == x)
return i; return -1;
}
Шугаман хайлтын арга– Linear Search
 Хайх утга: 23
 Хайлт явуулах олонлог:
Шугаман хайлтын арга– Linear Search
 Хайх утга: 23
 Хайлт явуулах олонлог:
Шугаман хайлтын арга– Linear Search
 Хайх утга: 23
 Хайлт явуулах олонлог:
Шугаман хайлтын арга– Linear Search
 Хайх утга: 23
 Хайлт явуулах олонлог:
Шугаман хайлтын арга– Linear Search
 Хайх утга: 23
 Хайлт явуулах олонлог:
Шугаман хайлтын арга– Linear Search
 Хайх утга: 23
 Хайлт явуулах олонлог:
Шугаман хайлтын арга– Linear Search
 Хайх утга: 23
 Хайлт явуулах олонлог:
Шугаман хайлтын арга– Linear Search
 Хайх утга: 23
 Хайлт явуулах олонлог:
Элемэнт олдлоо Буцаах утга: 6
Хоёртын хайлтын арга– Binary Search
 Шугаман хайлттай харьцуулбал илүү үр дүнтэй аргын
нэг бол хоѐртын хайлт буюу таллан хуваах арга юм.
 Энэ арга нь өгөгдлийг хоѐр хэсэгт хуваан хайх
элемэнт аль хэсэгт байгааг тодорхойлдог.
 Энэ аргыг ашиглахад өгөгдөл эрэмбэлэгдэн байх
ѐстой
Хоёртын хайлтын арга– Binary Search
 Аргын үндсэн санаа:1. Хайх элемэнт буюу Х тоо
массивын дундаж элемэнт мөн үү гэдгийг шалгах
явдал юм. Хэрэв энэ нь үнэн бол бодлогын шийд
олдлоо гэсэн үг.
 2. Тийм биш бол 2 тохиолдол байна
Хоёртын хайлтын арга– Binary Search
 Х нь дундаж элемэнт буюу голын элемэнтээс бага
бол уг массив эрэмбэлэгдсэн гэдгийг тооцоод голын
элемэнтээс баруун тийш байрлах бүх
элемэнтүүдийг хяналтаас хасах ба энэ аргыг
массивын голын элемэнтээс зүүн гар талд орших
хэсэгт хэрэглэх
 Х нь дундаж элемэнт буюу голын элемэнтээс их бол
уг массив эрэмбэлэгдсэн гэдгийг тооцоод голын
элемэнтээс зүүн тийш байрлах бүх элемэнтүүдийг
хяналтаас хасах ба энэ аргыг массивын голын
элемэнтээс баруун гар талд орших хэсэгт хэрэглэх
Хоёртын хайлтын арга– Binary Search
BinarySearch функц:
int BinarySearch(int a[],int n,int x)
{
int mid, low=0, high=n;
while(low<=high){
mid=(low+high)/2;
if(x==a[mid])
return mid;
if(x>a[mid]) low=mid+1;
else high=mid-1;
} return -1;
}
Хоёртын хайлтын арга– Binary Search
Хайх утга: 23
Хайлт явуулах олонлог:
Хоёртын хайлтын арга– Binary Search
Хайх утга: 23
Хайлт явуулах олонлог:
Элемэнт олдлоо
ЖИШЭЭ КОД
BINARY SEARCH
BINARY SEARCH
#include <stdio.h>
void binary_search();
int a[50], n, item, loc, beg, mid, end, i;
main()
{
printf("nEnter size of an array: ");
scanf("%d", &n);
printf("nEnter elements of an array in sorted form:n");
for(i=0; i<n; i++)
scanf("%d", &a[i]);
printf("nEnter ITEM to be searched: ");
scanf("%d", &item);
binary_search();
getch();
}
BINARY SEARCH
void binary_search()
{
beg = 0; end = n-1;
mid = (beg+end)/2;
while ((beg<=end) && (a[mid]!=item))
{
if (item < a[mid])
end = mid-1;
else
beg = mid+1;
mid = (beg+end)/2;
}
if (a[mid] == item)
printf("nnITEM found at location %d", mid+1);
else
printf("nnITEM doesn't exist");
}
LINEAR SEARCH программ бичнэ үү

Эрэмбэлэлт хайлтын аргууд

  • 1.
  • 2.
    Агуулга  Түргэн эрэмбэлэхарга – Quick sort  Хайлтын тухай  Шугаман хайлтын арга  Хоѐртын хайлтын арга  Шугаман хайлтын арга
  • 3.
    Түргэн эрэмбэлэх арга– Quick sort  Элемэнтийн байрыг солих үйлдэл дээр үндэслэн эрэмбэлэлтийн аргыг мэдэгдэхүйц сайжруулан боловсронгуй болгож болно.  Энэ сайжруулалт өнөө үеийн массивыг эрэмбэлэх хамгийн шилдэг арга хуваалттай солилцох эрэмбэлэлтийн арга болсон.  Энэ аргыг 1962 онд Ч.А.Р.Хоар анх санал болгосон. Маш өндөр бүтээмжтэй арга болохынх нь хувьд түүнийг “түргэн эрэмбэлэлт” гэж ч нэрлэдэг
  • 4.
    Түргэн эрэмбэлэх арга– Quick sort Аргын үндсэн зарчим:  1. Эрэмбэлэлт хийгдээгүй анхны массив дотроос ямар нэг элемэнтийг (x) сонгон авна. Түүнийгээ саад элемэнт гэж нэрлэнэ.  2. Массивын элемэнтүүдийг х-ээс зүүн талд түүнээс бага буюу тэнцүү бүх элемэнт байрлаж байхаар, баруун талд нь түүнээс их массивын бүх элемэнт байрлаж байхаар тус тус сэлгэн байрлуулна.
  • 5.
    Түргэн эрэмбэлэх арга– Quick sort  Дээрх 2 алхамыг хийсний дараа x элемэнт к-р байрлалд байрласан гэвэл А массив нь анхны массив A[k]- элемэнт (саад)-ээр тусгаарлагдсан эрэмбэлэгдээгүй хоѐр хэсэгт хуваагдана:  (A[1], A[2],..., A[k-1]) / элемэнт бүр нь A[k]-аас бага /  (A[k+1], A[k+2],..., A[n])/ элемэнт бүр нь A[k]тай тэнцүү буюу түүнээс их /хэлбэртэй болно.  Тиймээс A[k] нь эрэмбэлэгдсэн массивт байх өөрийнхөө байрлалыг эзэлсэн байна
  • 6.
    Түргэн эрэмбэлэх арга– Quick sort  3. Эрэмбэлэгдээгүй хоѐр хэсэг тус бүрийн хувьд (1) ба (2) алхамуудыг давтан гүйцэтгэж, энэ процессоо нэг элемэнтээс тогтох массивын хэсэг үлдэх хүртэл буюу бүх массив эрэмбэлэгдэх хүртэл үргэлжлүүлнэ
  • 7.
    Түргэн эрэмбэлэх арга– Quick sort QuickSort функц: void QuickSort(int a[],int low,int high){ if(low<high){ Int pivot=partition(a,low,high); QuickSort(a,low,pivot-1); QuickSort(a,pivot+1,high); } }
  • 8.
    Түргэн эрэмбэлэх арга– Quick sort int partition(int a[],int low,int high) { int pivot, p_pos,i,j; p_pos=low; pivot=a[p_pos]; for(i=low+1;i<=high;i++){ if(a[i]<pivot){ p_pos++; swap(a,p_pos,i); } } swap(a,low,p_pos); return p_pos;}
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
    Хайлтын тухай  Хайлтнь тодорхой нэг (хэсэг) мэдээллийг өмнө үүсгэн хадгалсан их хэмжээний мэдээллийн сангаас олох үйлдэл юм.  Ерөнхий тохиолдолд мэдээлэл нь олон тооны бичлэгүүдээс тогтох ба бичлэг бүр хайх түлхүүр талбартай байдаг.  Ихэнх тохиолдолд хайлтын гол зорилго нь хайх түлхүүрээс гадна түүнд харгалзах бичлэгийг олоход оршдог.  Жишээ: Англи хэлний электрон толиос үг хайхдаа бид тэр үгний орчуулга болон тайлбарыг олох зорилготой байдаг.  Энэ мэдээллийн системд үг нь "түлхүүр" болох бөгөөд тухайн үгний тайлбар болон орчуулга нь "бичлэг" болдог
  • 20.
    Хайлтын тухай Хайлт хийхэддавхардсан түлхүүртэй бичлэгүүдийг хэрхэн боловсруулалт хийх нь тухайн хэрэглээнээс хамаардаг. Үүнийг зохицуулах аргууд: 1. Бичлэгүүдийг агуулах үндсэн өгөгдлийн бүтэц нь зөвхөн ялгаатай түлхүүрүүд бүхий бичлэгийг агуулна. Харин бичлэг бүр ижил түлхүүртэй бичлэгүүдийг заах нэмэлт холбоос агуулж болно. Энэ тохиолдолд зөвхөн нэг удаагийн хайлтаар өгөгдсөн түлхүүр бүxий бүх бичлэгийг олж авдаг.
  • 21.
    Хайлтын тухай  2.Давхардсантүлхүүртэй бичлэгүүдийг үндсэн өгөгдлийн бүтцэд тэр чигээр нь үлдээж харин хайлтаар эхэлж олдсон нэг бичлэгийг авдаг.  Энэ аргыг давхардсан түлхүүртэй бичлэгүүдийн аль нь сонгогдох нь чухал биш хэрэглээнд ашигладаг.3. Түлхүүрээс гадна бусад бичлэгт утга i давтагдахгүй талбарыг тодорхойлж болно. Энэ үед хайлтыг түлхүүр болон(давтагдахгүй) талбарын утгаар хийх болно
  • 22.
    Шугаман хайлтын арга–Linear Search  Энэ арга нь хайлтын хамгийн энгийн арга юм.  Зөвхөн хайж буй элемэнтийн утга мэдэгдэх бөгөөд түүний тухай болон хайлт явуулах өгөгдлийн олонлогийн талаар ямар нэг нэмэлт мэдээлэл байхгүй үед энэ аргыг ашиглана, int LinearSearch (int a[],int x,int n) { for (int i = 0; i < n; i++) if (a[i] == x) return i; return -1; }
  • 23.
    Шугаман хайлтын арга–Linear Search  Хайх утга: 23  Хайлт явуулах олонлог:
  • 24.
    Шугаман хайлтын арга–Linear Search  Хайх утга: 23  Хайлт явуулах олонлог:
  • 25.
    Шугаман хайлтын арга–Linear Search  Хайх утга: 23  Хайлт явуулах олонлог:
  • 26.
    Шугаман хайлтын арга–Linear Search  Хайх утга: 23  Хайлт явуулах олонлог:
  • 27.
    Шугаман хайлтын арга–Linear Search  Хайх утга: 23  Хайлт явуулах олонлог:
  • 28.
    Шугаман хайлтын арга–Linear Search  Хайх утга: 23  Хайлт явуулах олонлог:
  • 29.
    Шугаман хайлтын арга–Linear Search  Хайх утга: 23  Хайлт явуулах олонлог:
  • 30.
    Шугаман хайлтын арга–Linear Search  Хайх утга: 23  Хайлт явуулах олонлог: Элемэнт олдлоо Буцаах утга: 6
  • 31.
    Хоёртын хайлтын арга–Binary Search  Шугаман хайлттай харьцуулбал илүү үр дүнтэй аргын нэг бол хоѐртын хайлт буюу таллан хуваах арга юм.  Энэ арга нь өгөгдлийг хоѐр хэсэгт хуваан хайх элемэнт аль хэсэгт байгааг тодорхойлдог.  Энэ аргыг ашиглахад өгөгдөл эрэмбэлэгдэн байх ѐстой
  • 32.
    Хоёртын хайлтын арга–Binary Search  Аргын үндсэн санаа:1. Хайх элемэнт буюу Х тоо массивын дундаж элемэнт мөн үү гэдгийг шалгах явдал юм. Хэрэв энэ нь үнэн бол бодлогын шийд олдлоо гэсэн үг.  2. Тийм биш бол 2 тохиолдол байна
  • 33.
    Хоёртын хайлтын арга–Binary Search  Х нь дундаж элемэнт буюу голын элемэнтээс бага бол уг массив эрэмбэлэгдсэн гэдгийг тооцоод голын элемэнтээс баруун тийш байрлах бүх элемэнтүүдийг хяналтаас хасах ба энэ аргыг массивын голын элемэнтээс зүүн гар талд орших хэсэгт хэрэглэх  Х нь дундаж элемэнт буюу голын элемэнтээс их бол уг массив эрэмбэлэгдсэн гэдгийг тооцоод голын элемэнтээс зүүн тийш байрлах бүх элемэнтүүдийг хяналтаас хасах ба энэ аргыг массивын голын элемэнтээс баруун гар талд орших хэсэгт хэрэглэх
  • 34.
    Хоёртын хайлтын арга–Binary Search BinarySearch функц: int BinarySearch(int a[],int n,int x) { int mid, low=0, high=n; while(low<=high){ mid=(low+high)/2; if(x==a[mid]) return mid; if(x>a[mid]) low=mid+1; else high=mid-1; } return -1; }
  • 35.
    Хоёртын хайлтын арга–Binary Search Хайх утга: 23 Хайлт явуулах олонлог:
  • 36.
    Хоёртын хайлтын арга–Binary Search Хайх утга: 23 Хайлт явуулах олонлог: Элемэнт олдлоо
  • 37.
  • 38.
    BINARY SEARCH #include <stdio.h> voidbinary_search(); int a[50], n, item, loc, beg, mid, end, i; main() { printf("nEnter size of an array: "); scanf("%d", &n); printf("nEnter elements of an array in sorted form:n"); for(i=0; i<n; i++) scanf("%d", &a[i]); printf("nEnter ITEM to be searched: "); scanf("%d", &item); binary_search(); getch(); }
  • 39.
    BINARY SEARCH void binary_search() { beg= 0; end = n-1; mid = (beg+end)/2; while ((beg<=end) && (a[mid]!=item)) { if (item < a[mid]) end = mid-1; else beg = mid+1; mid = (beg+end)/2; } if (a[mid] == item) printf("nnITEM found at location %d", mid+1); else printf("nnITEM doesn't exist"); }
  • 40.