Почему две разные концепции называются кучей?

Почему куча времени выполнения используется для динамического выделения памяти в языках стиля C и структура данных как называется "кучей"? Есть какая-то связь?


person Andrey Fedorov    schedule 09.11.2009    source источник
comment
Я задавался вопросом сегодня, изучая структуры данных.   -  person MitMaro    schedule 09.11.2009
comment
повторяющийся вопрос? http://stackoverflow.com/questions/756861/whats-the-relationship-between-a-heap-and-the-heap   -  person timB33    schedule 09.11.2009
comment
Откройте словарь английского языка и посчитайте количество записей в разделе «Выполнить». Сколько из более чем 40 записей относится к компьютерам? :)   -  person jmucchiello    schedule 10.11.2009
comment
Связанный пост здесь w.r.t. куча времени выполнения, используемая для распределения динамической памяти.   -  person RBT    schedule 04.01.2018


Ответы (9)


Дональд Кнут говорит (Искусство программирования, третье издание, том 1, стр. 435):

Некоторые авторы примерно в 1975 году начали называть пул доступной памяти «кучей».

Он не говорит, каких авторов, и не дает ссылок на какие-либо конкретные статьи, но говорит, что использование термина «куча» в отношении очередей с приоритетом является традиционным смыслом этого слова.

person James McNellis    schedule 09.11.2009
comment
Пул было бы лучше, чем куча. - person ; 09.11.2009
comment
Интересный. Кто-то должен спросить его, помнит ли он, каких авторов. - person Prof. Falken; 18.10.2011
comment
Википедия утверждает, что это потому, что на ранней стадии Lisp использовал кучу (структуру данных) для реализации своего хранилища памяти. Не сказано как. Его ссылка - Томас Х. Кормен, Чарльз Э. Лейзерсон, Рональд Л. Ривест (1990): Введение в алгоритмы. MIT Press / McGraw-Hill., Которого у меня нет. - person Steve Jessop; 25.07.2012
comment
У меня нет ссылки на это, но я предполагаю, что изначально структура данных, используемая для организации ссылок на открытые блоки памяти, была минимальной кучей. Похоже, это был бы, по крайней мере, достойный способ быстро найти наименьший блок памяти, который позволил бы вам хранить данные, которые вы пытались сохранить. Обновление: то, что я сказал, звучит в точности как блоки друзей en.wikipedia.org/wiki/Dynamic_memory_allocation#Buddy%5Fblocks - person Will; 17.01.2013
comment
@SteveJessop - Проверка Cormen, Leiserson, Rivest, Stein - 3-е издание (2009 г.), в начале главы Heapsort говорится только: «Термин« куча »изначально был придуман в контексте heapsort, но с тех пор он стал обозначать сборщик мусора. хранилище, такое как языки программирования Java и Lisp. Наша структура данных в куче не является хранилищем с собранным мусором, и всякий раз, когда мы говорим о кучах в этой книге, мы будем иметь в виду структуру данных, а не аспект сборки мусора ». CLRS - 2nd edition также имеет почти такую ​​же формулировку (нет никаких указаний на то, что Lisp использовал кучу). - person dr jimbob; 16.02.2013
comment
Также en.wikipedia.org/wiki/ обсуждает отсутствие доказательств для этой старой анонимной цитаты, а на страницах, посвященных динамическому распределению памяти, больше не говорится о лиспе или Кормене и др. - person dr jimbob; 16.02.2013
comment
Дональд прав, и это досадный конфликт имен. Особенно для тех, кто не является носителем языка, например, искренне ваш, что их первое знакомство со словом "куча" произошло в их курсе структуры данных. Я назвал это кучей, всегда думал, что это структура типа кучи, до сегодняшнего дня, когда я решил понять, как структура, подобная куче, используется для распределения памяти. Я слегка взбешен: / - person Pouya; 01.08.2017

У них одинаковое имя, но на самом деле они не похожи (даже концептуально). Куча памяти называется кучей так же, как вы называете корзину для белья «кучей одежды». Это имя используется для обозначения беспорядочного места, где память может быть выделена и освобождена по желанию. Структура данных (как указывает ссылка на Википедию, на которую вы ссылаетесь) совершенно иная.

person Andrew Hare    schedule 09.11.2009
comment
Да, я думаю, что именно на этом он основывает свой вопрос: они разные. Так почему они называются одним и тем же - есть ли какая-то основополагающая связь. - person Sean Owen; 09.11.2009
comment
Я так истолковал этот ответ, что нет никакой связи, поэтому он отвечает на вопрос. - person Laurence Gonsalves; 09.11.2009
comment
Эндрю отвечает на это. Нет никакого отношения. Просто совпадение. Куча памяти больше подходит для обычного использования, так как память распределяется как куча одежды. Однако структура данных требовала большего воображения. И это становится гораздо более интересным, почему. Название происходит от факта, что узлы упорядочены по ключу, а ключ родительского узла всегда ›=, чем его дочерний узел. - person Alexandre Bell; 09.11.2009
comment
Они определенно не связаны. Однако проблема с вызовом кучи заключается в том, что аналог кучи - стек - также является фактическим стеком. - person dan; 30.05.2012
comment
Я знаю, почему структура данных кучи называется кучей: потому что она удовлетворяет свойству кучи. Но почему свойство heap так называется? Для меня это не имеет смысла, так как имя типа «топ хэви» было бы намного лучше. - person Thomas Eding; 19.09.2012

Столкновение имен прискорбно, но не так уж и загадочно. Куча - это небольшое обычное слово, используемое для обозначения кучи, коллекции, группы и т. д. Использование этого слова для структуры данных предшествует (я почти уверен) имени пула. памяти. На самом деле, на мой взгляд, pool был бы гораздо лучшим выбором для последнего. Куча означает вертикальную структуру (например, стопку), которая соответствует структуре данных, но не пулу памяти. Мы не думаем о куче пула памяти как об иерархической, в то время как фундаментальная идея, лежащая в основе структуры данных, заключается в хранении самого большого элемента в верхней части кучи (и подкучках).

Куча структура данных восходит к середине 60-х; куча пула памяти, начало 70-х гг. Термин «куча» (означающий «пул памяти») использовался по крайней мере еще в 1971 году Wijngaarden при обсуждении Алгол.

Возможно, самое раннее использование heap в качестве структуры данных было обнаружено семью годами ранее в
Williams, JWJ, 1964. «Алгоритм 232 - Heapsort», Связь с ACM 7 (6): 347-348

person I. J. Kennedy    schedule 09.11.2009
comment
Да, но куча также подразумевает беспорядок, и куча памяти обычно неупорядочена. Куча структуры данных очень хорошо упорядочена. Итак, опять же, существует такое же несоответствие, идущее в другую сторону, основанное на общепринятом определении кучи. - person jmucchiello; 10.11.2009
comment
Он всегда вводится как противоположность stack, чего должно быть достаточно, чтобы объяснить название IMO. - person reinierpost; 07.01.2011
comment
Это не случайно - список свободных мест может быть реализован в виде очереди с приоритетом через биномиальную кучу. - person Heath Hunnicutt; 09.06.2011
comment
@jmucchiello: куча журналов (см. изображение) хорошо упорядочено и напоминает дерево. Это происхождение названия структуры данных согласно одному из моих учебников для бакалавриата. - person gioele; 28.10.2011

На самом деле, чтение о том, как распределяется память (см. Buddy Blocks), напоминает мне кучу в структурах данных.

person Traveling Tech Guy    schedule 09.11.2009
comment
Мой комментарий к ответу Питера Чжана также актуален здесь. Двоичная система друзей может быть представлена ​​как двоичное дерево, и она также выглядит как допустимая максимальная куча, когда ключом каждого узла является общая память под ней (но эти значения неявны и никогда не меняются. ). Насколько я могу судить, ни алгоритм распределения, ни алгоритм освобождения не используют операции с кучей в этом двоичном дереве. - person Eric Dubé; 28.08.2018

ИМО, это просто случайность / совпадение, что эти две совершенно не связанные между собой вещи имеют одно и то же имя. Это похоже на график и график.

person MAK    schedule 09.11.2009
comment
Хотя эти два графика могут быть как-то связаны. Представьте себе график функции следующим образом: область кортежа, диапазон) является вершиной, а ребро соединяет две такие вершины. - person ; 09.11.2009
comment
@Amit: Для непрерывных графов это будет означать бесконечное количество вершин. Это нормально, но это также делает бессмысленным понятие ребер между вершинами. Есть ли на графике функции f (x) = x * 2 ребро между (0,0) и (1,2)? Если да, как насчет (0,0) и (0,5,1)? (0,0) и (0,25,0,5)? Невозможно иметь понятие ребра между вершинами, так что на самом деле это не граф. - person MAK; 09.11.2009

Структура данных типа кучи используется алгоритмом поиска доступной памяти. Нижеследующее взято из http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html.

Когда вызывается new, он начинает поиск свободного блока памяти, размер которого соответствует вашему запросу. Предположим, что такой блок памяти найден, он помечается как зарезервированный и возвращается указатель на это место. Для этого существует несколько алгоритмов, поскольку необходимо найти компромисс между сканированием всей памяти для поиска наименьшего свободного блока, превышающего размер вашего объекта, или возвратом первого, где умещается необходимая память. Чтобы повысить скорость получения блока памяти, свободные и зарезервированные области памяти поддерживаются в структуре данных, подобной двоичным деревьям, называемым кучей.

person Peng Zhang    schedule 02.11.2014
comment
Я крайне скептически отношусь к этому, в частности ... свободные и зарезервированные области памяти поддерживаются в структуре данных, подобной двоичным деревьям, называемым кучей. Мне кажется, что автор догадывается, что существует связь, основываясь на куче имен, и, вероятно, ошибается. Может кто-нибудь подтвердить / опровергнуть? - person Don Hatch; 26.03.2016
comment
После небольшого исследования системы Binary Buddy (используемой в Linux) ее можно представить в виде двоичного дерева из-за того, как она разбивает данные. Это двоичное дерево выглядит как допустимая максимальная куча, если вы наблюдаете за узлами с точки зрения общей памяти, но узлы не вставляются в это двоичное дерево, поскольку они находятся в максимальной куче - узлы вставляются непосредственно в наименьший лист свободной памяти › = требуемый размер. 1 2 3 - person Eric Dubé; 28.08.2018

Разговорные термины «стековая память» и «куча» не используются в стандарте C ++. Стандарт использует статическое хранилище, хранилище потоков, автоматическое хранилище и динамическое хранилище.

Дополнительную информацию можно найти в разделе «Продолжительность хранения» стандарта.

Следовательно, с точки зрения языка и стандартной библиотеки нет никакой путаницы.

person R Sahu    schedule 16.03.2018

В. Что такое куча? A. Куча - это набор объектов, расположенных друг над другом.

Ответ на ваш вопрос: и куча памяти, и двоичная куча используют ту же концепцию, что и вы. Данные хранятся в виде кучи в памяти в том же порядке, что и записанные в программе, тогда как двоичная куча - это структура данных, которая следует той же концепции хранения данных упорядоченным образом в форме кучи (данные сверху другой). Дайте мне знать, что вы думаете, в разделе комментариев.

person Mayank Tolani    schedule 25.06.2019
comment
И куча памяти, и двоичная куча используют одну и ту же концепцию, как вы знаете. Куча памяти и структура данных кучи не имеют ничего общего - person Kaiyaha; 02.12.2020

Возможно, первая реализованная куча памяти управлялась структурой кучи?

person Community    schedule 09.11.2009
comment
Эта гипотеза вовсе не кажется очевидной - как вообще куча (структура данных) полезна для поддержки кучи (области динамической памяти)? - person Keith Randall; 09.11.2009
comment
-1. Я бы предпочел авторитетное заявление с доказательствами, а не предположения. - person Rob Kennedy; 09.11.2009
comment
Очень вряд ли. Кажется, нет веских причин использовать кучу (структуру данных) для управления кучей (пулом свободной памяти). - person jason; 09.11.2009