skillup

技術ブログ

プログラミング全般

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

投稿日:2016年3月23日 更新日:

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)になる。

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

LinkedListとArrayListの違い

-プログラミング全般

執筆者:


comment

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

関連記事

no image

浮動小数点に関して

金額計算なんかでfloatを使うと誤差が出るっていうのは基礎的な話ではありますが、背景知識を含めて理解しておこうと思ったのでメモります。 Contents1 float,doubleでの誤差2 金額の …

no image

命名規則について

リーダブルコードシリーズ第2段、名称について。 コードにおいては名称がとても大切で、正しい命名づけなどはなかなか難しいです。 以下に大事で重要だと思ったポイントを。 Contents1 具体的でわかり …

no image

Simple Factoryパターンについて

今回はデザインパターンの一種であるSimple Factoryパターンに関して。 Contents1 Simple Factoryパターンとは2 サンプルコード3 解説 Simple Factoryパ …

no image

画面テストのツールに関して

Unitテストに関してはxUnit一択だと思いますが、UI系のテストツールについて。 IDE(コードを書かずにすむマクロ系)に関して全てChromeで動くことを確認しています。 Contents1 ツ …

no image

ポート解放(CentOS7)

新サーバー構築をしていたときにwebサーバーとしてnginxを立てましたが、外部から接続ができません。 500エラーすら吐かれず、ログも残っていません。 こんな時はホスト自体にアクセスが届いていない可 …

アーカイブ