skillup

技術ブログ

プログラミング全般

データ構造の基礎知識 前編 メモリとポインタ、配列と連結リスト

投稿日:

WEB+DB(vol91)で使えそうな連載記事がありますのでブログにメモリます。

テーマはデータ構造です。

データ構造とは?

主にハッシュと配列。

  • 配列:データを順番に入れる
  • ハッシュ:ラベルにより検索できるがデータの順番は通常保持されない

計算量

コンピューターが行わなければいけない計算の量

プログラムとメモリ

通常プログラムではデータをメモリ(データを置く場所)におく。

ポインタはメモリの番地を指し示すもの(参照なのでデータ自体は入っていない)が入っている。

配列について

配列の宣言

  • 要素分のアドレスが連続した領域に確保される
  • その領域の先頭のアドレスが変数に保存される

メリット

要素が連続して並んでいることと、変数のサイズがわかっていれば、アドレスがわかればその場所をすぐに特定できるため、計算量が少ない

デメリット

逆に要素数の増減に弱い。要素数5→6にしようと思ったときにすぐに増やせない(5番目のメモリの隣がすでに使われていることがあるため、確保できない。)6個分の値がコピーできる領域を探して、一度コピーする必要がある

配列の欠点を補うべくして連結リストが生まれた。

連結リストについて

配列と同じデータ群だが、4つのアドレスが連続している必要はなく、自分自身の値と、次の値の参照だけをもつ

メリット

次の値の参照を持っているので、値の増減が楽。

デメリット

任意のアドレスに飛ぶ場合、各アドレスがばらばらに配置されているため、リストの要素に応じた時間がかかってしまう(100個あった場合、98番目を探したりするのが大変)

ここらへんはWEB+DBの図を見るのがわかりやすいかも.

オーダー記法

アルゴリズムの計算量を測る方法

  • O(1) データ量が増えても変わらない
  • O(logn) データが増えても計算量はゆっくりとしか増えない。数学のlog
  • O(n) データ量に正比例して増える
  • O(n^2) データ量の2乗になる

JavaでいうとArrayListは配列の要素があるのでアクセスに強い

中央部のデータの増減に関してはO(n)になる一方、検索に対してはO(1)

逆にLinkedListは参照なのでデータの増減に対してはO(1)になる一方、検索はO(n)になる。

下記のリンクがわかりやすい

http://d.hatena.ne.jp/syttru/20080406/1207499238

-プログラミング全般

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

便利すぎる道具の弊害

現在、Javaのプロジェクトでは会社でNetbeansを使っていますが、IDEを使っているばっかりに理解できていないところがありました。便利すぎる道具の弊害ですね・・・ IDEについて一応説明をしてお …

no image

コメントについて

リーダブルコード 第5・6章はコメントについて。 今回はコメントです。ここは結構賛否両論になるところではないかと思います。 ざっくり分けると「できるだけコメントは詳しく書くこと」という意見と「コメント …

no image

オブジェクト指向 プレゼンテーション層

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日はプレゼンテーション層、いわゆるMVCのViewにあたる部分。 Contents1 プレゼンテーション層の考え方1.1 要点1. …

no image

OSコマンドインジェクション

Contents1 OSコマンドインジェクションとは?2 被害3 対策4 参考リンク OSコマンドインジェクションとは? OSに対する命令文を不正に紛れ込ませて攻撃させる手法。 被害 サーバー内のファ …

no image

変数の役割について

前回のエントリーの主眼は変数を置くことで、適切な情報量に分割し、コードを読みやすくしよう、ということでした。 今回はそれとは少し逆の観点でして、不要な変数を削除して、コードを読みやすくしよう、というこ …