Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Упорядкування та пошук в списках

Впорядкований список передбачає певну послідовність слідування елементів – алфавіт, зростання значень і т.п.

Пошук – типова операція для списків. У невпорядкованому списку для її виконання необхідно переглянути весь список, у зв’язку з чим в середньому на пошук буде витрачатися N/2 порівнянь.

Для впорядкованого списку час на здійснення пошуку можна суттєво скоротити.

Найпростіший спосіб передбачає перегляд не всього списку, а лише тих елементів, значення яких не більше шуканого. Якщо у цих елементах шуканий елемент не знайдено, то його не буде і в залишку списку.

Інший спосіб передбачає виконання бінарного (чи логарифмічного) пошуку. При виконанні бінарного пошуку спочатку здійснюється порівняння з елементом всередині списку (N+1)/2, якщо цей елемент не є шуканим, то, в залежності від того, чи є він більшим, чи меншим, необхідно переглянути елементи, що йдуть до нього, чи після нього. Елементи переглядаються також, починаючи з елементу, що є всередині списку.

Використання бінарного пошуку дозволяє скоротити час на пошук у логарифмічній залежності. Наприклад, пошук повним перебиранням елементів при N=128 передбачає в середньому 64 порівнянь, а бінарний пошук – у будь-якому разі не більше 8 порівнянь.

Недоліком впорядкованих структур даних є необхідність витрат на їх впорядкування. Якщо пошук здійснюється рідше, ніж внесення нових елементів, то витрати ресурсів на впорядкування можуть бути невиправданими. Проте у більшості випадків внесення нових елементів відбувається рідше, ніж їх пошук.

7.5. Похідні структури даних: черга, стек, дек

Черга – різновид лінійного списку, у якій нові дані розміщуються слідом за попередніми в порядку надходження.

В залежності від того, яким чином можна отримати доступ до даних розрізняють:

– черга FIFO (First In – First Out) – доступ лише до першого елементу (аналогія з чергою до магазину);

– двобічна черга (дек) – доступ до елементів з початку і з кінця черги (аналогія з чергою до магазину, в якій товару на всіх не вистачить);

– стек – лінійний список, я якому операції додавання та вилучення виконують лише з однієї сторони (на верхівці стеку).

На відміну від масивів та традиційних лінійних списків, доступ до елементів яких спеціальним чином не обмежується, основним призначенням черги є тимчасове зберігання елементів, які заносяться та вилучаються з черги в спеціальній послідовності.

Основні операції:

– поставити в чергу;

– вилучити з черги.

Також черга може повертати свою довжину (кількість елементів), або відповідати на запит, чи є наступний елемент.

При роботі з чергами можливі наступні помилки:

– переповнення – спроба поставити елемент до черги, коли всю відведену для неї пам’ять використано;

– незаповнення – спроба вилучити елемент з пустої черги.

 

Черга FIFO

Черга FIFO – традиційна реалізація черги, яка, як правило, створюється з метою обробки певних даних, коли процес обробки може бути тривалішим за надходження даних.

Для черги FIFO операції виконуються наступним чином:

· поставити в чергу – елемент заноситься до кінця черги і стає її останнім елементом;

· вилучити з черги – черга повертає перший елемент і виділяє його з себе, першим стає елемент, який був другим.

Найкращим варіантом реалізації черги FIFO є використання однобічно зв’язаного списку.

 

Блокуюча черга

Черги часто використовуються у ситуації, коли доступ до неї мають два потоки – один на додавання елементів, інший – на вилучення. Крім того, в реальній ситуації обсяг доступної пам’яті, як правило, обмежений, а черги використовуються для «буферів» - тимчасового сховища певних елементів у обмеженому обсягу пам’яті.

В такій ситуації створюється певна модифікація черги, яка має назву блокуючої.

Блокуюча черга відрізняється від звичайної черги тим, що у разі свого заповнення вона призупиняє потік, який додає елементи, до тих пір, доки з черги не буде вилучено елемент і у ній не з’явиться місце.

Крім власне операції блокування блокуючи черга має бути «безпечною для потоків» і передбачати таку реалізацію, в якій з нею одночасно можуть працювати декілька потоків.

 

Визначення стеку

Стек – різновид лінійного списку, у якому операції внесення та вилучення елементів відбуваються з однієї сторони (на верхівці стеку).

Стек також називають чергою LIFO (Last In – First Out).

Стек можна розглядати як певну аналогію до стопки тарілок, з якої можна взяти верхню, і на яку можна покласти верхню тарілку (інша назва стеку - "магазин", за аналогією з принципом роботи магазину в автоматичній зброї).

Стек дуже поширений у різних реалізаціях мов програмування та мікропроцесорах ЕОМ.

 

Основні операції зі стеками

Основні операції зі стеками, такі ж, як і з чергами: внесення елементу і вилучення елементу зі стеку. У специфічній до стеку термінології термінології ці операції мають назву:

· заштовхнути елемент(" push "): елемент додається в стек та розміщується в його верхівці. Розмір стеку збільшується на одиницю. При перевищенні розміра стека граничної величини, відбувається переповнення стека (stack overflow)

· виштовхнути елемент(" pop "): отримує елемент з верхівки стеку. При цьому він видаляється зі стеку і його місце в верхівці стеку займає наступний за ним відповідно до правила LIFO, а розмір стеку зменшується на одиницю. При намаганні "виштовхнути" елемент з вже пустого стеку, відбувається ситуація "незаповнення" стеку (stack underflow)

Кожна з цих операцій зі стеком виконується за фіксований час O(1) і не залежить від розміру стеку.

Додаткові операції (присутні не у всіх реалізаціях стеку):

· isEmpty: перевірка наявності елементів в стеку; результат: істина (true), коли в стеку немає елементів.

· isFull: перевірка заповненості стека. Результат: істина, коли додавання нового елементу неможливе

· clear: звільнити стек (видалити усі елементи).

· top: отримати верхній елемент (без виштовхування).

· size: отримати розмір (кількість елементів) стека.

· swap: поміняти два верхніх елементи місцями.

<== предыдущая лекция | следующая лекция ==>
Визначення списку | Визначення дерева
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 481; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.