コンピュヌティングオリンピックで 3 ぀の金メダルのうち 4 ぀を獲埗した方法

コンピュヌティングオリンピックで 3 ぀の金メダルのうち 4 ぀を獲埗した方法

私は Google HashCode World Championship Finals 2017 の準備をしおいたした。これは、Google が䞻催するアルゎリズム問題を扱う最倧のコンテストです。

私は XNUMX 幎生のずきに C++ をれロから孊び始めたした。 私はプログラミング、アルゎリズム、デヌタ構造に぀いお䜕も知りたせんでした。 ある時点で、最初のコヌド行を曞きたした。 XNUMX か月埌、プログラミング コンテストが目前に迫っおきたした。 自分のプログラミング孊習スタむルがどれだけ効果があるのか​​を知りたかったのです。 それは絶奜の機䌚でした。

XNUMX日間の競技の埌、結果が出たした。私は金メダルを獲埗したした。

私はショックを受けたした。 私は 5 幎の経隓を持぀競合他瀟よりも先を行っおいたした。 䞀生懞呜努力しおきたこずは分かっおいたしたが、この成果は私の期埅をすべお䞊回りたした。 スポヌツ プログラミングが自分のテヌマであるこずに気づき、真っ向からそれに取り組みたした。

私は䜕が私を成功に導いたのかを知っおいるので、それを皆さんず共有したいず思いたす。

コンピュヌティングオリンピックで 3 ぀の金メダルのうち 4 ぀を獲埗した方法

この蚘事は EDISON Software のサポヌトを受けお翻蚳されたした。 プログラマヌの健康ず朝食の䞖話をしたすず カスタム゜フトりェアを開発したす.

どのプログラミング蚀語を遞択するか

  • C++ - 匷くお勧めしたす! 圌はずおも速いです。 STL によりアルゎリズムの実装にはほずんど時間がかかりたせん。 C++ はすべおのコンテストで受け入れられたす。 最初のコヌド行は C++ で曞きたした。
  • C - STL のために C++ を孊びたす。 C の知識がある堎合は、C++ でプログラミングするこずもできたす。
  • Java は遅いプログラミング蚀語です。 Big Integer クラスがありたすが、あたり圹に立ちたせん。 競技に制限時間がある堎合でも、Java を䜿えば必ず制限時間を超えるこずができたす。 Java はすべおのコンテストで受け入れられるわけではありたせん。

どこで緎習できたすか

私はお勧め スフィアオンラむンゞャッゞSPOJ。 量・質ずもに有効な資源です。 問題を解決する過皋で行き詰たった堎合は、゚ディタヌず゜リュヌションをオンラむンで利甚できたす。 このサむト以倖にもお勧めしたす SPOJ ツヌルキット О SPOJ.pl の問題分類子.

たずは基瀎知識を磚く必芁がある

蚀語の構文に慣れるず、克服すべき問題がいく぀かありたす。 緎習が必芁な簡単な問題から始めおください。 この段階で重芁なのは、プログラミング スタむルを決定するこずです。 空癜を倚く含むコヌドを曞くのが奜きな人もいるかもしれたせんし、そうでない人もいるかもしれたせん。 括匧を「if」ず同じ行に眮くこずも、別の行に眮くこずもできたす。

それはあなたのスタむルなので、自分のプログラミング スタむルを芋぀ける必芁がありたす。

それを探すずきは、次の XNUMX ぀の基本原則を思い出しおください。

  • コヌドは実装が簡単である必芁がありたす。 思い぀いた゜リュヌションを安心しお実装できるはずです。 なぜ なぜなら、競技䞭にコヌドに倢䞭になるこずは絶察に避けたいからです。 コヌドの実装を簡略化する方法を考えるために远加の 5 分を費やしたほうが、コヌドを理解するのに 10 分を費やすよりも垞に優れおいたす。
  • コヌドは読みやすくなければなりたせん。 コヌドが読みやすいず、デバッグも簡単です。 正盎に蚀っお、バグは垞に発生したす。 残り 10 分なのに間違いが芋぀からないずきのこの気持ち、わかりたすか? もちろんそうでしょう。 この状況を回避するには、読みやすいコヌドを䜜成しおください。 デバッグを開始するず、コヌドは自然で理解しやすいものになるでしょう。

これは私の䟋です プログラミングスタむル。

開発スキルを向䞊させる方法

緎習、緎習、そしおもっず緎習。 最初の 250 個の最も解決可胜な問題に取り組むこずをお勧めしたす。 スポゞ。 順番に解決しおください。 それぞれの解決策に぀いお少なくずも XNUMX 時間かけお考えおください。

「この問題は私には難しすぎるので、次の問題を解いおみたす」ずは蚀わないでください。 敗者の考え方はこうだ。

玙ず鉛筆を甚意しおください。 考えおみおください。 解決策が芋぀かるかもしれないし、芋぀からないかもしれない。 少なくずも、アルゎリズム的思考を逊うこずになりたす。 XNUMX 時間以内に解決策が思い぀かない堎合は、フォヌラムたたは蚘事で既補の解決策を探しおください。

このアプロヌチで䜕を達成できたすか? コヌドを䜿甚しおアむデアをすばやく実装する方法を孊びたす。 そしお叀兞的な問題ずアルゎリズムを勉匷しおください。

次に、アルゎリズムずデヌタ構造をマスタヌする必芁がありたす。

階局的なアプロヌチに埓いたす。 歩き方を知らずにランニングを始めたしたか いいえ。 しっかりした基瀎がなければ超高局ビルを建おるこずはできたすか 二床ずない。

孊習パスに沿ったステップを無芖するこずはできたせん。 それらを無芖するず、知識のギャップが残るこずになりたす。 時間が経぀に぀れお、それらは悪化するだけです。

基本的なアルゎリズムずデヌタ構造から始める

始めるのは難しいです。 おそらく、最初に䜕を勉匷すればよいかわからないからです。 それが理由です ビデオコヌス「アルゎリズムずデヌタ構造」を䜜成したした。 このコヌスを䜜成するずき、私はどのように教えおもらいたいかを基準にしたした。 反応は信じられないほどでした 最初の 3000 か月で 100 か囜以䞊から XNUMX 人以䞊の孊生がコヌスに登録したした。

簡単な問題を解くこずに取り組んでも、䞊達するこずはありたせん。

知らないこずを理解する最も効果的な方法は、実際に経隓するこずです。 そうやっお孊びたした。 挑戊的なタスクを遞択するこずで、これたで聞いたこずのない倚くの新しいテクニックを孊びたした。

XNUMX 番目の問題に取り組むごずに、䜕か新しいこずを孊べるはずです。 問題を遞択するずきはより泚意しおください。 より難しい問題を遞択しおください

SPOJ のこれら 250 の問題を完了するず、スポヌツ プログラミングの栞ずなるトピックの基本を理解できるようになりたす。 基本的なアルゎリズムの背埌にあるロゞックを深く理解しおいれば、高レベルのアルゎリズムはそれほど耇雑ではないように芋えたす。 こうするこずで、自分の知識を最倧限に掻甚するこずができたす。

それぞれの䞻芁テヌマをさらに深く掘り䞋げる

貎重な資料はこちら たくさんの情報ずずもに。 そこには、各トピックのトップ 10 のアルゎリズムずデヌタ構造が衚瀺されたす。 SPOJ からの 250 の問題を解けば、このリストから倚くのこずが分かるでしょう。 しかし、これたで聞いたこずのない倚くのこずに遭遇するこずもありたす。 したがっお、これらのトピックを昇順に孊習しおください。

新しいこずを孊んだ埌に知識を匷化しないず、すぐにすべおを忘れおしたいたす。
新しいアルゎリズムを孊習したら、実際に䜿甚するこずをお勧めしたす。 2  3 ぀のタスクを実行しおください。 SPOJ でアルゎリズム タグを探したす。 そこでは、このアルゎリズムを解決する必芁がある問題が芋぀かりたす。 たずこれらの問題に察凊しおください。

動的プログラミングをマスタヌしおください。それがあなたを勝利に導きたす
私の経隓から蚀えば、どの競技にも少なくずも XNUMX ぀は問題がありたす 動的プログラミング。 「動的プログラミング」ずいう蚀葉を聞くず、たったく理解できずに頭が痛くなる人も倚いでしょう。

そしお、これは良いこずです。 動的プログラミングを理解しおいれば勝おるからです。

私は動的プログラミングが奜きで、䞀番奜きなトピックです。 動的プログラミングの秘密は、ロヌカルな遞択だけでなく、グロヌバルに最適な遞択を行うこずです。 問題をより単玔なサブ問題に分割する必芁がありたす。 これらの䞋䜍問題はそれぞれ XNUMX 回だけ解決しおください。 次に、解決された郚分問題を組み合わせた゜リュヌションを䜜成したす。 貪欲なアルゎリズム - 動的プログラミングの逆。 各ステップで局所的に最適な遞択を行う必芁がありたす。 そしお、局所的に最適な遞択は、悪い党䜓的な解決策に぀ながる可胜性がありたす。

新しい抂念を孊びながら、次のこずを確認しおください TopCoder チュヌトリアル。 ずおも詳しくおわかりやすいです。 圌らのおかげで理解できたした バむナリむンデックス付きツリヌ.

䞀生懞呜働く

䜕幎も緎習せずにオリンピックで優勝したアスリヌトのこずを聞いたこずがありたすか? 私は違いたす。

毎幎、コンピュヌタヌ オリンピックの準備は XNUMX 月に始たり、XNUMX 月に終了したした。

この8か月間、私は毎日5時間緎習したした。

はい、私はこの 5 時間をアルゎリズムの問​​題を解くだけに費やしたした。 8時間、堎合によっおは10時間も緎習した日々を思い出したす。 なぜ 奜きだったから。 毎日孊校から家に垰るず、私は寝宀に盎行し、コンピュヌタヌの前に座っお、新しい問題の分析を始めたした。 あるいは、この問題を解決するために知る必芁のある新しいアルゎリズムを孊んでいたした。

勝ちたければ、同じこずをしなければなりたせん。 問題を遞択し、それに固執したす。 スヌパヌに行くずきや車を運転しながら考えおみおください。

コンピュヌティングオリンピックで 3 ぀の金メダルのうち 4 ぀を獲埗した方法

睡眠䞭、脳はその日に収集した情報を断片化解陀するこずをご存知ですか? 圌は本棚に本をアルファベット順に積み䞊げおいるようだ。 基本的に、あなたの脳はあなたが盎面しおいるさたざたな問題に぀いお考えたす。

これは䞊手に䜿えたすね。 寝る前に難しい問題を読んで、それを解決するために䜕が必芁かを思い出しおください。 この段階では、解決策自䜓を探す必芁はありたせん。 寝る。 あなたの脳はこの問題を凊理し始めたす。 目が芚めるず、寝おいる間に解決策を芋぀けたこずに驚くでしょう。

自分で詊しおみおください。 たるで魔法のようです。

動画ブログを䜜りたした

コンピュヌティングオリンピックで 3 ぀の金メダルのうち 4 ぀を獲埗した方法

この短い段萜はスポヌツ番組ずは関係ありたせん。 もしあなたがXNUMX代で、私が䞖界をどのように芋おいるか疑問に思っおいるなら、ぜひチェックしおみおください。 Youtube 䞊の私のビデオ ブログ。 その䞭で䞖界、生呜、コンピュヌタヌサむ゚ンスに぀いお話したす。

賢く仕事をする

これが成功の秘蚣です。 目暙が必芁です。

私たちは人間であり、それが奜きです 先延ばしにする。 私たちは垞に、今やらなければいけないこずを先延ばしにしたくなりたす。 ダむナミック プログラミングの問題に察凊するよりも、Netflix を芋るほうがずっず楜しいです。 あなたはこれを知っおいるので、それを修正する必芁がありたす。

先延ばし癖を克服する方法

自分自身の目暙を蚭定したす。 新しいこずを孊べる興味深い問題が必ず芋぀かりたす (䞊蚘のリ゜ヌスを確認しおください)。 しかし、これらの問題は単に読むだけではなく、解決する必芁がありたす。

そこで私が先延ばし癖を克服した方法をご玹介したす。 私は玙のカレンダヌを始めお、解決したい問題を毎日詰め蟌みたした。 私はい぀もXNUMX日前に問題を蚘入しおいたした。 そのため、その埌の数日間で時間を管理する方法がわかりたした。

コンピュヌティングオリンピックで 3 ぀の金メダルのうち 4 ぀を獲埗した方法

だから私は垞にモチベヌションを保っおいたした。 カレンダヌの次の日を埋めるために、いく぀かの問題を解決し、新しい問題を芋぀ける必芁がありたした。 解決した問題を消しおいくのはずおも気持ちいいです。 あなたも気に入っおいるず思いたす。

自分だけの玙カレンダヌを手に入れたしょう。 明日忘れおしたうような別の ToDo リストを携垯電話に䜜成しないでください。

効果的にデバッグする方法

プロになりたいですか そうであれば、「頭の䞭でデバッグする」必芁がありたす。
これはデバッガヌをたったく必芁ずしないため、私が知っおいる䞭で最も効率的なデバッグ手法です。 あなたの脳は耇数のコヌドブランチを䞀床に調べお、コヌドのより広範な抂芁を埗るこずができたす。 クラシックデバッガ.

自分自身を、チェスをプレむしお 3 手先を考えるグランドマスタヌにたずえるこずができたす。

私はこのテクニックを最初の防埡線ずしおのみ䜿甚したす。 次に、実際のデバッガを䜿甚したす。

頭の䞭でデバッグする方法を孊ぶには、緎習する必芁がありたす。 問題の解決策を怜蚌しお「間違った答え」が埗られた堎合は、すぐにデバッガヌ ボタンに進たないでください。 コヌドをもう䞀床読んで、「この行で䜕が起こっおいるのか?」、「ここの "if" はプログラムにどのような圱響を䞎えるのか?」、「ルヌプを終了するずきの反埩子の倀は䜕か?」を考えおください。

こうするこずで自分で考えるこずができたす。 時間が経぀に぀れお、コヌドを曞いおその堎でデバッグする方法を孊びたす。

著者に぀いお

コンピュヌティングオリンピックで 3 ぀の金メダルのうち 4 ぀を獲埗した方法
Andrei Margeloiu は、起業家粟神、スタヌトアップ、アりトドアに興味を持぀熱心なプログラマヌです。 圌に連絡できたす LinkedIn で.

翻蚳: ダむアナ・シェレミ゚ワ

出所 habr.com

コメントを远加したす