Поскольку я изучил структуру данных, я знаю, что существует много других данных stuctures помимо Стека и "кучи", почему процессы в наше время только содержат эти 2 парадигма как "стандартное оборудование" в их адресном пространстве? Могла быть какая-либо совершенно новая парадигма для использования памяти?
Спасибо за Ваши ответы. Да, я понял, что что-то неправильно с моим оператором. Структура данных "кучи" не является тем же как "кучей" в адресном пространстве процесса. Но то, что я задаюсь вопросом, помимо области Stack и области Heap в proecss адресном пространстве, есть ли какая-либо новая парадигма для использования памяти? Кажется, что другие способы использования памяти создаются на этих двух основных парадигмах. И эти 2 парадигмы являются видом некоторых метапарадигм?
Давайте задумаемся на минутку. У нас есть две фундаментальные дисциплины хранения данных. Сплошное и фрагментированное.
Сплошное.
Стек ограничен порядком. 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.
Обратите внимание, что "куча" (область памяти, где можно выделять и освобождать память в случайном порядке) не имеет ничего общего со структурой данных под названием "куча" (списки приоритетов).
Кстати, да, существует третья парадигма использования памяти, помимо стека и кучи: статическое хранение ;-)
На ум приходит FIFO. Общая память между процессорами. Может ли передача сообщений быть парадигмой памяти?
Javolution (http://javolution.org/) имеет несколько интересных парадигм распределения, реализованных через "подсказки" кода и интерпретатора с использованием контекстов. Пул памяти, поддержка рециркуляции объектов и так далее. Хотя это Java, а не C++, он все равно может быть полезен для изучения концепций.
Чтобы отсортировать вектор 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-файлы отображения памяти?
«Куча» - это вообще не парадигма, это самое простое, что вы можете получить: память - это все ваше, используйте ее, как хотите . («Вы» здесь относится к ОС / ядру).
Даже стек не такой уж особенный, если задуматься; вы только начинаете с одного конца кучи и при необходимости увеличиваете / сжимаете.
Я думаю, что это связано с физической природой памяти. Кучи и стеки - это просто интуитивные способы ее представления.
Например, очередь или список концептуально не подходят для случайного доступа. Дерево не представляет физическую природу памяти (одна ячейка за другой, как массив). Любой кортеж с адресом x,y неоправданно сложен по сравнению с простым целочисленным адресом.
А как насчет DMA? http://en.wikipedia.org/wiki/Direct_memory_access