Послідовні таблиці. h2>
Будемо розглядати невідсортоване таблиці. p>
K - кількість елементів в таблиці p>
N - довжина вектора подання елементів таблиці p>
Векторне подання: p>
type елемент = record key
... body ...; p>
таблиця = array [1 .. N] of елемент p>
end p>
key =... p>
body =... p>
Час пошуку K/2 p>
Спискові подання: p>
type елемент = record key ... body ...; p>
зв'язок = елемент; p>
procedure вставити (var table: таблиця; var ключ: key; тіло: body) p>
begin p>
if останній> = N then
write ( 'немає місця') else begin p>
останній: = останній 1; p>
table [останній]. key: = ключ; p>
table [останній]. body: = тіло; p>
end; p>
with table [останній] do p>
key: = ключ; p>
body: = тіло; p>
end p>
end p>
Припускаємо, що довжина ключа і тіла одна й та ж. p>
procedure змінити (var table: таблиця; var останній: integer) p>
var i, j: integer; p>
begin p>
table [останній 1]. key: = ключ; p>
i: = 1; p>
while not
(table [i]. key = ключ) do (ця умова
хоча б раз виконується) p>
i: = i +1; p>
if i = останній 1 then
write ( 'немає запису з', ключ)
else table [i]. тіло: = тіло p>
end p>
Операції вставити і змінити мають складність K/2, де К --
кількість записів у таблиці. p>
Procedure Виключити (var table: таблиця; var останній: integer) p>
var i: integer p>
begin (знайти таке i: table [i]. ключ = ключ і видалити цей елемент зі
table) p>
i: = 1;
| Процедура p>
table [останній 1]. ключ: = ключ;
| P>
while
table [i]. ключ <> ключ do i: = i +1 (умова інваріантності циклу) | пошуку p>
if i <= останній then begin p>
while i <> останній do begin p>
table [i]: = table [i +1]; p>
i: = i +1 p>
end; p>
останній: = останній-1; p>
end else write ( 'Такого елемента немає') p>
end. p>
Складність: К/2 - пошук p>
К/2 --
зсув p>
К/2 + К/2 = К, тобто складність лінійна p>
body =... p>
key =... p>
type посилання = ланка; p>
ланка = record ключ: key; p>
тіло: body; p>
зв'язок: посилання p>
end; p>
var таблиця: посилання; p>
procedure вставити (var таблиця, останній: посилання; ключ: key;
тіло: body) p>
var елемент: ланка; p>
begin p>
new (елемент); p>
елемент.ключ: = ключ; p>
елемент.тело: = тіло; p>
елемент.связь: = nil; p>
последній.связь: = елемент; p>
останній: = елемент; p>
if таблиця = nil then таблиця: = елемент else
последній.связь: = елемент; p>
останній: = елемент p>
end p>
Складність не залежить від довжини таблиці p>
procedure змінити (var таблиця, останній: посилання; ключ: key;
тіло: body) p>
(знайти табліца.ключ = ключ і замінити табліца.тело на тіло) p>
var наступний: посилання; p>
begin (пошук елемента з
заданим ключем) p>
if таблиця <>
nil then begin p>
new (наступний); p>
следующій.ключ: = ключ: p>
следующій.связь: =
nil; p>
последній.связь: = наступний; p>
наступний: = таблиця; p>
end; p>
(пошук) p>
while
следующій.ключ <> ключ do наступний: = следующій.связь; p>
if
последній.связь <> наступний then следующій.тело: = тіло p>
else
write ( 'Елемент не знайдено'); p>
(потрібно знищити
згенерований елемент) p>
dispose (последній.связь) p>
end p>
Складність К/2 p>
procedure знищити (var таблиця, останній: посилання; ключ: key); p>
var поточний: посилання; p>
(якщо елемент останній або перший, то розглянемо окремо, інакше
зрушимо посилання і звільнимо пам'ять) p>
if (таблиця порожня) then
write ( 'Таблиця порожній') else p>
if (в таблиці один
елемент) then p>
if (єдиний
елемент є шуканий) then (зробити таблицю порожній) p>
else
write ( 'немає шуканого елементу в таблиці') p>
else write ( 'немає
шуканого елементу в таблиці ') p>
else (пошук в таблиці) p>
new (поточний); p>
текущій.ключ = ключ; p>
текущій.связь: = nil; p>
последній.связь: = поточний; p>
поточний: = таблиця; p>
while текущій.ключ <> ключ do begin p>
предок: = поточний; p>
поточний: = текущій.связь p>
end p>
if (перший елемент - шуканий) then begin p>
поточний: = таблиця; p>
таблиця: =
текущій.связь; p>
dispose (поточний) p>
end p>
if (останній-шуканий (поточний = останній)) then begin p>
останній: = предок; p>
последній.связь: = nil; p>
dispose (поточний); p>
dispose (текущій.связь) p>
end p>
else begin p>
предок.связь: = текущій.связь; p>
dispose (поточний); p>
dispose (последній.связь) p>
end p>
end p>
Складність = складності пошуку по лінійному списку К/2 p>
Таблицю потрібно формувати так, щоб найбільш часто зустрічаються
ключі знаходилися на початку списку. Знаючи частоту встреча7емості ключів та
відсортувавши таблицю можна поліпшити ефективність. p>
сортовані послідовні таблиці. p>
Типи ключа і тіла далі прості. p>
procedure вставити (var таблиця: table; var останній: integer;
ключ: key; тіло: body) p>
var i: integer; p>
begin p>
if останній = N then
write ( 'таблиця заповнена') else begin p>
i: = останній; p>
(вважаємо, що всі
ключі упорядкованих за зростанням, тобто p>
I (Kj) = I (Kt) +1 p>
(Kj, Kt) R і не s: (Kj, Ks) R (Ks, Kt) R) p>
while (i> = 1) and (таблиця [i]. ключ> ключ) do
begin p>
таблиця [i +1]. ключ: = таблиця [i]. ключ; p>
таблиця [i +1]. тіло: = таблиця [i]. тіло; p>
i: = i-1 p>
end; p>
таблиця [i]. тіло: = тіло; p>
таблиця [i]. ключ: = ключ p>
end p>
end p>
Складність операції вставки для впорядкованих таблиць зросла. p>
Висновки: p>
1) основна складність
операцій в таблиці - пошук. Для даної - лінійна. P>
2) векторне подання
добре, коли операції видалення та вставки відносно рідкі, а, якщо ж ні,
то перевагу потрібно віддавати списковому поданням. p>
3) Для послідовних
таблиць зниження складності можна досягти за рахунок використання інформації про
зустрічальності ключів. Операцію пошуку можна скоротити за рахунок скорочення довжини
шляхів пошуку. p>
Список літератури h2>
Для підготовки даної роботи були використані матеріали з сайту http://www.ergeal.ru/
p>