タグ

アルゴリズムとprogrammingに関するpongepongeのブックマーク (11)

  • 2で割ることと3で割ること - Qiita

    この記事でお題にするのはCPUレジスタ上の整数除算です。以下、単に除算とも書きます。 除算は非常に高コストな演算なため、コンパイラは最適化によって、できるだけ整数除算を別の計算に置き換えようとします。 最適化ができる場合の一つとして、割る数が定数である場合があります。頭のいいコンパイラは、除算を乗算とビットシフト等を駆使した演算に置き換えます。この記事では、そういった最適化の背景にある理屈を部分的に解説します。 計算機環境としてはモダンなx86 CPUを仮定します。したがってレジスタは32/64ビットであり、負数は2の補数表現になっています。ある程度は他の命令セットでも通用する話になっているかもしれません。 そもそも整数の除算とは プログラミングにおける整数の除算の定義について確認します。整数$n$を整数$d$で割るとき $$ n = q \times d + r $$ が成り立つように除

    2で割ることと3で割ること - Qiita
  • スーパーマリオのジャンプのアルゴリズム - Qiita

    先日、気持ちのいいジャンプを目指してというQiitaの記事を見かけました。記事中では、マリオのジャンプについても触れられています。マリオというと、マリオブラザースやスーパーマリオブラザース等々、色々あるのですが、これはおそらくスーパーマリオブラザースの事だと思われます。ジャンプアクションゲームといったらスーマリですね。 そのマリオのジャンプの仕組みは「マリオの速度ベクトルを保存しておいて座標を計算するんじゃなくて~」と書かれていて、別サイトのブログへのリンクが張られています。 マリオのジャンプ実装法とVerlet積分 ただ、この記述については不正確であるという別のブログもあったりします。 マリオの完コピvol.28 ジャンプの解析と修正 ホントのところはどうなんでしょうか?世界で最も有名なゲームジャンプがどのように処理されているのか気になったので調べてみることにしました。 原典にあたる

    スーパーマリオのジャンプのアルゴリズム - Qiita
  • プログラマだったら当然知ってるよね?という知識一覧

    2019年11月11日追記 ただのタイトルで煽ってるだけの記事に半年経っても未だに大量のアクセスがあるので追記しておきます。 ここで言いたいことは、「プログラマならコンピュータサイエンスを勉強してると役に立つよね」、ということ だけ です。 この一文以上に有用な言葉は以降の文章では出てきません。みなさんの時間を無駄にしないために注意書きをしました。 それでも良いという人は読んでみてください。 Twitterで「〇〇ができるという人が面接に来たけど、『じゃあXXXやYYYって知ってます?』というと知らないという人が多いんだよねぇ」とかいうツイートを見かけて、私はXXXやYYYってのを知らなかったので調べた見たところ、常識とまでは言えない概念だったり、名前は知らなくても誰もが知ってる概念だったり、むしろもっと良いアプローチがあるのではという思想だったりでなんだかなぁと思っていたところ、半日くら

    プログラマだったら当然知ってるよね?という知識一覧
    pongeponge
    pongeponge 2019/05/12
    だいたいうろ覚え程度なので説明を求められたり細かい所突っ込まれたら死ぬ自信がある
  • プログラマの採用面接で聞かれる、データ構造とアルゴリズムに関する50以上の質問 | POSTD

    情報科学科の卒業生やプログラマの中には、UberやNetflixのような新興企業や、 AmazonMicrosoftGoogle のような大企業や、InfosysやLuxsoftのようなサービスを基とする企業で、プログラミング、コーディング、ソフトウェア開発の仕事に就きたいと考える人が大勢います。しかし、実際にそういった企業で面接を受ける場合、大半の人が プログラミングに関してどのような質問をされるか 見当もつきません。 この記事では、 新卒生からプログラマになって1〜2年までの 経験値が異なる人たち向けに、それぞれの プログラミングの面接でよく聞かれる質問 をいくつか紹介していきます。 コーディングの面接では、主に データ構造とアルゴリズムに基づいた質問 がされますが、 一時変数を使わずにどのように2つの整数をスワップするのか 、というような論理的な質問もされるでしょう。

    プログラマの採用面接で聞かれる、データ構造とアルゴリズムに関する50以上の質問 | POSTD
    pongeponge
    pongeponge 2019/02/08
    整数配列を高速に反転させるためにボゴソートを使用し、祈ります。
  • エレベータに見るアルゴリズムの性能と公平性のバランス|Rui Ueyama

    現実世界でもコンピュータの中でも、何らかの性能指標だけを追求すると参加者にとって極端に不公平になってしまうことがある。例えばエレベータとHDDは共通点がありそうに思えないが、この2つは性能特性的にとてもよく似ていて、リーズナブルな性能と公平性を両立させるために同じ制御方法が使われている。これについてちょっと説明してみよう。 1基しかない場合のエレベータの動き方は単純だ。一度上に動き出すと、上で待ってる人や降りる人がいる限り上昇し続ける。同じように、一度下に動き出すと、下で待っている人や降りる人がいる限り下降し続ける。これ以外の動き方をするエレベータはまず存在しないので、これが唯一の制御方法のように思えるけど、別にこうしなければいけないというルールはない。 エレベータの平均待ち時間を最適化することを考えてみよう。そうすると、一方向に動き続ける代わりに、エレベータが現在存在する階に一番近い人の

    エレベータに見るアルゴリズムの性能と公平性のバランス|Rui Ueyama
    pongeponge
    pongeponge 2017/11/25
    エレベータに課金要素かガチャ要素を加えて公平にしよう
  • 差分検出アルゴリズム三種盛り - Object.create(null)

    こんばんは. 気がつけばもうずいぶんと涼しくなってきました. 勢い余って凍ってしまったりせぬよう, くれぐれも普段の言動にはお気をつけください. はじめに さて, 我々人類にはどうしても二つの文字列 (あるいは行ごとに区切られたテキスト) 間の差分を求めなければいけない瞬間が発生します. 先人たちはそういった時のために diff のようなツールを開発し, それを利用することで文明はめざましい発展を遂げてきました. しかしながら, 使用するアルゴリズムを比較検討したい場合, 「差分」の定義を変えるなどして既存のアルゴリズムに変更を加えたい場合, diff のない異世界に飛ばされて自分で実装しなければいけない時などにおいては, 差分検出アルゴリズムについての理解が必要不可欠です. というわけで, この記事では文字列間の差分検出とは何かということと, 差分を求める三種類のアルゴリズムの紹介・解説

    差分検出アルゴリズム三種盛り - Object.create(null)
    pongeponge
    pongeponge 2017/10/10
    diffの無い異世界に転移したり転生したりしたら大変だな
  • 天才プログラマーと自分との実力差をカンタンに測定する方法 - ベルリンのITスタートアップで働くジャバ・ザ・ハットリの日記

    天才プログラマーと自分との実力差をカンタンに測定する方法を発見しましたよ、という話。 結論から言うと、いろんなところで過去に開催されたプログラミングコンテストの入賞者の結果を見て、その問題を同じ条件で解いてみること。 あるウェブサイトに2015年に開催されたプログラミング・コンテストの結果が載っていた。(記事の末尾にそのプログラミング問題の日語訳を載せた) 入賞者は1位の人が15分、2位が22分、3位が24分、となっていた。 プログラミングの問題をザッと眺めていたら、実装すべきアルゴリズムがパッと思いついた。「これはひょっとして1位の人は超えられなくても3位入賞ぐらいはいけそうじゃね?」などと考えてしまった。 それでそのウェブサイトが用意しているエディタを使って、コードを書きだした。 15分経過:「あれ?もう15分も経った?まー1位にはなれなくてもトップ集団には入るわ」 20分経過:「

    天才プログラマーと自分との実力差をカンタンに測定する方法 - ベルリンのITスタートアップで働くジャバ・ザ・ハットリの日記
    pongeponge
    pongeponge 2016/09/07
    何かどっかのサイトで似たような問題やったような気がする/15分とか、あっという間。
  • 本当に実用的なたったひとつのソートアルゴリズム - CARTA TECH BLOG

    コンテンツメディア事業部の新卒エンジニアがお送りいたします。 突然ですが、皆さんの好きなソートアルゴリズムはなんですか? 私は基数ソートのスマートでストイックな雰囲気に惹かれます。 とはいえ、普段の開発では「どのソートアルゴリズムを使うか」を意識することは少ないのではないでしょうか。 むしろ現実世界で「トランプが全部揃ってるか」を手作業で確認するときとかのほうが、実はソートアルゴリズムが必要なのかもしれません。 ということで(?)、そのような現実的な場面で、当に実用的なソートアルゴリズムを決める戦いが始まりました。 選手紹介 今回試したソートアルゴリズムは、独断と偏見で選んだ以下の5種類。 1 挿入ソート シンプル・イズ・ベスト!正直言ってベンチマークの噛ませ犬! 2 クイックソート 「クイック」の名前はダテじゃない!王者の貫禄を見せてやれ! 3 マージソート 安定感のある隠れた実

    本当に実用的なたったひとつのソートアルゴリズム - CARTA TECH BLOG
  • 競技プログラミング特有の変な実装テク - ichyo.jp

    初めに この記事はCompetitive Programming Advent Calendar 2014の15日目の記事です. 競技プログラミングでは,アルゴリズムをひらめく力や,数学やアルゴリズムの知識量などが強さを決める大きな要素ではありますが, もちろん,プログラミングを使った競技である以上は,コードの実装力が勝敗を分けることもあります. 例えば,ICPC系のコンテストでは,アルゴリズムを考える能力よりも,実装量の多いプログラムをいかにバグなく高速に実装するかが重要な 問題セットが与えられることが時々あります. 競技プログラミングと無縁なプログラマーは,実装力と聞くと, クラスの構造をうまく設計したり,変更に強い美しいコードを実装する能力だと想像する人がいるかもしれません. ですが,プログラミングコンテストに必要な実装力は,そうした保守性や拡張性ではなく, 「目的の処理をシンプルな

  • バブルソートよりも非効率なソートアルゴリズムを探して ―― ストゥージソートとスローソート - Line 1: Error: Invalid Blog('by Esehara' )

    はじめに 恐らく、プログラマの中で配列内の要素を整列させたりするソートにお世話にならなかった人、というのは余り考えられないのではないでしょうか。しかし、とはいえ、大抵はソートを自前で実装せず、組み込み関数であったり、あるいは何らかのライブラリで済ませることが殆どだと思う。 車輪の再発明というよりも、バグとか、自分が考慮していなかった挙動などを避けるために、自前でソートを組むことは余りないのですが、とはいえ、自分なりにソートを実装して見ると、それがどういう特徴を持ったソートであるか、というのがわかりますし、また、ソートというのはいったいどういう操作で実現されるのかという洞察が深まってくるなあ、という実感があったりする。 なので、今回はあるソート二つについての話を書くのが趣旨です。 最高のアルゴリズムはある、だが最悪のアルゴリズムは何か 一口にソートといったところで、ソート自体にも銀の弾丸があ

    バブルソートよりも非効率なソートアルゴリズムを探して ―― ストゥージソートとスローソート - Line 1: Error: Invalid Blog('by Esehara' )
  • プログラムの難しさの階層 - きしだのHatena

    プログラムを理解するのは、まあ難しいです。 でも、その難しさには階層があります。 よく、変数は箱だとか箱じゃないとか議論になりますが、何人か初心者に教えた感じでは、変数自体でつまづくことはあまりないので、実際はそんな例えをしなくても「変数は変数だ」で充分だったりします。 デバッガでステップ実行しながら変数の内容を見ればいい。 で、条件分岐くらいは結構つまづくことはなくて、単純な演算と条件分岐だけが必要なプログラムであればまあそれなりに書けるようです。 ぼくも、一番最初に自分の意図で作ったプログラムは input "ワカレミチガアル。ドウスル? 1:ミギ 2:ヒダリ"; a if a = 1 then print "ガケニオチテシニマシタ" else print "ライオンニカマレテシニマシタ" みたいなものでした。こういった条件分岐をたくさん並べてアドベンチャーゲームっぽいものを作った人は

    プログラムの難しさの階層 - きしだのHatena
    pongeponge
    pongeponge 2014/04/28
    ループで躓くかな?配列とポインタで躓く人が多いと思ってるけど
  • 1