0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Computer Science】CS初心者がアルゴリズム理解に必須の概念の説明をしてみる【データ構造】

Posted at

Array

Array には Array List と Linked List がある
Array Listはメモリ上に連続的に存在しているためindexさえあればアクセスできる
Linked List は Nodeを元に作成されており、indexでアクセスするためにはheadから辿る必要があり、O(n)かかる。

recursive

再帰は人間にも分かりづらいが stack を使うと分かりやすい
computerがrecursive function を実行するときに、現在の関数のローカル変数や関数のどこにいるのかを知る必要がある。これは runtime stack stack frame と呼ばれている。
Pythonなどではstack frame がでかく、n=1000くらいで最大に達する。よって安易に再帰はするべきでない

Linked List

Singly Linked List (単連結リスト)。普通の配列に比べて扱いにく過ぎだろ(readがO(N)なので)と思ったが、
連結リストは挿入が簡単というメリットがある。挿入する操作がnextを付け替えるだけで実装できるからだ。配列の場合は、挿入後にあるカラムを全部移動させなければならない。

Hash Map

hash = map = hashmap = dict. 呼び方は何でもあり。
基本的にhashmapは特定のアルゴリズムを用いてキーを探索しているためソートはしてくれない。けどなぜかPythonのdictはしてくれてる。なんで?
追記順ならいうてnextかなんか実装すれば順番通りにしてもO(1)ですむのかな?未だ謎は多い

Heap

英語で「山積み」という意味。データ構造のheapと、動的メモリ領域のheapがあるのでややこしいが、実はヒープ領域はヒープ構造で実装されているとかいないとか。

ヒープ木構造

インデックスは深さ探索。
親ノード(k)は子ノード(2k, 2k+1)よりも小さくなければならない。(k=1,2,3..)
ヒープ作成(build_min_heap)の最悪計算量はO(n), min_heapify(ヒープ構造を作る上で、上のルールを守るためにノードを入れ替える作業)の最悪計算量はO(logn)である。

ヒープ領域

未使用ノード、使用中ノードに分かれる。最初は一つの大きい未使用ノードで、mallocやnewでメモリ確保されると、未使用ノードから必要分切り離して与える。free or deleteされるとまた未使用ノードに戻るが、動的に削除されるのでフラグメンテーションが発生する。これをガベージコレクションでまとめないと再利用しにくい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?