Проблемы со структурами данных, общие для начинающих? [закрыто]


17

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

Должен ли я беспокоиться о трудностях с этими алгоритмами и структурами данных? Я просто чувствую, что на самом деле не понял этого.


Пример связанного списка в реальном мире - stackoverflow.com/questions/644167/…
pramodc84

Ответы:


44

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

Думать о поездах

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

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

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

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

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

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

Теперь можно бороться с этим. Но просто принять это, не вариант в долгосрочной перспективе.


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

1
Хорошо, теперь, когда у вас есть это, давайте перейдем к структурам данных с несколькими ссылками. Таким образом, у поезда есть сцепка на его стороне, которая может зацепиться за другой набор вагонов. Но рельс для этих автомобилей как бы скользит рядом с первой колеей ...
Филипп

12

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


6

Процитирую мою любимую учительницу CSCI:

"Panic, but panic early."

Структуры данных звучат сложно, верно? Для меня это звучит абстрактно и немного сложно, а главное ... важно!

Структуры данных - жизненно важный курс. И бороться обычно, но продолжай! Пока вы едите пшеницу и держитесь за нее, вы достигнете радуги с bagнаполненным generic items снизу.


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

3

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


3

Data Structures был первым «сложным» классом, который я выбрал; мы использовали Fortran 77 вместо Java, но концепции в основном совпадают.

Мне потребовалась неделя больше, чем моим одноклассникам, чтобы понять концепцию связанного списка; Я сдал задание, но после пары немного разочаровывающих сессий с моим профессором, оно наконец щелкнуло (буквально; я услышал «щелчок» в моей голове, когда я наконец понял).

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


1
Не паникуйте, продолжайте работать и ждите щелчка ...
NWS

2

Были ли у вас проблемы с пониманием связанного списка или просто проблемы с вашей реализацией?

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

list.head = null;
Element e = new Element(...);
e.next = list.head;
list.head = e;

Я запутался в ALGOL / W в одном и том же упражнении, потому что я не совсем понимал семантику языка. Год спустя я едва мог вспомнить, почему у меня были трудности.


1

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

Я был бы более обеспокоен, если бы кто-то утверждал, что знает все это и никогда не испытывал проблем с изучением чего-либо.

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


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

0

У меня были проблемы с исчислением, и мне пришлось принять его во второй раз. Во второй раз я обнаружил, что я умный, но первый учитель математики был в основном бесполезен :)

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

Иногда внешнее чтение может действительно помочь. Компьютерные книги сильно различаются по качеству. Зайдите на Amazon и посмотрите, какие книги нравятся людям.

Удачи.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.