データ構造 スタック
アルゴリズムの本を読んだメモです。
データ構造とは
データ構造はプログラムの中で、データの集合を系統立てて管理するための形式。
以下の3つの概念から成り立つ。
- データの集合
- データの本体
- 規則
- データを正しく操作・管理・保持するための決まり
- 操作
- データの集合に対する取り出すなどの操作
スタック
逆ポーランド記法で入力された数式をスタックを使って計算して、結果を出力するという例題だった。
配列を使ったスタックの実装に下記の変数と関数を使った。
- データを格納するための配列
- スタックの一番最後に追加された要素を指し示す変数
- スタックに要素xを追加する関数
- スタックのトップから要素を取り出す関数
ソースコードはわかりやすくて、そのまま飲み込めたので、今回は割愛。
macにfish+anyenv+nodenvの環境構築
クリーンインストールしたmacに環境構築してるんですが、これ何回やってもハマるのでメモです.
anyenvのインストール
homebrewでインストールしました。
brew install anyenv
とくに何もせず、anyenvのコマンドが使える様になる。
けど、nodenv使うときにこれ書かないとPathが通らないので~/.config/fish/config.fishに以下を追記。
set -x PATH $HOME/.anyenv/bin $PATH eval (anyenv init - | source)
下記コマンドを実行しないとnodenvがinstallできないので、実行。
anyenv install --init
ここまでで、いったんanyenvのインストールは完了。
nodenvのインストール
インストール
anyenv install nodenv
好きなNode.jsのバージョンをインストール
nodenv install *.*.*
インストールしたバージョンをglobalに指定。プロジェクトごとに切り分けたいときはlocalとしてください。
nodenv global *.*.*
安定なソート??
今日はアルゴリズムとデータ構造の本を読みました。
年末年始はNode.jsの勉強をしていたので少し間が空いてしまったのですが...
今回の記事はほんとに軽いメモです。
安定なソート??
仮に、
A = [5, 2, 4, 4, 1]
という配列があったとします。
これを何かしらのアルゴリズムを使って昇順に並び替えます。
このときにAの同じ"4"という数字をもつ、3番めの要素と4番目の要素が入れ替わらずに、並び替えが行われることを安定なソートと呼びます。
今回の例ではバブルソートと選択ソートを比較していました。
以前まとめているので、よろしければ。
アルゴリズム カテゴリーの記事一覧 - NON STOP TECH BLOG
ちなみにバブルソートが安定なソートで、選択ソートは安定でないソートです。
おわり
今日は寒い!!!!雨も降ってるし!!!
あと眠い!!!
クリーンインストールしたmacに環境構築する(2)
1の続きですー。
今回はvim周りをやっていきます。
ぼくもvimをちゃんと使い始めたのは最近なのでもしかしたら間違っているところがあるかもしれません...><
dein.vim
vimのプラグインを管理してくれるやつです。
.vimrcに追記するだけでinstallとかやってくれて便利です。
公式にそってやっていきます。
インストール
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh # For example, we just use `~/.cache/dein` as installation directory $ sh ./installer.sh ~/.cache/dein
.vimrcがあれば、下を追記。なければ作りましょう~
if &compatible set nocompatible endif " Add the dein installation directory into runtimepath set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim if dein#load_state('~/.cache/dein') call dein#begin('~/.cache/dein') call dein#add('~/.cache/dein/repos/github.com/Shougo/dein.vim') call dein#add('Shougo/deoplete.nvim') if !has('nvim') call dein#add('roxma/nvim-yarp') call dein#add('roxma/vim-hug-neovim-rpc') endif call dein#end() call dein#save_state() endif filetype plugin indent on syntax enable
vimを開いて、下のコマンドを実行
:call dein#install()
.vimrc
ぼくは下のプラグインを入れています。
call dein#add('scrooloose/nerdtree') call dein#add('tomasr/molokai') call dein#add('editorconfig/editorconfig-vim') call dein#add('mattn/emmet-vim') call dein#add('hail2u/vim-css3-syntax') call dein#add('othree/html5.vim') call dein#add('pangloss/vim-javascript') call dein#add('nikvdp/ejs-syntax')
nerdtreeがめちゃくちゃ便利でおすすめです。
クリーンインストールしたmacに環境構築する(1)
あけましておめでとうございます。
2020年もよろしくおねがいいたします。
年末にサブマシンをクリーンインストールしました。
もっさりしていたのがかなり改善されていい感じです。
ただ、やっぱり起動が遅かったりするのでSSDに載せ替えようかなって考えてます。
さて、本題ですが、このサブマシンでもコーディングしたいので環境構築の第一歩。
普段つかっているfishを導入することにします。
そのメモです。
fishを導入
homebrewはインストール済みの想定です。
$ brew install fish
インストールが終わったらfishを起動します。
$ fish
fishをデフォルトのシェルに設定します。
$ chsh -s (which fish)
.........エラー出ました。
chsh: /hoge/hoge/fish: non-standard shell
ってでて怒られます。
どうやら /etc/shells にfishへのパスを書いておく必要があるようです。
さっそく、
$ which fish
の結果をコピーして、
$ sudo vim /etc/shells
で貼り付けました。
もう一度したのコマンドを実行。
$ chsh -s (which fish)
これでインストールとデフォルトのシェルの設定まで完了しました。
(ぼくはHyperを使っているのですが、PCを再起動しないとデフォルトのシェルの設定が反映されませんでした。)
fishにプラグインを追加
Fisher
Fisherはfish shellのパッケージマネージャーです。
これを使ってプラグインを管理していきます。
インストール↓
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
bobthefish
Gitのブランチ名をターミナルに表示してくれるやつです。
フォントをインストールしないといけなかったりして、導入が少しだるいのですが、便利なので入れます。
$ fisher add oh-my-fish/theme-bobthefish
この状態だと文字化けていると思いますので、powerlinefontをインストールします。
# clone $ git clone https://github.com/powerline/fonts.git --depth=1 # install $ cd fonts $ ./install.sh # clean-up a bit $ cd .. $ rm -rf fonts
これでフォントのインストールは完了です。
Hyperやらiterm2やら標準のターミナルやらのフォントを設定から変更してください。
SelectionSort
今年も残すところあと3日ですね〜
早い。
SelectionSortについて勉強したので、メモです。
前提
SelectionSortもInsertionSortやBubbleSortと同じく、未ソート部分とソート済み部分に分けて考えます。
手順
次の処理を入力された配列の長さ-1繰り返す。
- 未ソート部分から値が最小の要素の位置を特定する
- 未ソート部分の先頭と最小の要素を入れ替える
ソースコード
本に乗ってるやつの変数名かえたり、コメントつけたやつです〜
#include<stdio.h> int selectionSort(int array[], int size) { int unSortedStart, count, tmp, minimumPointer, sw; sw = 0; // 入力された配列の長さ-1繰り返す // 一つずつソート済み部分が増えていく for (unSortedStart = 0; unSortedStart < size - 1; unSortedStart++) { // 一旦minimumを初期化 minimumPointer = unSortedStart; // 未ソート部分の先頭から最後の要素までをたどる for (count = unSortedStart; count < size; count++ ) { // もし現在の最小値よりも小さい要素が配列にいたら // その要素の位置を最小値ポインタとする if (array[count] < array[minimumPointer]) { minimumPointer = count; } } // 未ソート部分の先頭と最小値の要素を入れ替える tmp = array[unSortedStart]; array[unSortedStart] = array[minimumPointer]; array[minimumPointer] = tmp; if (unSortedStart != minimumPointer) sw++; } return sw; } int main() { int A[100], size, i, sw; scanf("%d", &size); for (i=0; i<size; i++) scanf("%d", &A[i]); sw = selectionSort(A, size); for (i=0; i < size; i++){ if (i>0) printf(" "); printf("%d", A[i]); } printf("\n"); printf("%d", sw); return 0; }
JavaScript
JSでも書いてみました。
こっちは降順もあります。
See the Pen SelectionSort by ysk (@00ysk) on CodePen.
Reactフラグメント
恥ずかしながらReactフラグメントってこの間知りました。
メモします。
できること
Reactの場合、一つのコンポーネントが描画するDOMは一つの親要素にまとめなければいけません。
下のやつはNG例です。
const sample = () => { return ( <h1>サンプルコンポーネント</h1> <p>サンプルテキスト</p> ); };
これは次の例のように一つの親要素に含めてしまえばOKです。
const sample = () => { return ( <div> <h1>サンプルコンポーネント</h1> <p>サンプルテキスト</p> </div> ); };
しかし、これだと実際には必要のないdivタグが増えてしまい、ソースコードの見た目的にもよろしくないです。
(公式だとTableタグの中にdivタグが入るシチュエーションを使って説明しています。)
これを解決してくれるのがReact.flagmentです。
使い方
使い方は簡単でdivタグの代わりにReact.flagmentタグで囲って上げるだけです。
const sample = () => { return ( <React.Fragment> <h1>サンプルコンポーネント</h1> <p>サンプルテキスト</p> </React.Fragment> ); };
下のようにもかけます。
const sample = () => { return ( <> <h1>サンプルコンポーネント</h1> <p>サンプルテキスト</p> </> ); };
公式には、ループ処理の中でリストを作るときなんかに作る例もありました