データ構造とアルゴリズムの勉強を始めたきっかけ

データ構造とアルゴリズムの勉強そのものは数か月前に着手したものの、思うようにいかず、何をしたらいいのか模索していました。

独学で自走するというのも結構大変だなあと感じているのだけど、まだまだ初心者街道進行途上のため、記録を残すとともに、後々参考になる人がいればと思います。

 

最初に:アルゴリズムを勉強する目的って何?

 

アルゴリズムの知識を勉強しようと思ったとき、それが何の役に立つのかというのが一番気になるポイントだと思います。IT関連の資格は意味がない!資格など必要ない!という人もいれば、業務上、資格は合格レベルの知識があるのが当然だから、持っているのが当然という人がいたりします。アルゴリズムも同様で、人によって受け止め方が違うようです。

その中で参考になったのが、Hacker's liveの方の話で、要旨をまとめておくと、外資などアップサイドの企業に就職しようとすると、

・コーディング・インタビューでアルゴリズムの知識を問われる

アルゴリズムを実際に仕事で使うというより、その知識を抽象化して汎用性を持たせることができる→仕事の効率が上がる

といったことがあるようです。

効果としては、

・年収が上がる

というまとめになっており、非常に参考になりました。外資系や年収を上げたいプログラマー志望の人には、しっくり来る話かと思います。

 

 

一方で、アルゴリズムは習得難易度も高いため、高いレベルの知識が必要かと言われるとそうでもないようです。そもそも数的思考のような抽象度の高い能力が求められており、得手不得手は分かれてきたりするものの、コーディング・インタビューを切り抜けるぐらいのレベルがあれば十分でしょう。アルゴリズムができても仕事能力はいまいちという人も中にはいるようで、これだけでは判断できないみたいですね。

 

 勉強素材

最後に私はあくまでアルゴリズム初心者なので、勉強材料を数点ピックアップしておきます。

 Python で学ぶアルゴリズム とデータ構造(初級編)【丁寧な解説+Python 実装でアルゴリズム の基本を学習】

 Python で学ぶアルゴリズム とデータ構造(中級編)【丁寧な解説+Python 実装でアルゴリズム の基本を学習】

 

競プロ(競技プログラミング)の存在を知って、初めて購入した本が『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』という本(いわゆず螺旋本)でしたが、実践的すぎるため、初学者にはさっぱり理解できるような内容ではありませんでした。無料学習サイトのようなものも見当たらず、悶々としながらプログラミングの勉強をしていたときに出会ったのがudemyの講座です。

ただこれもアルゴリズムの初心者ではあってもプログラミング初心者を対象とはしていません。pythonの基礎文法ができていることが前提となっているため、progateやドットインストールなどで少し基礎をつかんでから始めたほうがいいですね。

 

アルゴリズム学習で有名なサイト

 

競プロの実力を高めていくためには3つの有名なサイトがあります。

AOJ(Aizu Online Judge)

 基本的な文法を学んだ上で組める問題が数多くあります。言語も多くから選択でき、学習者の解答例も見ることができます。一つの問題に対してアプローチが無数にあるのでおもしろいですね。

 

Leetcode

 私がやってみたところまだ実力不足で難易度easyでも手こずっている有様です。AOJは入門者に向いているようですね。基礎固めが終わったらぜひ。

 

Atcoder

 競プロサイト。月に3回ぐらい?土曜か日曜にABCが(Atcoder Beginner's Contest)開催されています。コーダーのレベルを色分けしており、先日、医者からグーグルに転職された方が話題になっていました。短期間でアルゴリズムの習得に成功して驚いている人がたくさんいましたが、水色コーダーの方でした。1,2年かけて水色になる人はそれなりにおられるよう(それでも難しい)ですが、1,2ヶ月程度で取得はなかなかないようです。

 

では

参考までにどうぞ。

にっちもさっちもいかなくなって、AOJ(Aizu Online Judge)始めた アルゴリズム初心者

アルゴリズムやりたい気分は突然に。

 

Leetcodeを模したアプリを解いていたのだけど、基礎力があまりに不足していたのだろう。いずれそうなる日が来ることは遅かれ早かれ来ることは当然だった。その日が今日訪れた。毎日地道にコードを書き続けていれば、実力も伴ってくるだろうと希望に満ちた世界はある日突然終わりを告げてしまったのだ。

 

そして新しい日常、Aizu Online Judgeと戦う日が始まる。

思えば、自分の実力を過信していたのだろう。少しでもレベルの高いものをと思い写経してはコンパイルして動作確認。

「動かすことによって成功体験を積み上げ、ある日突然アルゴリズムを自在に操るスーパープログラマーになれる!」のようなことを思い描いて始めた取り組みはわずか3日目の挑戦で折れてしまった。しかしこのまま死ぬわけにはいかない。倒れるときは前のめりに!

 

なんて大袈裟な話ではないのだ。私の問題解決能力が低すぎる現状、選択肢を誤ればそれだけ時間が失われてしまう。急がば回れ

ということで、おとなしくアルゴリズムを基礎からやっていきますと改めて宣言。

 

参考にした動画など保存するとともに、上達した暁には、また過去の記事を読みながら「ワシにもそんな頃があったのじゃよ、ふぉふぉふぉ」と謎の老人プレーをどうしても来年やりたくなったので、とにかく方法を変えて上達していくのだ。

 

AOJまだ7問目

問題:3つの数字を取得して、小さい順に並び替えて出力せよ。

リンク 

Aizu Online Judge:Sorting three numbers

なーんだ、簡単じゃん!と思ったが、意外とやってみると躓きそうになった。

私のレベルはまだこの程度なのだろう。

 

自分のコード

f:id:aoshis:20191101051005p:plain

今日の積み上げ

Math.maxは引数を2つしか使わないのだけど、入れ子にすることで3つ以上の数を比べることができるようだ。グーグル調べ

 

この書き方だと、4つ以上になるとどんどん煩雑になっていくため、実用性皆無なのだ。ただ書けばいいものではないと知りつつも、これも実力のうちと強く認識しよう。

 

AOJのヒント

1番目と2番目の数を比べて、交換するかどうか

2番目と3番目の数を比べて、交換するかどうか

1番目と2番目の数を比べて、交換するかどうか

 

入れ替えるとすると配列を使うのかな?

そう思って解答例を巡回していると、そうなんだね。配列もOKなのか。そりゃそうだろう。いい解答があったので貼り付けておく

f:id:aoshis:20191101052504p:plain

解答例

AIZU ONLINE JUDGE: Code Review

 

普通にソート使ってるし、そうなのね、それでいいのな。

 

 

総評:

簡単なものから始めてみると、まだ頭を使えばコンパイルが通ることがよくわかる。アルゴリズムアプリ解いていて、半分はコンパイル通らなかったことを考えると大きな前進なのである。

時間はとにかくかかるが、少しずつ前進していけそうな気がした。

 

次に参考にした動画や教材などをメモしておく。

AWSよりはるかに簡単、GCPにWordPress設置しました

久しぶりにwordpressを作ろうと思って(数年前教育系サイト運営してました)、鯖をまた借りるのもなんだしな。

そうだ、最近流行りのクラウド使ってWP実装しよう!と思ってudemyでちょうどよさそうな講座があったので買いました。

 

www.udemy.com

 

それなりに時間かけて実装できたのはいいんですが、練習がてらにGCPにも実装して、どちらが運営が楽か比べてみようと思って、次のサイトを参考にして載せました。

 

qiita.com

 

ものの15分程度で設置完了しました。

 

AWSでは、VPCからEC2、elasticIPなど設定がいろいろ大変(大変と言ってもクリックするだけの作業。2日かかりました)でしたが、GCPは最初にWPをインストールする用のボタンがあり、クリックだけで設置が終わりました。本来このぐらい簡素であるといいんですが。(怠け者)

 

ImageButtonを使ったら、画像表示が小さい =>scaleType

 

小さい画像

Before

大きい画像

After

ImageButtonにリソースからレイアウトに挿入すると、小さいアイコン画像しか出てこないじゃないですか。ImageViewだとlayout_width&layout_heightに合わせて拡大表示されますが、ImageButtonは属性から操作します。

 

android:scaleType="fitXY"
または
android:scaleType="fitCenter"

または
android
:scaleType="centerCrop"

android 文字列を省略表示 ellipsizeを使う

androidアプリ開発逆レシピより

長い文字列を「ほげほげ...」というように省略する。

 

やり方1:xml

<TextView

android:~~~(幅、高さなど)

android:ellipsize="end"

android:singleLine="true"

android:text="hogehogehogehogehogehoge"

/>

 

endで、文字列の最後を...に置き換えます。

startにすると、文字列の先頭部分が...に置き換わります。文頭を省略することなんてあるのだろうか?という些末が疑問はさておき。

ellipsizeの意味は楕円化するという意味らしいです。よくわからん。

 

 

やり方2:java

findView~~

textView.setEllipsize(TruncateAt.END);

textView.setSingleLine(true);

textView.setText("hogehogehogehogehogehoge");

 

Truncateの意味は、切り捨てる。

ENDをSTARTにすれば文頭を省略。

ちょっと覚えていける自信ないわ。ま、ぐぐればいいのです。

 

評:

クリックすると文字列が全部表示できるみたいなやり方があればまたいつかやります。

 まだまだできる選択肢が少ない。

んー、悔しい。

 

その他:

marquee

この本(androidアプリ開発逆レシピ)にはellipsizeを用いた方法としてmarqueeの使い方も掲載していました。

 

android:ellipsize="marquee"

android:focusable="true"

android:focusableInTouchMode="true"

android:singleLine="true"

android:text="hogehoge"

android 文字列を省略表示 ellipsizeを使う

androidアプリ開発逆レシピより

長い文字列を「ほげほげ...」というように省略する。

 

やり方1:xml

<TextView

android:~~~(幅、高さなど)

android:ellipsize="end"

android:singleLine="true"

android:text="hogehogehogehogehogehoge"

/>

 

endで、文字列の最後を...に置き換えます。

startにすると、文字列の先頭部分が...に置き換わります。文頭を省略することなんてあるのだろうか?という些末が疑問はさておき。

ellipsizeの意味は楕円化するという意味らしいです。よくわからん。

 

 

やり方2:java

findView~~

textView.setEllipsize(TruncateAt.END);

textView.setSingleLine(true);

textView.setText("hogehogehogehogehogehoge");

 

Truncateの意味は、切り捨てる。

ENDをSTARTにすれば文頭を省略。

ちょっと覚えていける自信ないわ。ま、ぐぐればいいのです。

 

評:

クリックすると文字列が全部表示できるみたいなやり方があればまたいつかやります。

 まだまだできる選択肢が少ない。

んー、悔しい。

 

その他:

marquee

この本(androidアプリ開発逆レシピ)にはellipsizeを用いた方法としてmarqueeの使い方も掲載していました。

 

android:ellipsize="marquee"

android:focusable="true"

android:focusableInTouchMode="true"

android:singleLine="true"

android:text="hogehoge"

androidでtextviewにHTMLリンクを設置する

androidアプリ開発逆引きレシピより

 

android開発スキルがまだまだ虚弱なため、逆引きレシピを購入し、できることを増やしつつ、作れる種類を増やしていくつもりです。レシピにあるコードを書きながら、それを使ったアプリを作る感じで取り組んでいます。

本論

 

HTMLでは、周知のとおり、<a href="ここURL" >テキスト</a>でハイパーリンクを作れます。URLは直接表示されません。URLを文字として表示したい場合には(ここテキスト)のところにURLを記述すればテキストとして出力できます。

 

androidでは1行書けば終わりということはないので、始め少し面倒臭さを感じます。覚えておくとなるとさらに手間になります。aタグみたいにユニークなタグを使えばいいのですが、属性として覚えるので、ちょっと違和感ありですね。ま、困ったときにはぐぐればいいのです、ぐぐれば!

 

やり方2通り

やり方1.xmlファイルのTextViewに

 

<TextView

android:~~~

android:autoLink="web"

android:text="タイトルテキストだよ: http://www.google.com"

/>

textのほうには、URLが自動的にリンク表示になります。一組のダブルクォーテーションの中に記述します。もちろん「タイトルテキスト」は書かなくてもかまいません。

webのところに,email,map,phoneなども代入できる 。

xmlのみの記述でOK。javaいじらなくてよし。

 

やり方2.javaファイルに

TextView textview = (TextView)findViewById(R.id.textview);

textview.setAutoLinkMask(Linkify.WEB_URLS);

textview.setText("タイトルテキストだよ:http://www.google.com");

 

いつものtextviewにテキスト表示させるやり方にsetAutoLinkMask(Linkify.WEB_URLS);を追記。ややこしいので、やり方1がとりあえず簡単に使えそうです。使い方次第ではやり方2を使っていくこともあるのでしょうけど、今のところ不明です。

 

javaのみの記述でOK.xmlいじらなくてよし。

 

参考:

https://developer.android.com/reference/android/widget/TextView.html#attr_android:autoLink

 

その他参考:

android5(API21)以上のとき、リンク表記バグ?

android:text="aaa.bbb"←URLじゃないのにリンクとして表示される

AndroidのTextViewのautolink=webが冗長になる - Qiita