Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практика 6-10 401-ТИ Блінова Настя.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
36.79 Кб
Скачать

6. Масиви. Інші типи даних

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

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

(Make-array (nl п2 ... NN) режимы)

Функція повертає як значення новий об'єкт - масив, n1, n2, ..., nN - цілі числа, їх кількість N відображає розмірність (dimensionality) масиву, а значення - розмір (size) по кожній розмірності. Необов'язковими аргументами (режимами) можна задати тип елементів масиву, вказати їх початкові значення або надати самому масиву динамічний розмір. Загальний розмір масиву в цьому випадку заздалегідь знати і закріплювати не обов'язково.

Наприклад: двовимірний масив, що представляє точки дисплея з екраном 1024x1024, елементами якого є числа з плаваючою комою одинарний ¬ ної точності і початковим значенням 0.0, можна було б створити наступним виразом:

(setq экран (make-array '(1024 1024)

:element-type 'single-float

:initial-element 0.0))

Типи масивів

Масиви поділяються на універсальні масиви (general arrays), елементи яких можуть містити довільний лісповскій об'єкт, і спеціалізовані масиви (specialized arrays), про елементи якого відомо, що вони завжди одного типу (бітові, чисельні, рядкові і т.п.).

Масив може мати розмірність 0,1, 2, ... . 0-мірний масив складається рівно з одного елемента. Одномірні масиви, або вектори (vectors), утворюють важливий спеціальний клас масивів, з яким ми вже познайомилися у зв'язку з послідовностями. Для нього крім загальних дій над масивами і послідовностями визначені свої власні дії.

Робота з масивами

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

(AREF массив nl n2 ...nN)

n1 n2 ... nN - координати, або індекси (index), елемента, на який посилаються. В якості функції присвоювання використовується узагальнена функція присвоювання SЕТР. Наприклад, наступна директива привласнює елементу (512, 279) масиву ЕКРАН число 1.0:

(setf (aref экран 512 279) 1.0)

У наступному виклику рядок трактується як масив:

_(aref “Кошка” 1) ; строка в качестве массива

#\o ;

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

Хеш-масив асоціює дані

Крім звичних масивів з чисельними індексами можна також працювати з хеш-масивами (hash arrays). Хеш-масиви споріднені звичайному одномерному масиву і асоціативному списку. Якщо за допомогою масиву можна пов'язати об'єкти з числами, які є індексами, а за допомогою асоціативного списку-з символами, які є ключами, то хеш-масив дозволяє зв'язати два довільних лісповских об'єкта (атоми, списки, рядки, масиви, хеш-масснви і т.д.).

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

Хеш-масиви забезпечують швидкодію

Перевагою хеш-масивів є швидкість обчислень. Пошук даних, відповідних ключу, наприклад в асоціативному списку, припускає послідовний перегляд ключів до тих пір, поки шуканий ключ не знайдено. Замість цього в хеш-масиві місце зберігання, відповідне ключу, обчислюється безпосередньо по виду ключа за допомогою спеціальної хеш-функції. До шуканого елемента, таким чином, добираються за певний час незалежно від обсягу масиву.