Търсене на елемент
Задачата за „търсене" на елементи в даден масив може да бъде определена по следния начин:
Да се намери онзи елемент от даден масив, който е в релация ρ спрямо отнапред зададен елемент а*. Релацията ρ може да бъде една от следните шест: <, ≤, =, ≠, ≥, >. Понякога се налага да бъдат търсени всичките елементи, които удовлетворяват зададеното условие, но описаните по-долу алгоритми разглеждат първия случай. Разбира се, необходими са малки промени в описанието на дадените алгоритми, за да бъдат валидни и във втория случай.
1. Алгоритъм за последователно търсене
Нека А е едномерен масив с n елемента. Започвайки от първия елемент а1 последователно се преглеждат следващите елементи от масива А до намирането на търсения или до изчерпването на всички елементи, без да бъде намерен търсеният документ. Очевидно процедурата е много проста за изпълнение но тя „заплаща" с малката си скорост. Методът на последователното търсене може да бъде ефективен само за малки стойности на n.
Алгоритъм S
S1. [Начален номер на проверявания елемент.] i:=1
S2. [Сравнение.] Ако Ai е в релация ρ спрямо а*, изпълнете S5
S3. [Определяне номера на следващия елемент.] i: = i+1
S4. [Има ли още елементи?] Ако 1≤n, изпълнете S2
S5. [Край.] Прекратете търсенето.
Търсенето се извършва последователно, като се започне от първия елемент до намиране на елемент, равен на В или до намиране на индекс j при който Аj>В.
Блок-схема на алгоритъма:

2. Търсене на елемент в подреден масив (двоично търсене)
Даден е маснв А с N числени елемента, N>1, подредени по големина в растящ ред. Дадено е и числото b. Да се провери има ли сред елементите на А равен на b. Ако има, да се съобщи неговият индекс, ако не - да се издаде подходящо съобщение.
Идея на алгоритъма: масивът се разделя на две части и се преценява в коя част би могъл да бъде елементът b. С тази част се постъпва по същия начин, както с целия масив. Така се действа, докато се открие елементът b или се стигне до два елемента, за които е в сила Аj<b и b<Аj+1, което означава, че b не се съдържа в масива А.
Ще предполагаме, че релацията за сравнение е равенство и че масивът А е предварително подреден по възходящ ред на елементите си, т. е. a1≤a2≤a3≤…≤an.
Ако търсеният
елемент е b,
веднага може да се определи в коя от двете половини на масива А той не се
намира. За целта е досатъчно да се сравнят
b
и аk,
където
.
По този
начин броят на елементите, в които се извършва търсенето, след едно сравнение
намалява наполовина. С подходящата част от двете части на масива се постъпва по
същия начин, т.е. разделя се отново на две равни части и т.н. Това продължава,
докато се намери търсеният елемент или се установи, че такъв елемент в масива
няма. Точното описание е следното.
Алгоритъм В
B1. [Начални граници на масива.] i: = 1,.j:=n
B2.
[Пресмятане
„средата”
на масива.]
![]()
B3. [Сравнение.] Ако аk=b, изпълнете В8
B4. [Сравнение.] Ако ak<b, изпълнете В6
В5. [Нова дясна граница на масива.] j:=k-1, изпълнете В7
B6. [Нова лява граница на масива.] i:=k+1
B7. [Проверка за край.] Ако i≤j, изпълнете В2
B8. [Край.] Прекратете търсенето.
Пример A=(3, 5, 6, 6, 10, 15, 16, 17, 90, 99), b=15, n=10
|
Изпълнявана точка |
Извършено действие |
i |
j |
l |
|
В1 |
i:=1 |
1 |
10 |
|
|
|
j: =10→В2 |
|
|
|
|
В2 |
|
|
|
5 |
|
ВЗ |
a5=15? - не→B4 |
|
|
|
|
В4 |
а5<15? - да→В6 |
|
|
|
|
В6 |
i: =6→В7 |
6 |
|
|
|
В7 |
i≤j? - да→В2 |
|
|
|
|
В2 |
|
|
|
8 |
|
B3 |
al=15? - не→B4 |
|
|
|
|
В4 |
al<15? - не→B5 а,<15?— не->В5 |
|
|
|
|
В5 |
j: =7→В7 |
|
7 |
|
|
В7 |
i:≤j? - да→B2
|
|
|
|
|
В2 |
|
|
|
6 |
|
ВЗ |
ak=15? - да→B8 |
|
|
|
|
В8 |
край |
|
|
|
Разгледаният масив в примера е много малък, за да бъде добре осъзната голямата скорост на търсене по алгоритъм В. Това по-добре може да се види, ако се пресметне максималният брой сравнения, които се извършват при двоичното търсене. Нека е даден масив с n елемента и l е такова цяло положително число, че:
![]()
Преди да се извърши
първото сравнение, броят на елементите, измежду които е възможно да се намира
търсеният елемент, е равен на
n.
След първото сравнение този брой е вече
, след второто е
, а след (l-1)-то
сравнение ще бъде
т. е един елемент. Следователно, необходимо е още най-много
едно сравнение (т. е. общо най-много
l),
за да се намери търсеният елемент или да се установи, че такъв елемент няма. По
условие
, откъдето чрез логаритмуване следва:
0≤log2n
– log22
l-1<1,
т. е. l-1≤
log2n.
Окончателно се получава l≤[log2n]+1.
Да разгледаме отново алгоритъм I (подреждане чрез “вмъкване”). Точка I3 указва, че елементът аk+1 трябва да намери мястото си между първите k вече подредени елементи. С други думи, това е задача за търсене в нареден масив и следователно може да се използува алгоритъм В. Това е само един пример, който показва, че подреждането и търсенето са две взаимно свързани дейности. Ние подреждаме, за да търсим по-бързо, но като подреждаме, се налага да търсим. Във всички изложени дотук алгоритми за подреждане и търсене се предполагаше, че елементите в масива са наредени един след друг. Ако структурата на масива е друга, естествено тогава и алгоритмите за подреждане и търсене ще бъдат други, отчитащи характерните особености на съответната структура.
Блок-схема на алгоритъма:

В тази схема е използван знакът ÷, означаващ деление на цели числа, в резултат на което се получава цяло число, ненадминаващо частното на двете числа. Например 3÷2=1.
Търсене на определен елемент в подреден масив от данни често се налага в практиката. Примери за такава дейност са: търсене на картонче в библиотечен каталог, търсене на име в списък, подреден по азбучен ред; търсене на фактура в архив, нареден по датите на издаването, и др.
Задачата за търсене на елемент може да се съпровожда с извличане на някаква допълнителна информация за търсения елемент. В примера с таблицата на студентите може да е необходимо да се узнаят името и успехът на студент със зададен факултетен номер. Най-общо действия от такъв характер се наричат „извличане на справки".
3. Вмъкване на елемент в подреден масив
Даден е масив А с N (N≥2) числени елемента, подредени по големина, и число В. Числото В да стане елемент на масива А така, че да се запази наредбата. Предполагаме, че сред елементите няма еднакви.
Блок-схема на алгоритъма:

4. Премахване на елемент от подреден масив
Даден е масив А с N (N≥2) числени елемента подредени по големина. Дадено е и числото В. Елементът на А, равен по стойност на В, да се премахне от масива А.
Следва блок-схема на алгоритъма.

Най-общо действията, свързани с промени в масиви или таблици, се наричат актуализация, или обновяване. Те са характерни за изменящи се информационни системи.
Задача, която е типична при работа с информационни масиви.
Дадени са два подредени масива А и В съответно с по М и N числени елемента. Да се състави нов масив С който съдържа елементите на А и В и също да е подреден.
Ще предполагаме, че А и В нямат общи елементи. Задачи от този тип се наричат “задачи за сливане”.
Алгоритъм. Изразява се в следното: сравняват се по големина първият елемент на А с първия елемент на В. По-малкият от двата се записва като първи елемент на масива С. Следващото сравнение става отново над първите елементи, като считаме, че записаният елемент в С вече отсъства от съответния масив. Така се продължава, докато се изчерпи единият масив. Останалите елементи или елемент на другия масив се дописват в края на масива С. Блок-схема на алгоритъма:
