Какая-либо парадигма использования памяти помимо Стека и "кучи"?

Поскольку я изучил структуру данных, я знаю, что существует много других данных stuctures помимо Стека и "кучи", почему процессы в наше время только содержат эти 2 парадигма как "стандартное оборудование" в их адресном пространстве? Могла быть какая-либо совершенно новая парадигма для использования памяти?

Спасибо за Ваши ответы. Да, я понял, что что-то неправильно с моим оператором. Структура данных "кучи" не является тем же как "кучей" в адресном пространстве процесса. Но то, что я задаюсь вопросом, помимо области Stack и области Heap в proecss адресном пространстве, есть ли какая-либо новая парадигма для использования памяти? Кажется, что другие способы использования памяти создаются на этих двух основных парадигмах. И эти 2 парадигмы являются видом некоторых метапарадигм?

5
задан 4 revs, 2 users 100% 23 February 2010 в 03:02
поделиться

8 ответов

Давайте задумаемся на минутку. У нас есть две фундаментальные дисциплины хранения данных. Сплошное и фрагментированное.

Сплошное.

  • Стек ограничен порядком. Last in First Out. Этого требуют контексты вложенности вызовов функций.

  • Мы можем легко инвертировать эту схему, чтобы определить очередь. First in First Out.

  • Мы можем добавить границу к очереди, чтобы сделать Циркулярную очередь. Обработка ввода-вывода требует этого.

  • Мы можем объединить оба ограничения в Dequeue.

  • Мы можем добавить ключ и порядок к очереди, чтобы создать Приоритетную очередь. Планировщик ОС требует этого.

    Итак. Это куча вариаций на тему смежных структур, ограниченных порядком входа. И существует множество их реализаций.

  • Вы можете иметь смежное хранилище, не ограниченное порядком записи: Array и Hash. Массив индексируется по "позиции", хэш - по хэш-функции ключа.

Фрагментированный:

  • Голая "куча" - это фрагментированное хранилище без отношений. Это обычный подход.

  • Вы можете иметь хранилище кучи, используя дескрипторы, чтобы обеспечить перемещение. В старой Mac OS так и было.

Вы можете иметь фрагментированное хранилище с отношениями - списки, деревья и т.п.

  • Связные списки. Односвязные и двусвязные списки являются вариантами реализации.

  • Двоичные деревья имеют 0, 1 или 2 дочерних элемента.

  • Деревья высшего порядка. Попытки и тому подобное.

Что мы имеем? Дюжина?

Вы также можете посмотреть на это как на "коллекции", которые существуют независимо от хранилища. В этом случае вы смешиваете дисциплины хранения (кучные или массивы)

Мешки: неупорядоченные коллекции с разрешенными дубликатами. Вы можете иметь мешок, построенный на нескольких дисциплинах хранения: LinkedBag, TreeBag, ArrayBag, HashBag. Ссылка и дерево используют фрагментированное хранение, массив и хэш - смежное хранение.

Наборы: неупорядоченные коллекции без дубликатов. Без индексации. Опять же: LinkedSet, TreeSet, ArraySet, HashSet.

Списки: упорядоченные коллекции. Индексируются по позиции. Опять же: LinkedList, TreeList, ArrayList, HashList.

Картография: коллекции ассоциаций ключ-значение. Индексируются по ключу. LinkedMap, TreeMap, ArrayMap, HashMap.

4
ответ дан 18 December 2019 в 13:13
поделиться

Обратите внимание, что "куча" (область памяти, где можно выделять и освобождать память в случайном порядке) не имеет ничего общего со структурой данных под названием "куча" (списки приоритетов).

Кстати, да, существует третья парадигма использования памяти, помимо стека и кучи: статическое хранение ;-)

3
ответ дан 18 December 2019 в 13:13
поделиться

На ум приходит FIFO. Общая память между процессорами. Может ли передача сообщений быть парадигмой памяти?

2
ответ дан 18 December 2019 в 13:13
поделиться

Javolution (http://javolution.org/) имеет несколько интересных парадигм распределения, реализованных через "подсказки" кода и интерпретатора с использованием контекстов. Пул памяти, поддержка рециркуляции объектов и так далее. Хотя это Java, а не C++, он все равно может быть полезен для изучения концепций.

2
ответ дан 18 December 2019 в 13:13
поделиться

Чтобы отсортировать вектор 1D или один столбец данных, просто вызовите функцию sort и передайте в своей последовательности.

С другой стороны, функция order необходима для сортировки данных двух -мерных данных, т.е. нескольких столбцов данных, собранных в матрице или кадре данных.

Stadium Home Week Qtr Away Off Def Result       Kicker Dist
751     Out  PHI   14   4  NYG PHI NYG   Good      D.Akers   50
491     Out   KC    9   1  OAK OAK  KC   Good S.Janikowski   32
702     Out  OAK   15   4  CLE CLE OAK   Good     P.Dawson   37
571     Out   NE    1   2  OAK OAK  NE Missed S.Janikowski   43
654     Out  NYG   11   2  PHI NYG PHI   Good      J.Feely   26
307     Out  DEN   14   2  BAL DEN BAL   Good       J.Elam   48
492     Out   KC   13   3  DEN  KC DEN   Good      L.Tynes   34
691     Out  NYJ   17   3  BUF NYJ BUF   Good     M.Nugent   25
164     Out  CHI   13   2   GB CHI  GB   Good      R.Gould   25
80      Out  BAL    1   2  IND IND BAL   Good M.Vanderjagt   20

Вот отрывок данных для полевых попыток гола в сезоне НФЛ 2008 года, кадр данных, который я назвал «fg». предположим, что эти 10 точек данных представляют все цели на местах, которые были предприняты в 2008 году; далее предположим, что вы хотите знать расстояние самого длинного полевого гола, который пытался в том году, кто пнул его, и был ли он хорошим или нет; вы также хотите знать вторую длину, а также третью длину и т. д.; и, наконец, вам нужна самая короткая попытка гола на поле.

Ну, вы могли бы просто сделать это:

sort(fg$Dist, decreasing=T)

который возвращается: 50 48 43 37 34 32 26 25 25 20

Это правильно, но не очень полезно - это действительно говорит нам расстояние самой длинной попытки цели поля, второй-самой длинной,... а также самой короткой; однако, но это все, что мы знаем - эг, мы не знаем, кто был пинок, была ли попытка успешной и т. Д. Конечно, необходимо, чтобы весь кадр данных был отсортирован по столбцу «Dist» (поставьте другому пути, чтобы отсортировать все строки данных по одному атрибуту Dist . Это выглядит следующим образом:

Stadium Home Week Qtr Away Off Def Result       Kicker Dist
751     Out  PHI   14   4  NYG PHI NYG   Good      D.Akers   50
307     Out  DEN   14   2  BAL DEN BAL   Good       J.Elam   48
571     Out   NE    1   2  OAK OAK  NE Missed S.Janikowski   43
702     Out  OAK   15   4  CLE CLE OAK   Good     P.Dawson   37
492     Out   KC   13   3  DEN  KC DEN   Good      L.Tynes   34
491     Out   KC    9   1  OAK OAK  KC   Good S.Janikowski   32
654     Out  NYG   11   2  PHI NYG PHI   Good      J.Feely   26
691     Out  NYJ   17   3  BUF NYJ BUF   Good     M.Nugent   25
164     Out  CHI   13   2   GB CHI  GB   Good      R.Gould   25
80      Out  BAL    1   2  IND IND BAL   Good M.Vanderjagt   20

Это то, что делает заказ . Это «сортировка» для двумерных данных; другими словами, путь возвращает 1D целочисленный индекс, состоящий из номеров строк, так что сортировка строк в соответствии с этим вектором даст правильную сортировку по столбцу, Dist

Вот как она работает. Выше сортировка использовалась для сортировки столбца Dist; для сортировки всего кадра данных в столбце Dist используется «order» , точно такой же путь, как «sort» используется выше :

ndx = order(fg$Dist, decreasing=T)

(обычно я связываю массив, возвращаемый из «order», с переменной «ndx», которая стоит для «index», поскольку я собираюсь использовать его в качестве массива индекса для сортировки.)

, который был шагом 1, вот шаг 2:

'ndx', то, что возвращается с помощью 'sort', затем используется в качестве массива индекса для переупорядочивания кадра данных, 'fg':

fg_sorted = fg[ndx,]

fg _ отсортирован является переупорядоченным кадром данных непосредственно выше.

В сумме «sort» используется для создания массива индексов (который определяет порядок сортировки столбца, который требуется отсортировать), который затем используется как массив индексов для переупорядочивания кадра данных (или матрицы).

-121--848379-

Плагин jquery.form может помочь с тем, что другие ищут этот вопрос в конечном итоге. Я не уверен, делает ли он напрямую то, что нужно или нет.

Существует также функция serialityArray .

-121--1810437-

файлы отображения памяти?

1
ответ дан 18 December 2019 в 13:13
поделиться

«Куча» - это вообще не парадигма, это самое простое, что вы можете получить: память - это все ваше, используйте ее, как хотите . («Вы» здесь относится к ОС / ядру).

Даже стек не такой уж особенный, если задуматься; вы только начинаете с одного конца кучи и при необходимости увеличиваете / сжимаете.

1
ответ дан 18 December 2019 в 13:13
поделиться

Я думаю, что это связано с физической природой памяти. Кучи и стеки - это просто интуитивные способы ее представления.

Например, очередь или список концептуально не подходят для случайного доступа. Дерево не представляет физическую природу памяти (одна ячейка за другой, как массив). Любой кортеж с адресом x,y неоправданно сложен по сравнению с простым целочисленным адресом.

1
ответ дан 18 December 2019 в 13:13
поделиться
0
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: