Как я могу освоить идею массивов? - PullRequest
2 голосов
/ 21 апреля 2009

Я полностью понимаю назначение массивов, но не чувствую, что «освоил» их. У кого-нибудь есть действительно хорошие проблемы или чтения, связанные с массивами. Я программирую на PHP и C ++, поэтому, если есть примеры с этими языками, это было бы предпочтительнее, но не обязательно.

Ответы [ 7 ]

12 голосов
/ 21 апреля 2009

Нарисуйте все на миллиметровой бумаге.
Память - это просто маленькие прямоугольники, на бумаге намного проще увидеть несколько стрелок, чем на каком-то сложном языке разметки

2 голосов
/ 21 апреля 2009

На первый взгляд, многие люди борются с концепцией массивов, особенно массивов> 2 измерений.

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

Конкретный пример (в псевдокоде)

Допустим, вы создаете ролевую игру и хотите отслеживать статистику вашего персонажа. Вы можете использовать массив целых чисел, как это:

  • Статистика (0) может быть силой
  • Статистика (1) может быть ловкостью
  • Статистика (2) может быть интеллектом

... и так далее.

Теперь давайте добавим уровень сложности. Может быть, мы хотим ввести зелье силы, которое увеличивает силу на 5 на 10 ходов. Мы могли бы представить статистическую сторону этого, превратив это в двумерный массив:

  • Статистика (0, 0) - это моя текущая сила.
  • Статистика (0, 1) - это моя нормальная сила.
  • Stats (0, 2) - это количество ходов, пока не истощится зелье силы.
  • Статистика (1, 0) - это моя текущая ловкость.

... и так далее. Вы поняли.

Итак, я добавил второе измерение, чтобы хранить подробности о первом измерении. Что если бы я хотел, чтобы наш массив Stats обрабатывал статистику для более чем одного символа? Я мог бы представить это, превратив это в трехмерный массив:

  • Stats (0, 0, 0) - текущая сила символа 0.
  • Stats (1, 1, 0) - текущая ловкость персонажа 1.

Было бы еще лучше создать некоторые константы или перечисления для исключения магических чисел из кода:

Const Strength = 0
Const Dexterity = 1
Const Intelligence = 2

Const CurrentValue = 0 
Const NormalValue = 1
Const PotionTurns = 2 

Тогда я мог бы сделать:

Stats(1, Dexterity, NormalValue) = 5 'For character 1, set the normalvalue of dex to 5. 

Еще несколько мыслей о массивах ... По крайней мере, в мире .Net, где я живу, большинству из нас не приходится использовать их в нашей повседневной жизни слишком часто, потому что их медленно отодвигают основы для более сложных структур данных, таких как коллекции.

На самом деле, если бы я реализовал статистику персонажей, реально я бы не использовал массивы.

Тем не менее, по-прежнему важно обдумывать их, потому что они очень быстры, и в некоторых случаях они неоценимы.

2 голосов
/ 21 апреля 2009

Определить «освоено».

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

Попробуйте на основе массива

  • Реализация связанного списка.
  • Реализация стеков, очередей и т. Д., А затем использование стека (ов) для эмуляции очереди и т. Д.
  • Куча
1 голос
/ 21 апреля 2009

Я попытаюсь объяснить лучшее, что я могу, массивы в их фундаментальной форме.

Хорошо, поэтому массив - это в основном способ хранения данных. Например, если вы хотите получить список покупок, мы бы использовали одномерный массив:

[0] - «Хлеб»

[1] - "Молоко"

[2] - "Яйца"

[3] - «Масло» , , .

[n] - "Конфета"

Каждый индекс 0,1,2,3, ... n содержит конкретные данные. Данные, которые вы видите, представлены в виде строк. Теперь я не могу использовать что-то вроде:

[n + 1] = 1000

, поскольку в качестве индекса n + 1 будет указано целое число, компилятор скажет вам, что это бесполезно, и что вам нужно исправить эту проблему.

Переход к матрицам или 2-мерным массивам. Возьмите лист бумаги в клетку, как те, которые вы используете для математики, нарисуйте декартову систему и несколько точек. Положите координаты на другой лист бумаги и рядом с ними поставьте 1. Например:

[0,0] = 1

[0,1] = 1

[2,3] = 1

Что это означает, что в индексах [0,0], [0,1], [2,3] у меня есть 1. Представление будет выглядеть так:

Декартова система в виде матрицы:

  1) 2) 3)

1) 1  1  0

2) 0  0  1

3) 0  0  0

Я использовал только простые массивы, чтобы проиллюстрировать, что это такое, например, если вы хотите перевести трехмерную структуру данных, это будет массив матриц или список, содержащий каждое декартово местоположение на определенной высоте.

Если бы у нас была 10 в качестве высоты и те же точки, что и выше, это было бы что-то вроде:

[ 10 , 0,0] - 1

[ 10 , 0,1] - 1

[ 10 , 2,3] - 1

Если вам нужен способ освоения: возьмите простой список проблем и попробуйте реализовать их, используя любые массивы. Нет быстрого способа сделать это, просто наберитесь терпения и попрактикуйтесь.

1 голос
/ 21 апреля 2009

Массив - это непрерывный блок памяти, выделенный для N элементов одного типа, где N - фиксированное число, указывающее количество элементов. Чтобы расширить массив (так как он имеет фиксированный размер), вы можете использовать функцию C realloc (..). В C ++ вы можете вручную перераспределить массив, создав новый, больший массив и скопировав содержимое старого массива в новый (дорогая операция).

В современных языках есть опции, которые вытесняют массивы (чтобы преодолеть врожденные ограничения массивов). В C ++ вы можете использовать для этого Стандартную библиотеку шаблонов (STL); STL «векторный» тип данных является типичной заменой стандартных массивов в C ++. API-интерфейсы, зависящие от платформы, такие как MFC, имеют встроенные конструкции, такие как CArrayList, для более богатого использования массива. ; -)

1 голос
/ 21 апреля 2009

Попробуйте вручную (без встроенных методов) сортировку по массивам (пузырьковая сортировка хороша для начала)

0 голосов
/ 22 апреля 2009

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

element1:=5;
element2:=6;
element3:=7;
...

- это то же самое, что сказать

element[1]:=5;
element[2]:=6;
element[3]:=7;
...

кроме того, что теперь компьютер знает, о чем вы говорите, и вы можете написать что-то вроде:

for i:=1 to n do
   element[i]:=element[i]+1;

Дальше, двумерный массив несколько сложнее, но его можно рассматривать как массив массивов. Таким образом, мы могли бы иметь что-то вроде этого:

type
  arrayA=array[1..50] of integer;
  arrayB=array[1..50] of arrayA;
  arrayB=array[1..50,1..50] of integer; //an equivalent declaration in Pascal to the above two

Точнее говоря, двумерный массив - это таблица. Так, например, если arrayA содержит оценки ученика в 50 классах, то arrayB представляет оценки группы учеников. Таким образом, массив B [3,5] будет оценкой третьего ученика в классе № 3.

Легко расширить ту же логику, чтобы добавить другое измерение в массив:

arrayC=array[1..50] of arrayB;

Можно сказать, что C представляет школу, поэтому массив C [2,4,6] - это класс четвертого ученика второй школы в 6-м классе.

Теперь, для чего используются массивы? Хранение групп схожей информации или информации, которую нужно будет обрабатывать в большом количестве. Однако на практике вы в основном будете использовать одномерный, не более чем двухмерный массив. Если вы можете представить свои данные в виде таблицы, вы почти наверняка захотите, например, двумерный массив. Как еще вы представляете шахматную доску, если бы пришлось?

Трехмерные массивы, как правило, используются реже, но что, если вам нужно было сохранить какое-то состояние для каждого элемента таблицы? Что-то вроде:

Table=array[1..50, 1..50, 0..1] of integer;

Тогда третье значение равно 1, если какое-либо условие истинно для данного элемента, и 0 в противном случае. Конечно, тривиальный пример, но это еще один способ более легкого понимания трехмерных массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...