Структуры данных … поэтому, как я понимаю их? [закрытый]

Таким образом, я - студент Информатики и приблизительно за неделю или так... Я буду забирать обратно курс Структур данных, с помощью C++ для применения теории. Да, я действительно говорил "взятие обратно". Я взял курс прошлой осенью, и я чувствую, что существует больше, что я должен учиться. Будучи студентом, я чувствую, что ДОЛЖЕН знать основы, потому что будет намного легче понять новые понятия в будущих классах, уже зная фундаментальные понятия... не имеющие необходимость повторно учиться каждый раз.

В первый раз вокруг, у меня не было опыта в C++, и курс ожидал, что мы кодируем к концу первой недели. Я боролся, проходя через несколько из первых распределений работы по программированию (члены парламента). Само собой разумеется, я привык к нему и испытал мало затруднений из-за синтаксиса остаток семестра. Но затем более трудные Структуры данных пришли и теория (Большой O), стал трудной частью.

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

Теория обучения является трудной (главным образом, потому что это не настолько захватывающе), поэтому, как я должен применить меня, чтобы действительно понять покрытый структурами данных класс? Я всегда был визуальным учеником, интерактивным учеником... Я не хочу проводить время, просто делающее моих членов парламента. Скорее я хочу провести свое время таким способом, которым я действительно изучаю/понимаю понятия и затем непосредственно применяю знание.

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

Не стесняйтесь обеспечивать обратную связь, даже если ответ был выбран. Я ищу Ваш совет... это - то, почему я отправил :) Спасибо!


Примечание: Структуры данных и Темы покрыли в курсе: Списки, Стеки, Очереди, Деревья (различные виды), Хеш-таблицы, Графики, методы Поиска/Сортировки/Обхода.


ОБНОВЛЕНИЕ: вот список ссылок и ссылок, скомпилированных из ответов до сих пор.

ОБНОВЛЕНИЕ 2: вот список еще некоторых источников, которые я нашел:

39
задан Andrew Barber 6 June 2013 в 09:52
поделиться

20 ответов

Вы уже получили несколько интересных ссылок и идей. Я надеюсь, что смогу изложить немного другую точку зрения:

Я научился визуализировать и «лайкать» структуры данных, когда меня учили, что компьютерная память похожа на действительно длинный список. В этом случае структуры имеют разную компоновку в памяти. Визуализируя структуры в памяти, мне стало очевидно (и интересно), как они работают. Знание структуры данных в памяти невероятно важно для программиста, поскольку сегодняшние непрерывно растущие машины часто останавливаются из-за доступа к памяти. Хорошая компоновка памяти снижает нагрузку на ЦП по извлечению данных из памяти, так что ЦП не должен ждать прибытия данных.

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


0...
1...
2...
3...
4...
5...
6...

Когда вы помещаете структуры в память, они по существу заполняют эти слоты в памяти.

Список очень простой, он просто заполняет список памяти сверху и снизу:


0 Element 0
1 Element 1
2 Element 2
3 Element 3

Хотя иногда вы хотите изменить элемент 2 на что-то другое, может быть, на ноль. Так работают списки. Вы можете получить доступ к данным в структуре, зная их индекс (в данном случае 0 .. 3).

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


0   [ Hidden data ]
.   [ Hidden data ]
.   [ Hidden data ]
.   [ Hidden data ]
n   [ Hidden data ]
n+1 Element 4

Связанные списки разные.Связанный список содержит указатель (индекс в списке памяти) на данные и один указатель на следующий элемент:


0 Data: Memory index 0x00000100
1 Next: Memory index 6
2 
3 
4 
5 
6 Data: Memory index 104
7 Next: Memory index 8
...
100 Data pointed to from first member
101
102
103
104 Data pointed to from second member

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


0 (bottom) Element (ready to be popped)
1 [ Hidden data ]
2 [ Hidden data ]
3 [ Hidden data ]
.
.
.
n (top) (empty, ready to be pushed / be given data)

Визуализируя расположение каждой структуры данных, они стали для меня намного более очевидными в том, как им требуется память и как они на самом деле работают ( также в памяти ). Я надеюсь, что мои примеры дали вам некоторые краткие начальные знания, на которых вы сможете основывать свои будущие исследования. В качестве последнего примера структур данных я приведу несбалансированное двоичное дерево со следующим порядком вставки элементов: 3, 2, 1, 10, 9, 8, 6, 5, 4, 7

Дерево начинается с адреса памяти 100, поскольку адрес памяти 0 недействителен, и я буду использовать это как «без указателя».


100 Value: "3"
101 Left ptr: 103
102 Right ptr: 109

103 Value: "2"
104 Left ptr: 106
105 Right ptr: 0

106 Value: "1"
107 Left ptr: 0
108 Right ptr: 0

109 Value: "10"
110 Left ptr: 112
111 Right ptr: 0

112 Value: "9"
113 Left ptr: 115
114 Right ptr: 0

115 Value: "8"
116 Left ptr: 118
117 Right ptr: 0

118 Value: "6"
119 Left ptr: 121
120 Right ptr: 127

121 Value: "5"
122 Left ptr: 124
123 Right ptr: 0

124 Value: "4"
125 Left ptr: 0
126 Right ptr: 0

127 Value: "7"
128 Left ptr: 0
129 Right ptr: 0

Надеюсь, это поможет!

21
ответ дан 27 November 2019 в 02:21
поделиться

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

.
2
ответ дан 27 November 2019 в 02:21
поделиться

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

3
ответ дан 27 November 2019 в 02:21
поделиться

Мне нравится ответ dcp.

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

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

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

Я думаю, что написание как можно более короткого/маленького рабочего кода для отдельных структур данных очень полезно. Также не бойтесь копировать код (для собственного образования, а не для сданных заданий)..... Если вы копируете, набирая текст, а не вставляя его, то в итоге вы узнаете много нового, поскольку это заставляет вас обращать внимание на каждый символ в коде.


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

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

Ваши лекции посвящены целым структурам данных... гигантским облачным банкам теории Куммулуса.... так что, по сути, они идут сверху вниз. Изолирование небольших проблем синтаксиса и использования в мини-задачах - это "снизу вверх". Таким образом, ваш учитель помогает вам атаковать сверху, вы атакуете снизу, практикуясь, и очень скоро в середине ничего нет!

5
ответ дан 27 November 2019 в 02:21
поделиться

Практика, практика, практика.

Первый совет, который я могу вам дать, - это стать как можно более опытным в C++.

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

Как стать знатоком C++? Практика, практика, практика. Программируйте все. Узнайте о нем все, что можно. Напишите десятки небольших программ. Все, что вы можете сделать, чтобы освоить C++.

Если вы освоите C++, то, уверяю вас, структуры данных станут проще. (Заметьте, я не сказал "легко", я сказал "проще" :))

9
ответ дан 27 November 2019 в 02:21
поделиться

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

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

Вот несколько хороших ссылок для вас... Алгоритмы сортировки: http://www.sorting-algorithms.com/ Обходы деревьев: http://nova.umuc.edu/~jarc/idsv/lesson1.html Обходы графов: http://www.cosc.canterbury.ac.nz/mukundan/dsal/GraphAppl.html


Что касается эффективности (анализ Big O), то она придет к вам более или менее естественным путем, когда вы поймете, что происходит на алгоритмическом уровне каждой операции структуры данных.

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

17
ответ дан 27 November 2019 в 02:21
поделиться

Хорошим ресурсом является Словарь алгоритмов и структур данных NIST . Вы не собираетесь сесть и запоминать всю эту информацию, и вам не следует использовать ее, чтобы избежать кодирования ваших собственных структур, что полностью аннулирует значение класса, но этот сайт служит отличным справочником, потому что он связывает структуры данных с алгоритмами, которые их используют, а также показывает некоторые варианты, что дает представление о том, как вы можете изменять структуры для других целей.

Надеюсь, что это поможет. Удачи.


2
ответ дан 27 November 2019 в 02:21
поделиться

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

Вот несколько

  1. FIFO Linked List - Это проход в McDonalds
  2. LIFO Linked List - Стопка обеденных тарелок
    • Поиск и сортировка - Ролодекс (если вам столько лет, что вы действительно видели такие вещи)
2
ответ дан 27 November 2019 в 02:21
поделиться

Вот хорошая статья для начала: http://www.codeproject.com/KB/cpp/linked_list.aspx . Начните с простого связанного списка . Это очень просто, и вы поймете это намного проще, чем другие структуры данных. Стек и очередь, возможно, концептуально даже проще, но они основаны на простом связанном списке. Затем вы можете перейти к двусвязным спискам и деревьям. С нетерпением жду ваших вопросов по кодированию, удачи! :)

2
ответ дан 27 November 2019 в 02:21
поделиться

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

struct Person {
  char name[100];
  int age;
};

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

Когда вы начинаете говорить о структурах данных, таких как, например, стеки и очереди, сначала попытайтесь концептуально понять, что делает структура данных. Например, со стеком мы используем принцип LIFO, то есть последний вошел - первым ушел. С очередью мы используем принцип FIFO (first in first out).

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

int* x;
int y = 10;
x = &y;

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

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

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

5
ответ дан 27 November 2019 в 02:21
поделиться

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

В зависимости от того, сколько времени у вас есть или вы хотите потратить на это, вы можете попытаться получить задачи на различных соревнованиях по программированию, таких как ACM ICPC. Большинство задач потребуют от вас применения этих знаний. Обратите внимание, что и алгоритмы, и структуры данных не зависят от языка, поэтому, если вы хорошо знаете любой другой язык, просто используйте его.

3
ответ дан 27 November 2019 в 02:21
поделиться

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

Большинство занятий будут основываться на знаниях, полученных вами на прошлых занятиях. Вы еще не раз столкнетесь с этими деталями в процессе обучения, и ваши преподаватели должны быть в состоянии помочь вам применить полученные в прошлом знания в текущей работе. Как интерактивный ученик, офисные часы, стажировки и возможности наставничества кажутся лучшими способами получения нужной вам информации.

Удачи!

3
ответ дан 27 November 2019 в 02:21
поделиться

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

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

Когда я начал рисовать процесс вставки и прочего, переход к собственно программированию структуры данных стал намного проще.

Возможность визуализировать происходящее в памяти действительно помогла. И, как говорили до меня другие: практика, практика, практика!

Это большая часть успеха.

Удачи!

2
ответ дан 27 November 2019 в 02:21
поделиться

Честно говоря, я изначально был программистом-самоучкой на C ++ (моя основная ссылка - общедоступный код исходного игрового движка из Half-Life 2), и я многому научился из того, что получил меня через структуры данных, составляя диаграммы, читая комментарии и код.

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

Написал несколько серьезных проектов кода (например, Connect Four и космический шутер с боковой прокруткой, а также 3D-изометрические плоттеры и программы для рисования 2D) на строго ограниченном калькуляторе TI-83 Plus в старшей школе (ps Использование TI -Basic, not Assembly), я понял, какие виды операций были более эффективными, и я понял, насколько ограничена встроенная система списков (базовый вектор) для хранения данных в определенных ситуациях. Я также понял, как работает Big-O, когда попытался рассчитать время выполнения программы со списками ввода разного размера.

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

2
ответ дан 27 November 2019 в 02:21
поделиться

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

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

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

Некоторым людям нравятся картинки и рисовать картинки. Другие люди любят смотреть MIT OpenCourseware - я рекомендую хотя бы попробовать.

class node
{

  int data;
  node* next;

  node* addnode()
  {
    node newnode;
    this->next = &newnode;

    return &newnode;
  }
};

Это приблизительная (ошибочная) реализация связного списка, которую я написал около 10 лет назад, когда изучал структуры данных.

И последнее замечание: практика и теория - это инь и янь качественного программиста / разработчика / ученого-информатика. Без того и другого невозможно добиться успеха.

1
ответ дан 27 November 2019 в 02:21
поделиться

Когда я преподавал программирование, я всегда рекомендовал своим студентам книги Demystified.

Я предлагаю вам прочитать:
- Data Structures Demystified
- OOP Demystified

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

2
ответ дан 27 November 2019 в 02:21
поделиться

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

3
ответ дан 27 November 2019 в 02:21
поделиться

Если у вас есть проблемы с O-нотацией, то «Введение в алгоритмы» Кормена и др. знакомит с этими теоретическими концепциями в легком для понимания стиле. Что ж, эта книга - в основном библия по основным структурам данных. Доказательства ограничений времени выполнения / пространства всегда представлены в очень поучительной форме.

Как всегда, если вы изучаете такую ​​книгу, не просто прочтите ее, но постарайтесь поработать над большинством упражнений. Обычно это очень эффективно для изучения материала.

Другой общий прием: попробуйте присоединиться к местной учебной группе из 2-3 других студентов - обычно обсуждение материала с другими (лицом к лицу) и при попытке объяснить самостоятельно изученный материал сверстникам дает вам много полезного. подсказывает, какие вещи нужно освещать подробнее.

Чтобы освоить C ++ для выполнения упражнений, «Язык программирования C ++» Страуструпа дает хорошее введение и ссылки на различные языковые концепции. Поскольку C ++ является многопарадигмальным языком, новички часто не понимают, какую из концепций на самом деле использовать на практике для решения определенных проблем. Помочь с этим «Эффективным C ++» Скотта Майерса - хорошее начало.

Если в вашем курсе интенсивно используется STL, то есть еще «Эффективный STL». Стиль письма Скотта Майерса обычно считается очень подходящим для начинающих.

1
ответ дан 27 November 2019 в 02:21
поделиться

На мой взгляд, лучшая книга, которую я нашел (на данный момент) для понимания структур данных, — это Стивен Скина The Algorithm Design Manual .
Помимо первой части, посвященной анализу алгоритмов, алгоритмам и структурам данных, вторая часть абсолютно бесценна в поиске (или, по крайней мере, сужении) правильной структуры данных/алгоритма для решения проблемы.

1
ответ дан 27 November 2019 в 02:21
поделиться
Другие вопросы по тегам:

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