Структуры и алгоритмы обработки данных
Моделирование абстрактных типов данных для различных реализаций. Поиск информации в файлах данных. Эффективность алгоритмов сортировок для различных структур и размерностей данных. Реализация структур данных типа дерево и типовые алгоритмы их обработки.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 12.11.2017 |
Размер файла | 1,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
h = moveRedLeft(h); //то перекрашиваем в красный цвет дочерний узел слева
h.left = delete(h.left, key); //вызываем рекурсивно этот метод для узла слева
}
else
{
if (isRed(h.left)) //если узел слева красный, то
h = rotateRight(h); //вызываем правое вращение
if (key.compareTo(h.key) == 0 && (h.right == null)) //если значение ключа искомого узла равно значению ключа текущего узла и правый узел пустой, то
return null; //ничего не возвращать
if (!isRed(h.right) && !isRed(h.right.left)) //если узел А справа и левый узел узла А черные, то
h = moveRedRight(h); //перекрасить в красный цвет дочерний узел справа
if (key.compareTo(h.key) == 0) //если значение ключа искомого узла равно значению ключа текущего узла, то
{
Node x = min(h.right); //находим минимальный узел справа
h.key = x.key; //переприсваиваем удаленному узлу ключ минимального
h.val = x.val; //переприсваиваем удаленному узлу значение минимального
h.right = deleteMin(h.right); //удаляем минимальный узел
}
else h.right = delete(h.right, key); //иначе сделать то же самое для узла справа
}
return balance(h); //вернуть сбалансированное дерево
}
private Node rotateRight(Node h) //правое вращение узла h
{
Node x = h.left; //текущему узлу присваиваем левый узел узла h
h.left = x.right; //левому узлу h присваиваем правый узел текущего узла
x.right = h; //правому узлу текущего узла присваиваем узел h
x.color = x.right.color; //перекрашиваем текущий узел в цвет узла справа
x.right.color = RED; //узлу справа текущего узла х присваиваем красный цвет
x.N = h.N; //переприсваиваем значение числа узлов
h.N = size(h.left) + size(h.right) + 1; //считаем количество узлов, начиная с h
return x; //возвращаем текущий узел
}
private Node rotateLeft(Node h) //левое вращение
{
Node x = h.right; //текущему узлу присваиваем правый узел узла h
h.right = x.left; //правому узлу h присваиваем левый узел текущего узла
x.left = h; //левому узлу текущего узла присваиваем узел h
x.color = x.left.color; //перекрашиваем текущий узел в цвет узла слева
x.left.color = RED; //узлу слева текущего узла х присваиваем красный цвет
x.N = h.N; //переприсваиваем значение числа узлов
h.N = size(h.left) + size(h.right) + 1; //считаем количество узлов, начиная с h
return x; //возвращаем текущий узел
}
private void flipColors(Node h) //перекрашивание узлов
{
h.color = !h.color; //меняем цвет текущего узла на противоположный
h.left.color = !h.left.color; //меняем цвет левого узла на противоположный
h.right.color = !h.right.color; //меняем цвет правого узла на противоположный
}
private Node moveRedLeft(Node h) //перекрасить в красный цвет дочерний узел слева
{
flipColors(h); //перекрасить узел h и его дочерние узлы
if (isRed(h.right.left)) //если левый узел правого узла h красный, то
{
h.right = rotateRight(h.right); //правый узел - результат правого вращения
h = rotateLeft(h); //узел - результат левого вращения
}
return h; //вернуть узел
}
// Предполагая, что узел h красный и правый узел и левый узел правого узла черные, сделать правый узел h или один из дочерних узлов красным
private Node moveRedRight(Node h) //перекрасить в красный цвет дочерний узел справа
{
flipColors(h); //перекрасить узел h и его дочерние узлы
if (isRed(h.left.left)) //если левый узел левого узла h красный, то
h = rotateRight(h); //узел - результат правого вращения
return h; //вернуть узел
}
private Node balance(Node h) //восстановление красно-черного дерева
{
if (isRed(h.right)) h = rotateLeft(h); //если узел справа красный, то левое вращение
if (isRed(h.left) && isRed(h.left.left)) h = rotateRight(h); //если узел А слева и левый узел В узла А красные, то правое вращение
if (isRed(h.left) && isRed(h.right)) flipColors(h); //если оба дочерних узла красные, то перекрасить узлы
h.N = size(h.left) + size(h.right) + 1; //посчитать количество узлов
return h; //вернуть узел
}
public int height() //высота дерева
{
return height(root); //вызов метода с ссылкой на корень дерева
}
private int height(Node x) //метод вычисления высоты дерева
{
if (x == null) //если корень пустой, то
return -1; //вернуть -1
return 1 + Math.max(height(x.left), height(x.right)); //вернуть 1 + (максимальная высота из левого и правого поддеревьев)
}
public Key min() //минимальное значение ключа
{
if (isEmpty()) //если дерево пустое, вернуть
return null; //null
return min(root).key; //вызвать метод поиска минимального ключа
}
private Node min(Node x) //поиск минимального ключа
{
if (x.left == null) //если узла слева нет, то
return x; //вернуть текущий узел
else //иначе
return min(x.left); //вызываем рекурсивно метод для узла слева
}
public Key max() //максимальное значение ключа
{
if (isEmpty()) return null; //если дерево пустое, вернуть null
return max(root).key; //вызвать метод поиска максимального ключа
}
private Node max(Node x) //поиск максимального ключа
{
if (x.right == null) return x; //если узла справа нет, то вернуть текущий узел
else return max(x.right); //иначе вызвать рекурсивно этот метод для узла справа
}
public int rank(Key key) //количество ключей, меньших или = заданному
{
return rank(key, root); //вызов метода
}
private int rank(Key key, Node x) //количество ключей, меньших или = заданному, начиная с х
{
if (x == null) return 0; //если узел пустой, вернуть 0
int cmp = key.compareTo(x.key); //сравнение ключа текущего узла и заданного ключа
if (cmp < 0) return rank(key, x.left); //если заданный меньше, то вызываем рекурсивно метод для левого узла
else if (cmp > 0) return 1 + size(x.left) + rank(key, x.right); //иначе если заданный больше, то вызываем рекурсивно метод для правого узла
else return size(x.left); //иначе возвращаем количество
}
public Iterable<Key> keys() //все ключи
{
return keys(min(), max()); //вернуть все ключи
}
public Iterable<Key> keys(Key lo, Key hi) //все ключи
{
Queue<Key> queue = new LinkedList <Key>(); //очередь для добавления ключей в порядке возрастания
keys(root, queue, lo, hi); //добавление ключей в очередь
return queue; //вернуть очередь
}
public void keys(Node x, Queue<Key> queue, Key lo, Key hi) //добавление ключей в очередь, начиная с узла х, между минимальным и максимальным
{
if (x == null) return; //если узел пустой, выйти из метода
int cmplo = lo.compareTo(x.key); //сравнение с меньшим
int cmphi = hi.compareTo(x.key); //сравнение с большим
if (cmplo < 0) keys(x.left, queue, lo, hi); //если меньше меньшего, выполнить рекурсивно метод для левого узла
if (cmplo <= 0 && cmphi >= 0) queue.add(x.key); //если меньше или = меньшему или больше или = большему, то просто добавить в очередь
if (cmphi > 0) keys(x.right, queue, lo, hi); //если больше большего, то выполнить рекурсивно метод для правого узла
}
public int size(Key lo, Key hi) //количество ключей между меньшим и большим ключами
{
if (lo.compareTo(hi) > 0) return 0; //если разница между наименьшим и наибольшим больше 0, то вернуть 0
if (contains(hi)) return rank(hi) - rank(lo) + 1; //если дерево содержит наибольший, то вернуть количество ключей между наибольшим и наименьшим +1
else return rank(hi) - rank(lo); //иначе вернуть количество ключей между наибольшим и наименьшим
}
private boolean isBalanced(Node x, int black) //сбалансированно ли дерево
{
if (x == null) return black == 0; //если текущая узел пустой, вернуть 0 черных узлов
if (!isRed(x)) black++; //если узел черный, пересчитать черные узлы
return isBalanced(x.left, black) && isBalanced(x.right, black); //вернуть, сбалансированно ли дерево справа и слева
}
}
Приложение Д
Класс main()
import java.util.Scanner;
public class main
{
public static void main (String args[])
{
Scanner scan = new Scanner(System.in); //создание объекта для ввода с клавиатуры
System.out.println("Тестирование хеш-таблицы\n\n");
System.out.println("Введите размер таблицы");
HashTable ht = new HashTable(scan.nextInt()); //создание экземпляра таблицы
char ch; //символ при вводе "n" или "у"
do //действия при нажатии "y" (да)
{
System.out.println("\nОперации хеш-таблицы\n");
System.out.println("1. Вставка ");
System.out.println("2. Удаление");
System.out.println("3. Найти по ключу");
int choice = scan.nextInt(); //считывание номера операции
switch (choice) //варианты:
{
case 1 : //при нажатии "1"
System.out.println("Введите ключ и значение");
ht.insert(scan.next(), scan.nextInt()); //считывание ключа и значения
break; //прерывание действия
case 2 : //при нажатии "2"
System.out.println("Введите ключ");
ht.remove(scan.next()); //удаление по ключу
break; //прерывание
case 3 : //при нажатии "3"
System.out.println("Введите ключ");
System.out.println("Значение искомого ключа = "+ ht.get(scan.next())); //вывод значения ключа
break; //прерывание
default : //при вводе некорректного символа
System.out.println("Ошибка \n ");
break; //прерывание
}
ht.printHashTable(); //отображение хеш-таблицы
System.out.println("\nХотите продолжить? (Введите y или n)\n");
ch = scan.next().charAt(0); //чтение символа у или n
}
while (ch == 'Y'|| ch == 'y'); //условие при выполнении действий с хеш-таблицей
}
}
Класс HashTable
public class HashTable //класс хеш-таблицы
{
private int TABLE_SIZE; //размер таблицы для создания объекта HashEntry
private int size; //размер таблицы
private HashEntry[] table; //таблица
private int primeSize; //размер таблицы (для вычисления хеш-функции)
public HashTable(int ts) //конструктор
{
size = 0;
TABLE_SIZE = ts;
table = new HashEntry[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++)
table[i] = null;
primeSize = getPrime();
}
public int size()
{
return this.size;
}
public int getPrime() //получить число, меньшее, чем размер таблицы для вычисления функции myhash2
{
for (int i = TABLE_SIZE - 1; i >= 1; i--) //рассматриваем весь размер таблицы
{
int fact = 0; //счетчик
for (int j = 2; j <= (int) Math.sqrt(i); j++) //рассматриваем числа от 2 до корень(i)
if (i % j == 0)//если от деления нет остатка, то
fact++; //прибавляем 1
if (fact == 0) //если в счетчике ничего не было,
return i; //вернуть размер таблицы-1
}
return 3; //вернуть 3
}
public int get(String key) //получить значение по ключу
{
int hash1 = myhash1( key ); //вычисление функции myhash1
int hash2 = myhash2( key ); //вычисление функции myhash2
while (table[hash1] != null) //пока просмотр таблицы не окончится
{
if (table[hash1].key.equals(key)) //если значение ключа равно искомому,
return table[hash1].value; //возвратить значение найденного ключа
hash1 += hash2; //вычисляем хеш-функцию
hash1 %= TABLE_SIZE; //вычисляем хеш-значение
}
return -1; //ключ не найден
}
public void insert(String key, int value) //добавление в таблицу пары ключ-значение
{
if (size == TABLE_SIZE) //если размер таблицы равен уже заданному размеру, то
{
System.out.println("Таблица заполнена");
return;
}
int hash1 = myhash1( key ); //вычисление функции myhash1
int hash2 = myhash2( key ); //вычисление функции myhash2
while (table[hash1] != null) //пока просмотр таблицы не окончится
{
hash1 += hash2; //вычисляем хеш-функцию
hash1 %= TABLE_SIZE; //вычисляем хеш-значение
}
table[hash1] = new HashEntry(key, value); //создаем новое значение таблицы
size++; //увеличиваем размер на 1
}
public void remove(String key) //удаление по ключу
{
int hash1 = myhash1( key ); //вычисление функции myhash1
int hash2 = myhash2( key ); //вычисление функции myhash2
while (table[hash1] != null && !table[hash1].key.equals(key)) //пока просмотр таблицы не окончится и значение ключа не равно искомому,
{
hash1 += hash2; //вычисляем хеш-функцию
hash1 %= TABLE_SIZE; //вычисляем хеш-значение
}
table[hash1] = null; //очищаем значение таблицы
size--; //уменьшаем размер таблицы на 1
}
private int myhash1(String x ) //хеш-функция, которая дает хеш-значение для ключа (String)
{
int hashVal = x.hashCode( ); //получение хеш-кода
hashVal %= TABLE_SIZE; //хеш-значение
if (hashVal < 0) //если хеш-значение меньше нуля, то
hashVal += TABLE_SIZE; //прибавим к нему размер таблицы
return hashVal; //вернуть хеш-значение
}
private int myhash2(String x ) //хеш-функция для двойного хеширования
{
int hashVal = x.hashCode( ); //получение хеш-кода
hashVal %= TABLE_SIZE; //хеш-значение
if (hashVal < 0) //если хеш-значение меньше нуля, то
hashVal += TABLE_SIZE; //прибавим к нему размер таблицы
return primeSize - hashVal % primeSize; //вернуть хеш-значение (размер таблицы - остаток от деления хеш-значения на размер таблицы)
}
private int hashFunc2 (String key) //хеш-функция умножением
{
float f; //индекс в таблице (массиве)
float A=(float) 0.6180339887499; //любое число в диапазоне 0..1
int sss=key.length(); //получение длины ключа
f = sss * A; //умножить ключ на константу А=(sqrt(5)-1)/2
f = f - (int) f; // взять дробную часть
return (int) (size*f); // возвратить число в диапазоне 0...size-1
}
private int hashFunc3 (String key) //хеш-функция делением с остатком
{
int len=key.length(); //получение длины ключа
int j=len%TABLE_SIZE; //остаток от деления на размер таблицы
return j; //вернуть значение
}
public void printHashTable() //вывод хеш-таблицы
{
System.out.println("\nХеш-таблица");
for (int i = 0; i < TABLE_SIZE; i++) //рассматриваем весь размер таблицы
if (table[i] != null) //если таблица не пуста, то
System.out.println(table[i].key +" "+table[i].value); // вывести ключ и значение ключа
}
}
Класс HashEntry
public class HashEntry //класс для создания таблицы
{
String key; //ключ
int value; //значение ключа
public HashEntry(String key, int value) //конструктор при создании таблицы
{
this.key = key;
this.value = value;
}
}
Размещено на Allbest.ru
...Подобные документы
Изучение применяемых в программировании и информатике структур данных, их спецификации и реализации, алгоритмов обработки данных и анализ этих алгоритмов. Программа определения среднего значения для увеличивающегося количества чисел заданного типа.
контрольная работа [16,0 K], добавлен 19.03.2015Сущность языка программирования, идентификатора, структуры данных. Хранение информации, алгоритмы их обработки и особенности запоминающих устройств. Классификация структур данных и алгоритмов. Операции над структурами данных и технология программирования.
контрольная работа [19,6 K], добавлен 11.12.2011Обработка текстовых данных, хранящихся в файле. Задачи и алгоритмы обработки больших массивов действительных и натуральных чисел. Практические задачи по алгоритмам обработки данных. Решение задачи о пяти ферзях. Программа, которая реализует сортировку Шел
курсовая работа [29,2 K], добавлен 09.02.2011Формы представляемой информации. Основные типы используемой модели данных. Уровни информационных процессов. Поиск информации и поиск данных. Сетевое хранилище данных. Проблемы разработки и сопровождения хранилищ данных. Технологии обработки данных.
лекция [15,5 K], добавлен 19.08.2013Алгоритмы обработки массивов данных. Система управления базами данных. Реляционная модель данных. Представление информации в виде таблицы. Система управления базами данных реляционного типа. Графический многооконный интерфейс.
контрольная работа [2,8 M], добавлен 07.01.2007Термины "логический" и "физический" как отражение различия аспектов представления данных. Методы доступа к записям в файлах. Структура систем управления базами данных. Отличительные особенности обработки данных, характерные для файловых систем и СУБД.
лекция [169,7 K], добавлен 19.08.2013Концепции хранилищ данных для анализа и их составляющие: интеграции и согласования данных из различных источников, разделения наборов данных для систем обработки транзакций и поддержки принятия решений. Архитектура баз для хранилищ и витрины данных.
реферат [1,3 M], добавлен 25.03.2013Структуры и алгоритмы обработки данных, представленных в виде пирамиды (максимальной или минимальной – по выбору пользователя). Преобразование массива в пирамиду. Включение элемента в пирамиду и удаление элемента из пирамиды. Вывод пирамиды на экран.
курсовая работа [2,4 M], добавлен 16.03.2011Организация данных с помощью бинарных деревьев. Определение бинарного дерева. Упорядоченное двоичное дерево поиска и его свойства. Программная реализация добавления данных в упорядоченное двоичное дерево с использованием динамических структур данных.
курсовая работа [459,0 K], добавлен 09.08.2012Линейный односвязный список (ЛОС) из введенных данных с клавиатуры с заданным указателем sag, работающий с типом данных Integer. Вывод информационных сообщений. Подсчет количества идентичных по содержанию элементов. Ввод данных в диалоговом режиме.
лабораторная работа [36,3 K], добавлен 03.03.2009Анализ характеристик объекта компьютеризации. Разработка структур данных, алгоритмов и программного обеспечения системы управления базой данных. Особенности синтеза структур данных. Разработка алгоритмов системы и оценка результатов тестирования.
курсовая работа [37,0 K], добавлен 07.12.2010Определение понятия структур данных. Рассмотрение информации и ее представления в памяти. Особенности непозиционных и позиционных систем счисления. Классификация структур данных, операции над ними. Структурность данных и технология программирования.
презентация [359,3 K], добавлен 20.05.2015Изучение существующих методов и программного обеспечения для извлечения числовых данных из графической информации. Программное обеспечение "graphtrace", его структура и методы обработки данных. Использование этой системы для данных различного типа.
дипломная работа [3,9 M], добавлен 06.03.2013Рассмотрение общей характеристики данных. Исследование особенностей и назначения линейных, табличных и иерархических структур данных, анализ процесса их упорядочения. Рассмотрение основных режимов обработки данных. Описание алгоритма решения задачи.
реферат [27,4 K], добавлен 20.04.2019Системы автоматизированной обработки информации. Хранение большого объема информации. Понятие базы данных (БД). Обеспечение секретности данных. Уровни представления данных в БД. Логическая структура данных. Ограничения, накладываемые на данные.
реферат [65,2 K], добавлен 26.11.2011Проблемы с организацией данных. Определение и классификация динамических структур данных. Линейные односвязные, двухсвязные, кольцевые списки. Очередь, стеки. Описание основных типов данных и функции для работы с ними. Листинг программы, пример ее работы.
контрольная работа [290,6 K], добавлен 17.07.2012Процессы обработки информации. Эффективность автоматизированной информационной системы. Система управления базой данных. Локальная и распределенная система банков и баз данных. Этапы проектирования базы данных. Различие уровней представления данных.
контрольная работа [75,7 K], добавлен 07.07.2015Разработка вычислительной структуры, реализующей заданный набор операций для обработки запросов в реляционной базе данных (БД). Описание общей структуры системы с машиной баз данных. Разработка схем исполнительных процессоров и алгоритмов их операций.
реферат [140,3 K], добавлен 27.10.2010Система компьютерной обработки данных для сбора, систематизации, статистической обработки, анализа результатов учебного процесса за четверть, полугодие, год. Модуль обработки данных о качестве обучения, итогов успеваемости и данных о движении учащихся.
реферат [22,5 K], добавлен 05.02.2011Рассмотрение правил записи, способов ввода и вывода, использования функций обработки символьных данных в Pascal. Описание алгоритмизации и программирования файловых структур данных, проектирования структуры файла. Ознакомление с работой данных массива.
курсовая работа [336,2 K], добавлен 27.06.2015