TechFULの中の人

triple-four’s blog

ワーシャルフロイド 入門

こんにちは!ganariyaです。
今回はグラフ理論アルゴリズム、「ワーシャルフロイド」についてです。

実世界において、グラフ理論はあらゆるところで利用されます。
例えば、インターネットにおける通信パスや、JRなどの電車の経路パス探索です。
これらはグラフ理論を発展させて、実務的に使用しているものです。

グラフ理論は殆ど、駅などをノード道路などをエッジとして扱い、点と線が結ばれたものとして扱われます。
グラフのキホン(1)グラフ概要編グラフのキホン(2)表現方法と探索編の記事を読むとグラフの基礎が身につくと思います。

そして、グラフ理論で扱われる大きなジャンルの一つには、最短経路問題というものがあります。
これは、与えられたグラフの2つのノード間の最小のコストの経路を見つけるというものです。

例えば、以下のようなグラフがあったとします。

f:id:ganariya:20190216103745p:plain
グラフ

以上のようなグラフで、始点 Sから終点 Tまでの最短経路を求めたいです。

これは以下のようになります。

f:id:ganariya:20190216104024p:plain
グラフ 最短経路

以上のように、通っていくと、最短経路のコストは15となり、これが最小のコストとなります。

このように、最短経路を求めるアルゴリズムはいくつかありますが、今日はそのうちの一つである「ワーシャルフロイド」を掘り下げてみたいと思います!


続きを読む

Kotlinのnull安全

こんにちは!人生二度目の「肺に穴が空く」、という体験をしたSiiiecです。

入院中、PCに触ることが出来なかったものの、書籍Kotlinイン・アクションが手元にあったためKotlinを学ぶ機会がありました。
そこで感心した部分であるKotlinのnull安全についてまとめてみたいと思います。

続きを読む

やさC#で簡単な非同期処理2 ~Wait()~

こんにちは!魚介類のサバです。 最近、といっても数か月前ですが、C#の非同期処理が必要になって触った機会があったので、忘れないうちに出力したいと思います!

今回は 「Wait()」 を理解することが目的です。
親切な解説ができるように努力します!!

※魚介類なので、浅い知識で書いています。ふわふわした解説や、ちょっとした間違いはご了承ください。

Wait() する

Task.Run の戻り値は Task<> 型です。Task<>型 は Wait() メソッドを持ち、これを使うと、呼び出した別スレッドの処理が終わるまで、呼び出し元のスレッドをハードウェイトさせます。

static void Main(string[] args)
{

    Console.WriteLine("Hi : Main    Thread");

    Task.Run(() =>
    {
        for(int i{}; i < 100; ++i)
            Console.WriteLine("Hi : Another Thread " + i);
    }).Wait();   // 呼び出したスレッドの処理が終わるのをハードウェイト

}
  • ここでは別スレッドに重い処理(forループ100回)をさせ、それが終わるのをメインスレッドがハードウェイトで待っています。

ハードウェイト?

Wait() の中身はこんなイメージです。そのため、別スレッドの処理が終わるまで、呼び出し元のスレッドは全く無意味な処理(ループ文ぐるぐる)を行い続けます。

while( 呼び出した別スレッドが処理を続けているなら ){
}
  • ここで重要なのは、呼び出し元スレッドが、別スレッドの処理が終わるのを全力で待ち続け、それ以外何もできなくなる点です。 スレッドがブロックされた状態などともいい、実質的に呼び出し元スレッドは停止します。

Result に注意

Task.Run() に渡したラムダ式の戻り値を取得するために、Task型の Result プロパティを使用する方法があります。(この前回の記事にサンプルコードもあります。)

triple-four.hatenablog.com

Result は内部で Wait() を呼び出し、ラムダ式の戻り値が決定するまで呼び出し元スレッドをハードウェイトさせてしまいます。そのため、Task.Run() した後、すぐに Result でラムダ式の戻り値を取得しては、非同期処理をする意味が全くなくなります。

Wait() のためだけにこの記事を書くのは手抜きなのでは?

Wait() の理解が重要だと考え記事を分けました。特に、どういう仕組みで別スレッドを待っているか、その間Wait()しているスレッドはなぜ何もできないのかを理解してほしいです!

非同期処理に目覚めたあなたに素敵なプレゼント!

実行スレッドを特定する方法

System.Threading名前空間ThreadクラスのプロパティCurrentThreadのプロパティManagedThreadIdを使うことで、そこを処理しているスレッドのIDを取得することができます。実験の際にとても役に立ちます。

using System.Threading.Tasks;
using System.Threading;

static void Main(string[] args)
{

    Console.WriteLine("Main    Thread ID : " + Thread.CurrentThread.ManagedThreadId);

    Task.Run(() =>
    {
        Console.WriteLine("Another Thread ID : " + Thread.CurrentThread.ManagedThreadId);
    }).Wait();

}
  • 非同期できるならいろいろ試してみたいですよね!そんなあなたにはこちら!これだけで実行スレッドを特定できる ID を取得できます!
  • 実際に非同期になっているのか、どの部分がどのスレッドで処理されているのかはっきりわかります!!

最後に

前回の記事で、「Wait() ってなんだよ!?」と思った方、そうでない方、いずれの方々にも誤解なく理解してもらいたくこの記事を書きました。 次回は非同期処理とメソッドについて書きたいと考えています!

運営会社 / サービス

444株式会社

triple-four.com

TechFUL

procon.techful.jp

再帰関数を分かりやすく解説してみる【入門】

こんにちは!ganariyaです。
最近ほとんど遊んでないので、遊びたいですが遊ぶ相手がいません・・・(かなしい)

さて!(切り替え!)
プログラミング始めたてあるあるなのですが、再帰関数、みなさんどのような印象でしょうか・・・
再帰関数は、プログラミングを始めた頃の最初の関門であり、なかなかイメージし辛く、書きづらい、何をしているのかがよく分からない内容です。

しかし、再帰関数は最初理解するのが難しいですが、一度理解してしまえば応用しやすい概念・テクニックであり、色々なことに応用できます。

今日は、その再帰関数の考え方やどのようなお気持ちで書くのかについて、(出来るだけ)分かりやすく書いてみようと思います。


続きを読む

やさC#で簡単な非同期処理1 ~Task.Run()~

こんにちは!魚介類のサバです。 最近、といっても数か月前ですが、C#の非同期処理が必要になって触った機会があったので、忘れないうちに出力したいと思います!

今回は 「別スレッドで処理を実行する」 ことのみが目的です。つまり並列処理です。
親切な解説ができるように努力します!!

※魚介類なので、浅い知識で書いています。ふわふわした解説や、ちょっとした間違いはご了承ください。

続きを読む