Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2013, 11:54   #1
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
Восклицание Работа с кучей.

Вот имеется задачка такого вида:



Есть немного кода:

Код:
var
  heap, place : array[1 .. MaxN] of integer; 
  hs : integer;

//"Всплывание" n-ого элемента кучи

procedure siftup(n : integer);
var
  t : integer;
begin
  if n = 1 then exit;
  if heap[n] > heap[n div 2] then begin
    t := heap[n];
    heap[n] := heap[n div 2];
    heap[n div 2] := t;
    place[heap[n]] := n;
    place[heap[n div 2]] := n div 2;
    siftup(n div 2);
  end;
end;

//Добавление элемента x в кучу

procedure ins(x : integer);
begin
  inc(hs);
  heap[hs] := x;
  place[x] := hs;
  siftup(hs);
end;
А дальше тупик, не пойму общую суть задачи, и входные / выходные данные тоже... Разъясните плиз.
iCaesy вне форума Ответить с цитированием
Старый 29.09.2013, 12:08   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Дается куча.. Где 6 элементов.. Вы загоняете эти 6 элементов в массив.. Далее Вы читаете кол-во элементов, приоритет которых нужно изменить (пусть их будет N) Далее крутим цикл от 1 до N. Читаем 2 числа : elem и key и Inc (a[elem], key). Далее Sift_Up'пим.. вуаля.. (не забываем после этого запомнить новое место)
Poma][a вне форума Ответить с цитированием
Старый 29.09.2013, 12:17   #3
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Ну теперь хоть что-то понятно.
А что за числа elem key ?

И по поводу входных данных, первые две строчки понятно, первая это размер массива, вторая его элементы, а 3,4,5 не пойму ...
iCaesy вне форума Ответить с цитированием
Старый 29.09.2013, 12:47   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

3 - N кол-во элементов приоритет которых надо изменить
Далее идет elem key ... elem - индекс кучи (см. рисунок - красненькое) key - значение на которое нужно увеличить..
Изображения
Тип файла: jpg heap.jpg (6.4 Кб, 75 просмотров)
Poma][a вне форума Ответить с цитированием
Старый 29.09.2013, 14:04   #5
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Ужс.. Ладно спасибо, будем разбираться...
iCaesy вне форума Ответить с цитированием
Старый 29.09.2013, 19:05   #6
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Пошаманил немного, вот что получилось, гляньте плз, вроде все верно но выводит не в том порядке как нужно...

Код:
const
  MaxN = MaxByte;

var
  heap, place: array[1.. MaxN] of integer; 
  hs: integer;
  index, znach, kol, i, size: byte;


//"Всплывание" n-ого элемента кучи

procedure siftup(n: integer);
var
  t: integer;
begin
  if n = 1 then exit;
  if heap[n] > heap[n div 2] then begin
    t := heap[n];
    heap[n] := heap[n div 2];
    heap[n div 2] := t;
    place[heap[n]] := n;
    place[heap[n div 2]] := n div 2;
    siftup(n div 2);
  end;
end;

//Добавление элемента x в кучу

procedure ins(x: integer);
begin
  inc(hs);
  heap[hs] := x;
  place[x] := hs;
  siftup(hs);
end;

procedure update(pos: byte; value: byte);
var
  temp: byte;
begin
  temp := heap[pos];
  heap[pos] := heap[pos] + value;
  siftup(hs);
end;

begin
  
  writeln('Введите кол-во элементов кучи: ');
  readln(size);
  for i := 1 to size do
  begin
    writeln('Введите ', i, '-й элемент');
    ins(ReadInteger());
  end;
  
  writeln('Сколько чисел будем менять: ');
  readln(kol);
  
  for i := 1 to kol do
  begin
    writeln('Введите индекс ', i, ' го элемента');
    readln(index);
    writeln('Введите значение для изменения');
    readln(znach);
    update(index,znach);
  end;
  
  for i := 1 to size do 
  begin
  writeln(heap[i])
  end;
end.
iCaesy вне форума Ответить с цитированием
Старый 29.09.2013, 19:43   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Код:
const
  MaxN = 100;

var
  heap : array[1.. MaxN] of integer; 
  hs: integer;
  index, znach, kol, i, size: byte;


//"Всплывание" n-ого элемента кучи

procedure siftup(n: integer);
var
  t: integer;
begin
	if n = 1 then
		Exit;
  if heap[n] > heap[n div 2] then begin
    t := heap[n];
    heap[n] := heap[n div 2];
    heap[n div 2] := t;
    siftup(n div 2);
  end;
end;

//Добавление элемента x в кучу

procedure ins(x: integer);
begin
  inc(hs);
  heap[hs] := x;
  siftup(hs);
end;

procedure update(pos: byte; value: byte);
begin
  heap[pos] := heap[pos] + value;
  siftup(pos); 
end;

var
	t : Integer;
begin

	hs := 0;
  writeln('Введите кол-во элементов кучи: ');
  readln(size);
  for i := 1 to size do
  begin
    ReadLn (t);
    ins(t);
  end; 

  
  writeln('Сколько чисел будем менять: ');
  readln(kol);
  
  for i := 1 to kol do
  begin
    writeln('Введите индекс ', i, ' го элемента');
    readln(index);
    writeln('Введите значение для изменения');
    readln(znach);
    update(index,znach);
  end;
  
  for i := 1 to hs do 
  begin
  writeln(heap[i])
  end;
end.
Poma][a вне форума Ответить с цитированием
Старый 29.09.2013, 21:14   #8
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Понял спасибо.
iCaesy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритмы сортировки пирамидальный(кучей) и быстрой сортировки (с++) mmd12 Помощь студентам 4 17.05.2012 14:14
Вирус с кучей примочек: выезжает дисковод, всякие сообщения и т.д. Yaga Безопасность, Шифрование 69 06.03.2012 12:41
IE + ActiveX + проблему с кучей и стеком vladgolovkov Общие вопросы C/C++ 0 16.04.2009 11:10
Связь с кучей dbf файлов (таблиц) через OLEDB через UNION ALL Sasha811 SQL, базы данных 0 01.01.2009 14:04