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

トークン認証に関して

Contents1 トークンでの認証2 Laravelでのtoken トークンでの認証 APIアプリケーションを作る場合、認証方式としてはクッキーとセッションを利用したものよりもトークンを使った認証方 …

no image

小〜中規模程度のWEBアプリ作成で気をつけるべきこと

初見の処理系(ライブラリ操作)などは休日などで最小パターンを確認しておくこと。実務で何時間も悩むと非常にストレスがたまる テーブル設計命。あとで終えるようにトレースができるような値を入れておくこと。 …

no image

データ構造の基礎知識 中編 ハッシュ

前回の続きです。 前回は配列、連結リストについて学習したので今回はハッシュについて学習します。 Contents1 ハッシュとは?1.1 メリット1.2 デメリット ハッシュとは? key-value …

no image

変数の役割について

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

no image

phing

今までphpunit,phpmd,phpcodesniffer,phpdocumentなどのツールをいろいろと試してきますが、個別に動かしていると大変面倒ですので、これを一気に行えるライブラリがありま …