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

webの仕組み その1 Webの基本的なイメージ

Webの仕組みについて基礎からちょっと勉強しようかと。自分用なのでまとまってません(爆) Contents1 Webの基本的なイメージ2 HTTPメソッド Webの基本的なイメージ ネットワーク上のリ …

no image

Webの高速化に関して

Webの高速化に関してメモ。 高速化って言っても幅広いんですけどね。自分が行なっている対策に関して。 一応LAMP環境を前提にしてます。 Contents1 一番大事なのは測定2 DB対策3 フロント …

no image

ログの設計指針について

今まで10以上近い現場で仕事をしてきましたが、どの現場でも絶対必要になる(かつどこもあまり対策が取られていない)技術としては 検証したい状態の復元がすぐにできる(テストデータ作成) ログの適切な設計 …

no image

トークン認証に関して

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

no image

短いコードを書く

私が普段コードを書くときに考えていることは常にいかに短くかけるか、ということといかにバグを生み出さないかということです。 基本的にはできるだけ、短くシンプルに書くようにしています。 そうすることであと …

アーカイブ