SafronovBA@8v83_saod4

advertisement
Научно-исследовательский университет
Томский политехнический университет
Институт Кибернетики
Кафедра ОСУ
Структуры и алгоритмы обработки данных
ЛАБОРАТОРНАЯ РАБОТА № 4
«ОСВОЕНИЕ ТЕХНОЛОГИИ РЕАЛИЗАЦИИ ПОЗИЦИОННЫХ, ЛИНЕЙНЫХ
КОЛЛЕКЦИЙ НА ПРИМЕРЕ АТД "СПИСОК"»
Выполнил
студент группы 8В83
Б.А. Сафронов
Проверил
ассистент каф. ОСУ
А.В. Черний
Томск 2010
Цель работы
Освоение технологии реализации позиционных, линейных коллекций на примере
АТД "Список". Освоение методики тестирования трудоёмкости реализации коллекций.
Задание (14):
Структура данных - кольцевая, двусвязная, на базе адресных указателей.
Интерфейс АТД "Список" включает следующие операции:
опрос размера списка,
очистка списка,
проверка списка на пустоту,
опрос наличия элемента с заданным значением,
доступ к значению элемента с заданным номером в списке,
получение позиции в списке элемента с заданным значением,
включение нового элемента в позицию с заданным номером,
удаление элемента из позиции с заданным номером,
Для тестирования эффективности операций интерфейс АТД "Список" включить
дополнительную операцию:
опрос числа элементов списка, просмотренных операцией.
Формат АТД
Структура данных - кольцевая, односвязная, на базе адресных указателей.
Шаблонный класс
package soad4;
public interface ListInt {
void Add(Object o);//добавление объекта всписок
int size();//размер списка
void makeEmpty();//очистить список
boolean isEmpty();//проверка списка на пустоту
boolean isExist(Object o);//наличие элемента с заданным значением
boolean isExist(int position);//наличие элемента с заданной позицией
Object getItem(int position);//запрос узла списка с заданной позицией
Object getElement(int position);//запрос элемента с заданной позицией
int getPosition(Object o);//запрос позиции элемента
void setItem(Object o, int position);//замена
void deleteItem(int position);//удаление
}
class ListItem {
public ListItem() {
element = null;
next = null;
}
public ListItem(Object theElement) {
element = theElement;
next = null;
}
public ListItem(Object theElement, ListItem n) {
element = theElement;
next = n;
}
public Object element;//объект
public ListItem next;//ссылка на следующий элемент
}
Описание методики тестирования трудоёмкости операций
Трудоемкость операций зависит от того как «глубоко» находиться элемент в
списке. И определяется тем где находиться элемент в списке и ко скольким элементам при
этом происходит обращение.
Исследование трудоемкости операций
Временная сложность основных операций с динамическим типом данных список имеет
вид T(n) = O(n)
Зависимость числа просматриваемых элементов от размера массива:
14
12
10
8
Вставка
Удаление
6
Поиск
4
2
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Из графика видно ,что операции поиска, удаления и вставки имеют одинаковое
линейное поведение и линейно зависят от размера списка. Эти значения подтверждают
теоретические.
Листинг алгоритма(Java)
package soad4;
public class Main {
public static void main(String[] args) {
List list = new List();
System.out.println("-----проверка списка на пустоту-----");
list.StatisticClear();
if (list.isEmpty()) {
System.out.println("Список пустой");
} else {
System.out.println("Список не пустой");
}
System.out.println("-----добавление элементов в список-----");
for (int i = 0; i < 10000; i++) {
list.Add(i);
}
//опрос размера списка
System.out.println("-----опрос размера списка-----");
System.out.println(list.size());
list.Add(12);
System.out.println(list.size());
//проверка списка на пустоту
System.out.println("-----проверка списка на пустоту-----");
list.StatisticClear();
if (list.isEmpty()) {
System.out.println("Список пустой");
} else {
System.out.println("Список не пустой");
}
System.out.println("Количество операций:" + list.StatisticGet());
//опрос наличия элемента с заданным значением
System.out.println("-----опрос наличия элемента с заданным значением-----");
list.StatisticClear();
if (list.isExist(60)) {
System.out.println("Элемент с значением 60 существует");
} else {
System.out.println("Элемента с значением 60 не существует");
}
System.out.println("Количество операций:" + list.StatisticGet());
//доступ к значению элемента с заданным номером в списке
System.out.println("-----доступ к значению элемента с заданным номером в списке-----");
list.StatisticClear();
ListItem h = (ListItem) list.getItem(200);
int k = (Integer) h.element;
System.out.println("Значение элемента списка № 200: " + k);
System.out.println("Количество операций:" + list.StatisticGet());
//получение позиции в списке элемента с заданным значением
System.out.println("-----получение позиции в списке элемента с заданным значением-----");
list.StatisticClear();
k = list.getPosition(10);
System.out.println("Позиция элемента со значением 10:" + k);
System.out.println("Количество операций:" + list.StatisticGet());
//включение нового элемента в позицию с заданным номером
System.out.println("-----включение нового элемента в позицию с заданным номером-----");
list.StatisticClear();
list.setItem(200, 200);
System.out.println("Количество операций:" + list.StatisticGet());
//удаление элемента из позиции с заданным номером
System.out.println("-----удаление элемента из позиции с заданным номером-----");
list.StatisticClear();
list.deleteItem(300);
System.out.println("Количество операций:" + list.StatisticGet());
}}
Output:
-----проверка списка на пустоту----Список пустой
-----добавление элементов в список---------опрос размера списка----10000
10001
-----проверка списка на пустоту----Список не пустой
Количество операций:1
-----опрос наличия элемента с заданным значением----Элемент с значением 60 существует
Количество операций:10005
-----доступ к значению элемента с заданным номером в списке----Значение элемента списка № 200: 200
Количество операций:10206
-----получение позиции в списке элемента с заданным значением----Позиция элемента со значением 10:10
Количество операций:13
-----включение нового элемента в позицию с заданным номером----Количество операций:20213
-----удаление элемента из позиции с заданным номером----Количество операций:50629
Download