web-dev-qa-db-ja.com

初心者によくあるデータ構造に問題がありますか?

Javaの2番目のコースを受講しています。データ構造を調べています。リンクされたリストで割り当てを行いましたが、今はスタックです。リンクされたリストで苦労しました。スタックは私に少しトラブルを与えましたが、はるかに簡単でした。

これらのアルゴリズムとデータ構造で苦労することについて心配する必要がありますか?よくわからなかったような気がします。

17
Brock

これらは根本的なものなので、理解しないことを受け入れてはいけないと思います。そうは言っても、あなたがそれらを理解していなくても悪いと感じることはありません。リンクされたリストを子供に説明できます。ですから、先生があなたに説明し損ねたとしても、それは彼らのせいです。したがって、心配する時間を費やすのではなく、説明できる人を探すようにしてください。多くの場合、仲間の学生はフルタイムのアカデミックよりもはるかに優れた教師です。

電車のことを考える

想像してみてください。1組の鉄道車両があり、各車両には1つのデータを格納するのに十分な容量があります。各キャリッジには、その端にある種のフックがあり、別のキャリッジの前部に取り付けることができます。
これは実際にリンクされたリストを提供します:

  • 空のリスト:車両を含まない(したがってデータを持たない)列車
  • 要素の追加:要素を含む新しいキャリッジを列車の前に追加し、それを列車の残りの部分にフックします
  • 要素の削除:要素を含むキャリッジを見つけます。それを取り外し(ここではクレーンが必要かもしれません:))、前のキャリッジを後のキャリッジに引っ掛けます。
  • 要素を置き換える:古い要素を含むキャリッジを見つけます。古い要素を新しい要素と交換します。
  • 要素を別の要素の直後に挿入する:挿入したい要素を含むキャリッジを見つけます。その後に新しいキャリッジを挿入し、それに応じてフックし(列車がバラバラにならないようにします)、新しい要素をその中に入れます。

それとは対照的に、配列は、なんらかの方法で並べ替えることができない、指定された数の客車を備えた列車と考えることができます。あなたができることはそれらの中のデータを変更することだけです。このモデルは、配列が持つ多くの問題についても説明しています。

  • ある要素を別の要素の前に挿入する場合は、次の要素をすべて次のキャリッジに移動する必要があります。
  • 1つの要素を削除する場合は、後続のすべての要素を1つのキャリッジで前に移動する必要があります。
  • より多くの車両を備えた列車が必要な場合は、単に車両を追加することはできないため、新しい列車を構築する必要があります。一方、配列内でキャリッジを見つけるのははるかに簡単です。なぜなら、それらに永続的に番号を付けることができるからです(それらの順序は変更されません)。

スタックについて:「スタック」は、アイデアよりもデータ構造ではありません。スタックの考え方は、それが本のスタックのように振る舞うということです。スタックの上にのみ本を置くことができ、スタックから一番上の本だけを取り出すことができます(少なくとも本が十分に重い場合)。
とはいえ、キャリッジのデータを本と見なし、最初のキャリッジの本をスタックの最上部と考える場合、リンクリストをスタックとして使用できます。

これがお役に立てば幸いです。多分それはしませんでした。多分あなたはより視覚的なタイプの人です。その場合は、視覚的な説明が得意な人を探して説明することをお勧めします。それほど時間はかかりませんが、それだけの価値があります。

これで今は苦労しても大丈夫です。しかし、単にそれを受け入れることは、長期的には選択肢ではありません。

44
back2dos

あなたがそれについて「心配する必要がある」とは言いませんが、あなたの弱点を認めるという単純な事実は、あなたがどこでもっと勉強すべきかを正確に知っていることを示しています。私はあなたがその態度でよく仕え、長期的には大丈夫だと思います。

12
Dave Nay

私のお気に入りのCSCI教師を引用するには:

"Panic, but panic early."

データ構造は難しいですね。私にとっては、それは抽象的で少し複雑に聞こえますが、何よりも重要です!

データ構造は重要なコースです。そして、苦労することはよくありますが、続けてください! Wheatiesを食べてそれを続ける限り、baggeneric itemsで満たされた状態でRainbowに到達します。

6
Adel

他の回答の非常に良い点、追加する1つのメモ:IMOリンクリストは、たとえば、 indirectionreferences/pointers)。そして これらの基本的な概念を理解するのは難しいかもしれません

3
Péter Török

データ構造は、私が採用した最初の「ハード」クラスでした。 JavaではなくFortran 77を使用しましたが、概念はほとんど同じです。

リンクリストの概念を理解するのに、クラスメートよりも1週間長くかかりました。私は割り当てに異議を唱えましたが、教授との少しイライラするセッションの後で、最終的にカチッという音がしました(文字通り、最終的に理解したときに頭の中で「カチッ」という音が聞こえました)。

誰もがCSカリキュラムでどこかに問題を抱えています(奇抜な場合を除きます)。あなたの弱点がどこにあるか、そしてそれらにどのように対処するかを理解していれば、本当に心配することは何もありません。

3
John Bode

リンクされたリストの理解に問題がありましたか、それとも実装に問題がありますか?

新しいプログラマがそこで困難を感じることは珍しいことではありません。なぜなら、それが何を意味するかについて考える必要があるのは初めてだからですreallyと書くとき:

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

言語のセマンティクスを完全に理解していなかったので、同じ演習でALGOL/Wのすべてをひねりました。一年後、なぜ私は苦労したのかをほとんど思い出すことができませんでした。

2
kevin cline

あなたが他よりも難しいと感じるソフトウェア開発のいくつかの領域があるはずです。特定のアルゴリズムであっても、特定の設計パターンや特定の手順であっても、人によって異なります。完全に理解する前に、実際のプログラムで何かを使用する必要があることに気づきました。

もし誰かがそれをすべて知っていると主張し、何かを学ぶのに問題を経験したことがなかったら、私はもっと心配になるでしょう。

個人的にはリンクリストに問題があるとは思われませんでしたが、それから8年間それらを使用するプログラムに取り組みましたどこでもなので、日常的にそれらを扱いました。あなたが知っている限りwhereあなたの記憶をリフレッシュするために必要な情報を見つけ、あなたが「トラブル」を抱えている領域を知っているなら、大丈夫であるべきです。

1
ChrisF

私は微積分に問題があり、二度目にそれをしなければなりませんでした。 2回目に私は賢いことに気付きましたが、最初の数学の先生は基本的に役に立たなかった:)

ITには、教師でさえうまくコミュニケーションできない人をたくさん見つけるでしょう。一方、ITの一部の人々は、本当に優れたライターであり、コミュニケーターである。

時々、外で読むことは本当に助けになります。コンピュータブックの品質は大きく異なります。 Amazonにアクセスして、人々が好きな本が実際に好きだったものを見てください。

幸運を。

0
Glen P