Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vse_bilety_YaTP.doc
Скачиваний:
5
Добавлен:
22.02.2015
Размер:
470.53 Кб
Скачать

15 Билет. Задача поиска.

а01...аn-1<- найти х - аргумент поиска

01...аn-1} i:(0<=i<n):ai==x

Результаты:

Ǝi : (0<=i<n):ai==x - успех :i

Для любого (0<=i<n):ai!==x - неуспех: -1

Const n = 100; int a[n]; int x;

Линейный поиск  Данный алгоритм является простейшим алгоритмом. Поиск значения функции осуществляется простым сравнением очередного рассматриваемого значения (как правило, поиск происходит слева направо, то есть от меньших значений аргумента к большим) и, если значения совпадают (с той или иной точностью), то поиск считается завершённым.

Int LS(int k, int a[], int x)

{for (int I = 0; i<k; i++)

If (a[i] == x) return I;

Return -1;}

С барьером К массиву добавляется один элемент и в него записывается искомое значение. Тогда при поиске в условии цикла не нужно проверять индекс на количество. Достаточно проверять просто найден элемент или нет - а он по-любому будет найден, так как мы поставили его в конце. На каждом цикле экономится одно сравнение.

Int LsBr(int k, int a[], int x)

{int R = a[k-1];

a[k-1]=x;

int i=0;

while(a[i]!=x) i++;

a[k-1] = R;

if (a[i]==x) return i;

else return -1;}

Бинарный -совокупность нужно упорядочить. Алгоритм двоичного поиска исключает половину еще непроверенных элементов массива после каждого сравнения. Алгоритм определяет местоположение среднего элемента массива и сравнивает его с ключом поиска. Если они равны, то ключ поиска найден и выдается индекс этого элемента. В противном случае задача сокращается на половину элементов массива. Если ключ поиска меньше, чем средний элемент массива, то дальнейший поиск осуществляется в первой половине массива, а если больше, то во второй половине. Если ключ поиска не совпадает со средним элементом выбранного подмассива (части исходного массива), то алгоритм повторно применяется и сокращает область поиска до четверти исходного массива. Поиск продолжается до тех пор, пока ключ поиска не станет равным среднему элементу или пока оставшийся подмассив содержит хотя бы один элемент, не равный ключу поиска.

Int BS1(int k, int a[], int x)

{int l=0,r=k-1;

While (l<=r)

{int m=(l+r)/2;

If (a[m]==x) return m;

If (a[m]>x) r=m-1;

Else l=m+1;}

Return -1;}

Int BS2(int k, int a[], int x)

{int l=0,r=k-1;

While(l<r)

{int m=(l+r)/2;

If(a[m]<x) l=m+1;

Else r=m;}

Return a[r]==x?r:-1}

Int BS3(int k, int a[], int x)

{int l=0,r=k-1;

While(l<r)

{int m = (l+r+1)/2;

If(a[m]>x) r=m-1;

Else l=m;}

If(a[l]==x) return l;

Else return -1;}

LS:O(n); BS: O(log2n)

Поиск по ключу

Struct TS

{t1 p1;

t2 p2;

……………….

tk pk; - поле ключа

………………

tn pn;

}

TS a[n];

tk x;

a[i].pk==x ?

a[i]==x

Обобщенный поиск

A[0]a[1]…a[n-1]

F(a[i])=x

16 билет. Задача сортировки

A0a1a2…an-1->ai0ai1…ain-1

F(ai0)<=f(ai1)<=…<=f(ain-1)f(x) – упорядочивающая функция

Методы (прямые): выбором, включением, обменом.

Эффективность методов: С(n) – кол-во сравнений;M(n) – кол-во перемещений; временная сложность –T(n),O(f(n)).

Const int nn = 100; int a[nn];

Выбор

Идея:

1).Min{ A0a1…an-1}a0

2).Min{ a1…an-1}a1

i).Min{ ai…an-1}ai

n-2).Min{ an-2an-1}an-2

Схема:

For(i=0;i<n-1;i++)

{поиск места К мин. эл-та в совокупности {A0a1a2…an-1}

Переставить akai}

Void selection(int a[], int n)

{for (int i=0; i<n-1; i++)

{int min = a[i], k=I;

For (int j=i+1; j<n;j++)

If (a[j]<min)

{min =a[j]; k=j}

A[k]=a[i];a[i]=min}

}

Характеристики: C(n) = =; M(n)min=3*(n-1); M(n)max=3*(n-1)+[]; T(n)=C*n2;

Модификации.

1). Поиск max{a0a1…an-1-i}

2). {ai…an-1-i} min k, max m;

A[k] a[i] if(m==i) m=k; a[m]a[n-1-i]

Включение

Идея: S1-упорядоченаS2-неупорядочена

a0a1 a2…ai-1 |ai… an-1

 R

Схема:

For(i=1;i<n;i++)

{R=a[i]; включитьRв совокупность {A0…an-1}, поиск места вставкиR

в совокупность { A0a1…akak+1…ai} сдвиг {Ak+1…ai-1} вставкаa[k+1]=R;}

void insertion(int a[],int n)

{for (int i=1;i<n;i++)

Int R=a[i];

While(k>=0&&a[k]>R)

{a[k+1]=a[k];k--;a[k+1]=R;}

}

Характеристики: C(n)min=n-1; C(n)max==; M(n)min=2(n-1); Mmax=2(n-1)+=; T(n)=C*n2;O(n2);

Модификации:

1).поиск линейный (слева направо) с правым барьером.

K=0;

While(a[k]<R) k++;

For(int j = i-1;j>=k;j--) a[j+1]=a[j]; a[k]=R;

2).Поиск линейный с левом барьером.

For(int i=n-1;i>0;i--)

If (a[i]<a[i-1])

{int t = a[i]; a[i] = a[i-1]; a[i-1] = t;}

For(int i=2; i<n;i++) R=a[i];

3).Двоичное включение.

Обменом

Идея: A0a1…ajaj+1…an-2an-1 aj <=aj+1

Void Bubble(int a[], int n)

{for (int i=n-1; i>0;i--)

For(int j=0;j<I;j++)

If (a[j]>a[j+1])

{int t=a[j]; a[j]=a[j+1]; a[j+1]=t;}

}

Характеристики: C(n) =;M(n)min=0;M(n)max=3*

С ЗАПОМИНАНИЕМ ФАКТА ПЕРЕСТАНОВКИ.

While(true){

Bool swapped = false;

For(…){

If (…) swapped = true; //если была перестановка

}

if(!swapped) break;}

ВЕКТОРОМ ИНДЕКСА.

A– исходный массив,V[i]=i- вектор индексов(массив)

For(int i=0; i<count; i++)

{for(int j=0; j < count – I; j++)

{if (A[V[j]]>A[V[j+1]]) swap(V[j], V[j+1])}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]