マツシタのお勉強

動的計画法を用いて階段の登り方の通り数求める Davis' Staircase in Hacker Rank

問題

始め階段の0段目にいて、N段目までの登り方の方法の数を求める問題。 階段は1段、2段又は3段を一気に登る事ができる。

www.hackerrank.com

解法

全列挙するためには、今いる段から1段登るか2段登るか3段登るかの3通りを毎回行うので、3N通り行わ無ければならない。 動的計画法を用いることでO(N)で求める事ができる。

ソースコード

O(√N)で素数判定をする Time Complexity: Primality in Hacker Rank

問題

整数がNが与えられて、Nが素数か否かを判定するメソッドを実装する問題。

www.hackerrank.com

解法

素数とは、1と自身の数のみが約数となる1より大きい数の事。なので、2 ≦ i < Niでループを回し、Nがiで割り切れるかどうかを判定することで素数判定をすることができる。しかし、この解法はO(N)となり間に合わない。

そこで、N = A * B = B * Aという性質に着目すると、iをNまで回す必要が無いことが分る。A * B = B * Aによってiは√Nまで回せば良い。 これによって計算量はO(√N)となる。

ソースコード

Shortest Reach in a Graph in Hacker Rank

問題

n個のノードとm個のエッジによって構成されるグラフが与えられ、スタートノードからその他の全てノードまでの最短距離を求める問題。

www.hackerrank.com

解法

優先度付きキューを用いたダイクストラ法を使って解く

計算量

優先度付きキューに値を追加する操作と取り出す操作はO(logN)で行えるの。 グラフにおけるノードの数をV、エッジの数をEとすると優先度付きキューを用いたダイクストラ法の計算量はO((V + E)logV)となる。今回、2 ≦ V ≦ 10^3, 1 ≦ E ≦ V(V-2)/2なので**O(106log103)となる。また、この処理をクエリーの数q(1 ≦ q ≦ 10)だけ行うので最終的な計算量はO(107log103)となる。

クラスのプロパティによってオブジェクトをソートする

今回優先度付きキューに入れるのは自作したクラスのオブジェクトだ。オブジェクトの持つdistanceプロパティの値によってソートさせたい。こういう時は自作したクラスに対してimplements ComparableとしてcompareToメソッドを実装することで実現できる。

ソースコード

Connected Cell in a Grid in Hacker Rank

問題

R行C列の行列が与えれれる。行列の各マスは01のどちらかが書かれている。1の島の大きさ(マスの数)が最大を出力する問題。 ここで島の定義は、水平方向、垂直方向、斜め方向で1が隣同士ならばそれらは1つの島とすることができる。

www.hackerrank.com

解法

頑張って深さ優先探索をする

Merge Sort: Counting Inversions in HackerRank

問題

Int型の配列が与えられ、ソートするために必要なスワップの数をカウントするという問題

www.hackerrank.com

解き方

O(N2)の解法

この解法はバブルソートの要領で解く。 forループを2重にしてiを0 ≦ i < arr.length, jをi+1 ≦ j < arr.lengthのようにループさせた時に、arr[i] > arr[j]の条件でカウントしてあげると解ける。

O(NlogN)の解法

この解法はマージソートの要領で解く。 2つの配列をマージさせる時に、左側の配列の値が大きければ、移動させる距離の分だけカウントさせてあげることで、スワップの回数を取得することができる。

ソースコード

Google code jam 2017 Problem A. Alphabet Cake 解法

問題

Dashboard - Round 1A 2017 - Google Code Jam

R行C列のグリッドが与えられる。各マスには?か異なるアルファベット1文字が書かれている。この時、以下の条件でのマスを別のアルファベットで埋めるプログラムを書く。

条件

  • には入力値として既に登場しているアルファベットのどれかを埋める
  • 同じアルファベットで描かれる図形は四角形で無ければならない

G??
?C?
?JJ
の場合
GGG
CCC
JJJ
が回答の1つとなる。

解法

まず、各行に着目し、行rが全ての場合と1つでもアルファベットが含まれている場合で場合分けをする。

行rにアルファベットが含まれている場合

この場合は、登場したアルファベットの両サイドの?をそのアルファベットで埋める。

行rが全ての場合

この場合は、前の行をそのままコピーしたもので埋める

ソースコード

Javaのメモリー構造とガベージコレクションについて

JavaVM

Java VMとは…

Java仮想マシン (Java virtual machineJava VMJVM) は、Javaバイトコードとして定義された命令セットを実行するスタック型の仮想マシンAPIやいくつかのツールとセットでJava実行環境 (JRE) としてリリースされている。この環境を移植することで、さまざまな環境でJavaのプログラムを実行することができる。

Java VMとは - IT用語辞典 Weblio辞書

今回はこのJava VM内部のメモリー構造をまとめる。

JavaVMのメモリー構造

JavaVMのメモリー構造は以下の要素で構成されている。

  • Javaヒープ:アプリケーション・プログラムのオブジェクトを格納する領域。この領域は詳しく後で述べる。
  • Permヒープ:クラスやメソッドなどのメタデータを格納する領域。
  • Cヒープ:OSネイティブなメモリ領域。
  • スレッドスタック:OSネイティブなメモリ領域。

Javaヒープ

Javaヒープ領域は大きくNewOldという領域に分かれている。 NewはさらにEdenとSurvivor**という領域に分かれている。

Javaヒープでは、新しいオブジェクトはNewへ古いオブジェクトはOldに格納されている。具体的には、新しく生成されたオブジェクトはまず、NewのEdenに格納される。その後、ガベージコレクション(以下CG)という仕組みによって、オブジェクトは破棄されるか、SurvivorやOldに移行される。

ガベージコレクションの仕組み

GCとは、不要になったオブジェクトを自動的に破棄する仕組みである。この仕組が無いと、不要になったオブジェクトがメモリー上にずっと保持されたままになり、メモリー領域がなくなってしまう。

GCの処理の流れは以下の通りだ。

  1. 新しく生成されたオブジェクトはNew領域のEden領域に格納される。
  2. Eden領域がいっぱいになったら、Copy GCという機能が発生する。
  3. Copy CGとはNew領域を対象に、使用済みのオブジェクトは破棄される。またまだ必要なオブジェクトはSurvivor領域に移行される。
  4. 一定回数以上のCopy GC後、まだ使用され続けているオブジェクトはOld領域に移行される。
  5. Old領域がいっぱいになるとFull GCという機能が発生する。FullGCとは、Javaヒープ、Permヒープの全体を対象に不要となったメモリーを回収する。

このようにJavaVM内では効率よくメモリーが使われている。

参考

Java Review:JavaVMのメモリ管理をマスターする (1/2) - ITmedia エンタープライズ