Чому два різних поняття обидва називають “купою”?


170

Чому купу виконуваної динаміки використовують для динамічного розподілу пам'яті на мовах С-стилю, а структуру даних називають "кучкою"? Чи є якесь відношення?


4
Мені це було цікаво сьогодні, вивчаючи структури даних.
MitMaro


3
Перейдіть до словника англійської мови та підрахуйте кількість записів у розділі "Виконати". Скільки записів 40+ застосовуються до комп'ютерів? :)
jmucchiello


Пов’язана публікація тут у купі виконання програми для динамічного розподілу пам'яті.
RBT

Відповіді:


77

Дональд Кнут говорить (Мистецтво комп’ютерного програмування, Третя редакція, т. 1, стор. 435):

Кілька авторів почали близько 1975 року називати пул доступної пам'яті "купою".

Він не каже, хто з авторів і не посилається на якісь конкретні статті, але каже, що використання терміна "купа" стосовно пріоритетних черг є традиційним сенсом цього слова.


11
Басейн буде кращою назвою, ніж купа.

7
Цікаво. Хтось повинен запитати його, чи пам’ятає він, яких авторів.
Проф. Фолкен

27
Вікіпедія стверджує, що це тому, що на ранній стадії Лісп використовував купу (структуру даних) для реалізації свого сховища пам'яті. Це не говорить як. Його посилання - "Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest (1990): Вступ до алгоритмів. MIT Press / McGraw-Hill.", Якого у мене немає.
Стів Джессоп

2
Я не маю посилання на це, але я здогадуюсь, що спочатку структура даних, що використовується для організації посилань на відкриті блоки пам'яті, становила хв. Схоже, це був би принаймні пристойний спосіб швидкого пошуку найменшого блоку пам'яті, який би дозволив вам зберігати дані, які ви намагалися зберігати Оновлення: Те, що я сказав, звучить точно так, як блоки приятелів en.wikipedia.org/wiki/Dynamic_memory_allocation # Buddy% 5Fblocks
Will

4
@SteveJessop - Перевірка Кормен, Лейзерсон, Рівест, Штейн - 3-е видання (2009) на початку розділу "Хепсорт", вона говорить лише про те, що "Термін" купа "спочатку був введений у контексті великої кількості, але з тих пір він посилається на" сховище, зібране зі сміттям ", як-от мови програмування, передбачені Java та Lisp. Наша структура даних купи - це не сховище, яке збирають сміття, і щоразу, коли ми посилаємось на купи в цій книзі, ми маємо на увазі структуру даних, а не аспект збору сміття. " У CLRS - другому виданні також є майже точно такі ж фрази (немає вказівки на те, що Лісп використовував купу).
dr jimbob

64

Вони мають одне ім’я, але вони насправді не схожі (навіть концептуально). Купа пам'яті називається купою так само, як ви б називали кошик для білизни як "купа одягу". Ця назва використовується для вказівки дещо безладного місця, де пам'ять може бути розподілена і розміщена за бажанням. Структура даних (як вказує посилання на Вікіпедію, на яку ви вказуєте посилання) зовсім інша.


8
Так, я думаю, що це швидше питання, на якому він спирається на своє питання: вони різні. То чому їх називають одним і тим же - чи є якесь основне відношення.
Шон Оуен

9
Те, як я інтерпретував цю відповідь, - «ні, немає базового відношення», тому він відповідає на питання.
Лоуренс Гонсалвс

Андрій відповідає на це. Немає ніякого відношення. Просто збіг обставин. Купа пам’яті більше відповідає загальному використанню, оскільки пам'ять розподіляється так, ніби «купа одягу». Однак структура даних вимагала більшого розмаху уяви. І це стає набагато цікавішим "чому". Назва походить від фактичних вузлів, розташованих за їхнім ключем, і батьківський ключ вузла завжди> =, ніж його дочірній вузол.
Олександр Белл

6
Вони, безумовно, не пов'язані між собою. Однак проблема з назвою "купи" полягає в тому, що "аналог" купи - "стек" - також є фактичним стеком.
дан

1
Я знаю, чому структуру даних heap називають heap: тому що вона задовольняє властивості heap. Але чому властивість купи називається такою? Для мене це не має сенсу, так як назва на кшталт "топ-важкий" була б набагато кращою.
Томас Едінг

31

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

Купа даних даних сягає середини 60-х років; купа пам'яті, початок 70-х. Термін купа (означає пул пам’яті) був використаний принаймні ще в 1971 році Війнгаардом в дискусіях про Алгола.

Можливо, найдавніше використання купи як структури даних було знайдено на сім років раніше в
Williams, JWJ 1964 р. "Алгоритм 232 - Heapsort", повідомлення ACM 7 (6): 347-348


1
Так, але купа також передбачає розлад, і купи пам'яті, як правило, невпорядковані. Купа даних структури надзвичайно добре впорядкована. Отже, знову ж таки, рівномірна невідповідність йде іншим шляхом, заснованим на загальному визначенні купи.
jmucchiello

Він завжди вводиться як протилежний стеку, якого повинно вистачити для пояснення назви IMO.
reinierpost

1
Це не випадково - вільний список може бути реалізований як черговість з пріоритетом через біноміальну купу.
Хіт Ханнікутт

2
@jmucchiello: купа колод (див. малюнок ) добре впорядкована і нагадує дерево. Це походження назви структури даних відповідно до одного з моїх підручників для студентів.
gioele

6

Насправді, читання про те, як розподіляється пам’ять (див. Блоки Бдді ), нагадує про купу даних.


Мій коментар до відповіді Пітера Чжана також доречний тут. Двійкова система приятелів може бути представлена ​​як двійкове дерево, і вона також виглядає як дійсна максимальна купа, коли "ключем" кожного вузла є загальна пам'ять під ним (але ці значення неявні і ніколи не змінюються). Наскільки я можу сказати, ні алгоритм розподілу, ні звільнення не використовують операції купи на цьому бінарному дереві.
Ерік Дубе

5

ІМО - це лише випадковість / збіг обставин, що ці дві абсолютно не пов'язані між собою речі мають однакову назву. Це як графік та графік .


Два графіки можуть хоч якось пов'язані. Уявіть графік функції наступним чином: домен кортежу, діапазон) - це вершина, а край з'єднує дві такі вершини

2
@Amit: для безперервних графіків, що означало б нескінченну кількість вершин. Це нормально, але це також робить безглузді поняття ребер між вершинами. На графіку функції f (x) = x * 2, чи є край між (0,0) та (1,2)? Якщо так, то як щодо (0,0) та (0,5,1)? (0,0) та (0,25,0,5)? Поняття краю між вершинами не існує, тому це насправді не графік.
МАК

5

Купова структура даних використовується алгоритмом пошуку доступного розподілу пам'яті. Далі викладено з http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .

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


1
Я вкрай скептично ставлюсь до цього, зокрема "... вільні та зарезервовані області пам'яті зберігаються в структурі даних, схожі на двійкові дерева, що називаються купами". Мені це здається, як автор здогадується, що існує зв’язок, заснований на назві "купи", і, ймовірно, помиляється. Чи може хтось підтвердити / спростувати?
Дон Хетч

1
Після деяких легких досліджень системи Binary Buddy (використовується в Linux), її можна представити двійковим деревом завдяки тому, як він розділяє дані. Це бінарне дерево виглядає як дійсна максимальна купа, якщо ви спостерігаєте за вузлами з точки зору загальної пам’яті, але вузли не вставляються в це бінарне дерево, оскільки вони знаходяться в максимумі купи - вузли вставляються безпосередньо в найменший лист вільної пам'яті> = запитуваний розмір. 1 2 3
Ерік Дубе

1

Розмовні терміни стекають пам'ять та купують пам’ять у стандарті C ++. Стандарт використовує статичне зберігання, зберігання потоків, автоматичне зберігання та динамічне зберігання.

Більше можна знайти в розділі « Зберігання даних стандарту».

Отже, з точки зору мови та стандартної бібліотеки, не виникає плутанини.


1

З. Що таке купа? А. Куча - це сукупність предметів, розташованих один над одним.

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


-2

Можливо, першою реалізованою купою пам’яті керувала структура купи?


8
Ця гіпотеза зовсім не очевидна - наскільки ціла купа (структура даних) взагалі корисна для підтримки купи (динамічна область пам'яті)?
Кіт Рендалл

7
-1. Я вважаю за краще авторитетне твердження з доказами, а не те, що, очевидно, лише здогадка.
Роб Кеннеді

Вкрай малоймовірно. Здається, немає вагомих причин використовувати купу (структуру даних) для керування купою (пулом вільної пам'яті).
Ясон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.