テクノロゞヌ䌁業で働いおいたずきに䜿甚したデヌタ構造ずアルゎリズム

日垞業務でデヌタ構造ずアルゎリズムを䜿甚しおいたすかアルゎリズムを珟実ずあたり関係のないものだず考える人が増えおいるこずに気づきたした。ハむテク䌁業は、自分たちの気たぐれでむンタビュヌに興味を持っおいたす。倚くの人々は、アルゎリズムの問​​題は珟圚の研究ずはほずんど関係のない理論の分野からのものであるず䞍平を蚀いたす。 Homebrewの䜜者であるMaxHowellがGoogleのむンタビュヌで圌に䜕が起こったのかをツむヌトした埌、この芋方は間違いなく広がりたした。Google



゚ンゞニアの90があなたが曞いたプログラムHomebrewを䜿甚しおいたすが、あなたはボヌド䞊のバむナリツリヌを反転できないので、さようなら。



バむナリツリヌを反転する必芁はありたせんでしたが、Skype / Microsoft、Skyscanner、Uberで働いおいたずきに、日垞業務でデヌタ構造ずアルゎリズムを実際に䜿甚した䟋に出くわしたした。これには、デヌタ構造ずアルゎリズムの詳现に基づくコヌディングず意思決定が含たれおいたした。しかし、私はほずんどの堎合、特定のシステムがどのように䜜成されたか、そしおなぜそれらがそのように䜜成されたかを理解するために、関連する知識を䜿甚したした。関連する抂念の知識により、これらの抂念が䜿甚されおいるシステムのアヌキテクチャず実装を理解しやすくなりたす。







この蚘事では、ツリヌやグラフなどのデヌタ構造やさたざたなアルゎリズムが実際のプロゞェクトで䜿甚されおいる状況に぀いおの話を含めたした。ここで、デヌタ構造ずアルゎリズムの基本的な知識は、むンタビュヌだけに必芁な圹に立たない理論ではなく、急成長しおいる革新的なテクノロゞヌ䌁業で働く誰かが本圓に必芁ずする可胜性が非垞に高いこずを読者に瀺したいず思いたす。



ここではごく少数のアルゎリズムに぀いお説明したすが、デヌタ構造に関する限り、ここではそれらのほずんどすべおに觊れたす。私がアルゎリズムを匷調しすぎお、緎習に觊れおおらず、赀黒の朚やAVLの朚のような゚キゟチックなデヌタ構造をタヌゲットにしおいるようなむンタビュヌの質問のファンではないこずは、誰にずっおも圓然のこずです。私はむンタビュヌでそのような質問をしたこずがなく、質問もしたせん。この蚘事の最埌に、そのようなむンタビュヌに぀いおの私の考えを共有したす。しかし、䞊蚘にもかかわらず、基瀎ずなるデヌタ構造の知識は蚈り知れない䟡倀がありたす。この知識により、特定の実際的な問題を解決するために必芁なものを正確に遞択できたす。



次に、実際のデヌタ構造ずアルゎリズムの䜿甚䟋に移りたしょう。



ツリヌずツリヌトラバヌサルSkype、Uber、UIフレヌムワヌク



Xbox One甚のSkypeを開発しおいたずき、必芁なラむブラリがない玔粋なXboxOS甚にコヌドを䜜成する必芁がありたした。このプラットフォヌム甚の最初の本栌的なアプリケヌションの1぀を開発したした。タッチスクリヌンず音声コマンドの䞡方を䜿甚しお操䜜できるアプリケヌションナビゲヌションシステムが必芁でした。



基本的なWinJSベヌスのナビゲヌションフレヌムワヌクを䜜成したした。これを行うには、DOMのようなグラフを維持する必芁がありたした。これは、ナヌザヌが察話できる芁玠の芳察を敎理するために必芁でした。このような芁玠を芋぀けるために、DOMトラバヌサルを実行したした。これは、ツリヌトラバヌサル、぀たりDOM芁玠の既存の構造に芁玄されたす。これは、BFSたたはDFSの兞型的な䟋です幅優先怜玢たたは深床優先怜玢-幅優先怜玢たたは深床優先怜玢。



Web開発を行っおいる堎合、これは、ツリヌ構造、぀たりDOMをすでに䜿甚しおいるこずを意味したす。すべおのDOMノヌドは子ノヌドを持぀こずができたす。ブラりザは、DOMツリヌをトラバヌスした埌、画面にノヌドを衚瀺したす。特定の芁玠を芋぀ける必芁がある堎合は、組み蟌みのDOMメ゜ッドを䜿甚しおこの問題を解決できたす。たずえば、getElementByIdメ゜ッド。別の方法は、ノヌドをトラバヌスしお必芁なものを芋぀けるための独自のBFSたたはDFS゜リュヌションを開発するこずです。たずえば、ここでは同様のこずが行われたす。



UI芁玠をレンダリングする倚くのフレヌムワヌクは、その深さでツリヌ構造を䜿甚したす。そのため、Reactは仮想DOMをサポヌトし、スマヌトな調敎アルゎリズムを䜿甚したす比范。これにより、むンタヌフェむスの倉曎された郚分のみが再レンダリングされるため、高いパフォヌマンスを実珟できたす。このプロセスの可芖化は、ここで芋぀けるこずができたす。 モバむルアヌキテクチャUberでは、RIB



、朚も䜿甚されたす。これにより、このアヌキテクチャは、芁玠の階局構造を衚瀺する他のほずんどのUIフレヌムワヌクず同様になりたす。 RIBアヌキテクチャは、状態管理の目的でRIBツリヌを維持したす。 RIBをアタッチしたり、RIBからデタッチしたりするず、レンダリングが制埡されたす。 RIBを操䜜しおいるずきに、RIBが既存の階局に適合するかどうかを理解するためにスケッチを行い、問題のRIBに可芖芁玠を含める必芁があるかどうかに぀いお話し合うこずがありたした。぀たり、この構造がむンタヌフェむスの芖芚的衚珟の圢成に関䞎するのか、それずも状態管理にのみ䜿甚されるのかに぀いお話し合いたした。





RIBを䜿甚する堎合の状態遷移。あなたは、ここでのRIBの詳现を芋぀けるこずができたす。



あなたは、階局的な芁玠をレンダリングするツリヌ構造は通垞、それらを暪断しお蚪問した芁玠をレンダリング、このために䜿甚されおいるこずに泚意する必芁がある堎合。私はこのアプロヌチを採甚する倚くの内郚ツヌルに出くわしたした。このようなツヌルの䟋は、Uberのモバむルプラットフォヌムチヌムによっお䜜成されたRIBレンダラヌです。ここで、このトピックに関する話。



加重グラフず最短パスファむンダヌSkyscanner



Skyscannerは、航空刞のお買い埗情報を芋぀けるこずを目的ずしたプロゞェクトです。そのような提案の怜玢は、䞖界に存圚するすべおのルヌトを衚瀺および分析し、それらを組み合わせるこずによっお実行されたす。航空䌚瀟は次のフラむトの埅機時間を独自に蚈算するため、このタスクの本質は、怜玢ロボットによる自動デヌタ収集に関連しおおり、このすべおのデヌタをキャッシュするこずには関連しおいたせん。しかし、いく぀かの郜垂を蚪問する旅行を蚈画する可胜性は、最短の道を芋぀けるずいう仕事に垰着したす。



耇数郜垂の旅行蚈画は、Skyscannerが実装するのに長い時間がかかった可胜性の1぀でした。同時に、䞻に開発䞭のシステム自䜓に関連する問題。この皮の最良の取匕は、DijkstraやA *などの最短パスアルゎリズムを䜿甚しお芋぀けられたす。飛行ルヌトは、有向グラフの圢匏で衚瀺されたす。その各゚ッゞには、チケット䟡栌の圢匏で重みが割り圓おられたす。最適なルヌトを怜玢する堎合、2぀の郜垂間の最も安いルヌトを芋぀けるには、倉曎されたA *アルゎリズムの実装を䜿甚したす。航空刞の遞択ず最短ルヌトの怜玢のトピックに興味がある堎合は、 BFSを䜿甚しおそのような問題を解決するための良い蚘事がありたす。



ただし、Skyscannerの堎合、問題を解決するためにどのアルゎリズムが䜿甚されたかは特に重芁ではありたせんでした。キャッシング、怜玢ロボットの䜿甚、さたざたなサむトでの䜜業の敎理-これらはすべお、アルゎリズムを遞択するよりもはるかに困難でした。しかし同時に、最短経路を芋぀けるずいう問題のさたざたなバリ゚ヌションが、倚くの異なる旅行蚈画䌚瀟で発生し、そのような旅行のコストを最適化したす。圓然のこずながら、このトピックはSkyscannerでも舞台裏の話の䞻題ずなっおいたす。



䞊べ替えSkypeたたはそのようなもの



゜ヌトアルゎリズムを自分で実装したり、その構造の耇雑さを深く研究したりする理由はめったにありたせんでした。しかし、それにもかかわらず、バブル゜ヌト、挿入゜ヌト、マヌゞ゜ヌト、遞択゜ヌトから、最も耇雑なアルゎリズムであるクむック゜ヌトたで、このようなアルゎリズムがどのように機胜するかを理解するのは興味深いこずでした。特にラむブラリの䞀郚である゜ヌト関数を䜜成する必芁がない堎合は、このようなアルゎリズムを実装する必芁はめったにないこずがわかりたした。



しかし、Skypeでは、゜ヌトアルゎリズムの知識を実際に䜿甚する必芁がありたした。プログラマヌの1人が、連絡先を衚瀺するために挿入による䞊べ替えを実装するこずにしたした。 2013幎、Skypeがオンラむンだったずき、連絡先はバッチでダりンロヌドされたした。それらをすべおダりンロヌドするのに少し時間がかかりたした。その結果、そのプログラマヌは、挿入゜ヌトを䜿甚しお名前で゜ヌトされた連絡先のリストを䜜成する方がよいず考えたした。すでに実装されおいるものを䜿甚しない理由を考えながら、このアルゎリズムに぀いお倚くのこずを議論したした。その結果、アルゎリズムの実装を適切にテストし、そのパフォヌマンスを確認するのに最も時間がかかりたした。個人的には、このアルゎリズムの独自の実装を䜜成するこずにあたり意味がありたせんでした。しかし、その埌、プロゞェクトはそのような段階にありたしたそんなこずをする時間があったずころ。



もちろん、効率的な䞊べ替えがプロゞェクトで非垞に重芁な圹割を果たす実際の状況がありたす。たた、開発者がデヌタの機胜に基づいお独自に最適なアルゎリズムを遞択できる堎合、これにより゜リュヌションのパフォヌマンスが著しく向䞊する可胜性がありたす。挿入゜ヌトは、リアルタむムでどこかに送信された倧きなデヌタセットを操䜜し、このデヌタをすぐに芖芚化する堎合に非垞に圹立ちたす。マヌゞ゜ヌトは、異なるノヌドに栌玍されおいる倧量のデヌタを凊理する堎合の分割および埁服アプロヌチに適しおいたす。私はそのようなシステムを䜿ったこずがないので、今のずころ、゜ヌトアルゎリズムは日垞業務での䜿甚が制限されおいるものずしお考え続けおいたす。それは本圓です、さたざたな䞊べ替えアルゎリズムがどのように機胜するかを理解するこずの重芁性に぀いおではありたせん。



ハッシュテヌブルずハッシュどこでも



私が定期的に䜿甚するデヌタ構造はハッシュテヌブルです。これにはハッシュ関数も含たれたす。これは、特定の゚ンティティの数のカりント、重耇の怜出、キャッシュから、分散システムで䜿甚されるシャヌディングなどのシナリオたで、さたざたなタスクを解決するために䜿甚できる非垞に䟿利なツヌルです。ハッシュテヌブルは、配列の埌、プログラミングで最も䞀般的なデヌタ構造です。私はそれを無数の状況で䜿甚したした。ほがすべおのプログラミング蚀語に存圚し、必芁に応じお、自分で簡単に実装できたす。



スタックずキュヌ時々



スタックは、スタックトレヌスをサポヌトする蚀語で蚘述されたコヌドをデバッグしたこずのある人なら誰でも知っおいるデヌタ構造です。スタックをデヌタ構造ずしお説明するず、䜜業の過皋で、それを解決するために必芁ないく぀かの問題が発生したした。ただし、コヌドのパフォヌマンスをデバッグおよびプロファむリングするずきに、スタックを正しく知るこずができたこずに泚意しおください。スタックは、DFSを実行するずきに䜿甚するデヌタ構造の自然な遞択でもありたす。



キュヌを䜿甚する必芁はめったにありたせんでしたが、さたざたなプロゞェクトのコヌドベヌスでキュヌに頻繁に遭遇したした。䜕かがキュヌに入れられ、そこから䜕かが取埗されたずしたしょう。通垞、キュヌは幅優先のツリヌトラバヌサルを実装するために䜿甚され、このタスクに最適です。キュヌは、他の倚くの状況でも䜿甚できたす。ある日、最短のゞョブが最初に実行されたずきに、heapqPythonモゞュヌルによっお実装された優先床キュヌの適切な䜿甚䟋を芋぀けたゞョブスケゞュヌリングコヌドに出くわしたした。



暗号化アルゎリズムUber



ナヌザヌがモバむルアプリたたはWebアプリに入力する重芁なデヌタは、ネットワヌク経由で送信する前に暗号化する必芁がありたす。そしお、必芁な堎所でのみ埩号化したす。このような䜜業スキヌムを敎理するには、アプリケヌションのクラむアント郚分ずサヌバヌ郚分に暗号化アルゎリズムの実装が存圚する必芁がありたす。



暗号化アルゎリズムを理解するこずは非垞に興味深いこずです。同時に、特定の問題を解決するための独自のアルゎリズムを提䟛するべきではありたせん。これは、プログラマヌが考えるこずができる最悪のアむデアの1぀です。代わりに、既存の十分に文曞化された暙準を採甚し、それぞれのフレヌムワヌクのネむティブプリミティブを䜿甚したす。通垞、AESは、暗号化゜リュヌションを実装するずきに遞択される暙準ずしお機胜したす。..。米囜で分類された情報を暗号化するために䜿甚するのに十分な安党性がありたす。プロトコルに察する既知の動䜜䞭の攻撃はありたせん。 AES-192およびAES-256は通垞、ほずんどの実甚的なタスクに察しお非垞に信頌性がありたす。



Uberに来たずき、モバむル暗号化システムずWebアプリケヌションの暗号化システムはすでに実装されおいお、䞊蚘のメカニズムに基づいおいたので、AESAdvanced Encryption Standard、HMACHashed Message Authentication Codesの詳现を調べる蚀い蚳がありたした。 、RSAアルゎリズムなどに぀いお。暗号化で䜿甚される䞀連のアクションの暗号化匷床がどのように蚌明されるかを理解するこずも興味深いものでした。たずえば、添付デヌタを䜿甚した認蚌枈み暗号化に぀いお説明するず、encrypt-and-MAC、MAC-then-encrypt、encrypt-then-MACモヌドを分析するず、そのうちの1぀だけの暗号化匷床を蚌明できたすが、これはその意味ではありたせん。残りは暗号的に安党ではありたせん。



完党に新しい暗号化フレヌムワヌクを実装しない限り、暗号化プリミティブを自分で実装する必芁はほずんどありたせん。ただし、䜿甚するプリミティブずそれらを組み合わせる方法を決定する必芁がある堎合がありたす。特定のシステムがデヌタ暗号化に特定のアプロヌチを䜿甚する理由を理解するために、暗号化アルゎリズムの分野の知識が必芁になる堎合もありたす。



決定ツリヌUber



プロゞェクトの1぀に取り組んでいる間、モバむルアプリケヌションに耇雑なビゞネスロゞックを実装する必芁がありたした。぀たり、半ダヌスのルヌルに基づいお、いく぀かの画面の1぀を衚瀺する必芁がありたした。テストシヌケンスの結果ずナヌザヌの奜みを考慮に入れる必芁があるため、これらのルヌルは非垞に耇雑でした。



この問題の解決を始めたプログラマヌは、最初にこれらすべおのルヌルをif-elseステヌトメントの圢匏で衚珟しようずしたした。その結果、コヌドが非垞に混乱したした。その結果、決定ツリヌを䜿甚するこずが決定されたした。圌の助けを借りお、必芁なすべおのチェックを簡単に実行できたした。実装は比范的簡単でした。たた、必芁に応じお問題なく亀換できたす。条件チェックがその゚ッゞで実行されるように、決定ツリヌの独自の実装を䜜成する必芁がありたした。このツリヌに必芁なのはこれだけです。別のアプロヌチをずるこずでツリヌの実装に費やす時間を節玄できたかもしれたせんが、チヌムは特定のツリヌを維持する方が簡単であるず刀断し、䜜業に取り掛かりたした。このツリヌは次のようになりたす。゚ッゞは条件をチェックした結果を衚しこれらはバむナリ結果、たたは倀の範囲で衚された結果です、ツリヌのリヌフノヌドはナビゲヌトする必芁のある画面を瀺したす。





, , .



SubmitQueueず呌ばれるUberのモバむルアプリのビルドシステムも決定ツリヌを䜿甚したしたが、動的に生成されたした。開発者゚クスペリ゚ンスチヌムは、数癟の゜ヌスブランチずタヌゲットブランチを毎日マヌゞするずいう難しい問題に取り組む必芁がありたした。同時に、各アセンブリの完了には玄30分かかりたした。これには、コンパむル、ナニットテストず統合テストの実行、およびむンタヌフェむステストが含たれたす。アセンブリの䞊列化は十分な解決策ではありたせんでした。異なるアセンブリで倉曎が重耇するこずが倚く、マヌゞの競合が発生したためです。実際には、これは、プログラマヌが2〜3時間埅っお、リベヌスし、マヌゞプロセスを再開しなければならない堎合があるこずを意味し、今回は競合に盎面しないこずを期埅しおいたした。



Developer Experienceチヌムは革新的なアプロヌチを採甚しお、マヌゞの競合を予枬し、それに応じおアセンブリをキュヌに入れたした。これは、特別なバむナリ決定ツリヌ掚枬ツリヌを䜿甚しお行われたした。





SubmitQueueは、予枬された確率で泚釈が付けられた゚ッゞを持぀バむナリ決定ツリヌを䜿甚したす。このアプロヌチにより、䞊列で実行できるアセンブリのセットを決定できたす。これは、タスクの受信ず実行の間の時間を短瞮し、システムのスルヌプットを向䞊させるために行われたす。この堎合、完党にテストされ実行可胜なコヌドのみがマスタヌブランチに入る必芁がありたす。



このシステムを䜜成した開発者゚クスペリ゚ンスチヌムは、それに関する優れた資料を䜜成したした。しかし、ここに-同じトピックに関する別の蚘事。このシステムの実装の結果、以前よりもはるかに高速なプロゞェクトアセンブリシステムが䜜成されたした。これにより、プロゞェクトのビルド時間を最適化し、䜕癟人ものモバむルプログラマヌの生掻を楜にするこずができたした。



六角圢のグリッド、階局むンデックスUber



これが私がここで話したい最埌のプロゞェクトです。それは完党に1぀の特定のデヌタ構造に基づいおいたした。それをするこずで、このデヌタ構造に぀いお孊びたした。階局むンデックスを持぀六角圢のグリッドに぀いお話しおいたす。



Uberで最も困難で興味深い問題の1぀は、旅費の最適化ずパヌトナヌ間の泚文の分配でした。旅行の料金は動的に倉化する可胜性があり、ドラむバヌは垞に移動しおいたす。 Uberの゚ンゞニアがH3グリッドシステムを䜜成したした。さたざたな芏暡の郜垂党䜓のデヌタを芖芚化および分析するように蚭蚈されおいたす。䞊蚘の問題を解決するために䜿甚されるデヌタ構造は、階局むンデックスを持぀六角圢のグリッドです。デヌタを芖芚化するために、いく぀かの専甚の内郚ツヌルが䜿甚されたす。





マップを六角圢のセルに分割する 



このデヌタ構造には、独自のむンデックスシステム、トラバヌサル、グリッドの個々の領域の独自の定矩、独自の機胜がありたす。これらすべおの詳现な説明は、察応するAPIのドキュメントに蚘茉されおいたす。 H3の詳现に぀いおはこちらをご芧ください。これが゜ヌスコヌドです。ここでは、このシステムが䜜成された方法ず理由に぀いおのストヌリヌを芋぀けるこずができたす。



このシステムの経隓から、非垞に具䜓的な問題を解決するずきに、独自の特殊なデヌタ構造を䜜成するこずが理にかなっおいるずいう事実を感じるこずができたした。異なるレベルの各結果デヌタフラグメントずの比范でマップフラグメントぞの分割を考慮しない堎合、六角圢グリッドを適甚できる゜リュヌションの問題はほずんどありたせん。ただし、他の堎合ず同様に、他のデヌタ構造に粟通しおいる堎合は、これをはるかに理解しやすくなりたす。たた、六角圢のグリッドを扱ったこずがある人にずっおは、そのようなグリッドを䜿甚しお解決される問題ず同様の問題を解決するように蚭蚈された新しいデヌタ構造を䜜成する方が簡単です。



むンタビュヌにおけるデヌタ構造ずアルゎリズム



䞊蚘では、さたざたな䌁業で長い間働いおいたずきに遭遇したデヌタ構造ずアルゎリズムに぀いお説明したした。蚘事の冒頭で述べたMaxHowellによるツむヌトに戻るこずを提案したす。そこでマックスは、Googleのむンタビュヌで、ボヌド䞊のバむナリツリヌを反転するように求められたず䞍満を挏らしたした。圌はしたせんでした。圌はドアを芋せられた。この状況では、私はマックスの偎にいたす。



人気のあるアルゎリズムがどのように機胜するか、たたぱキゟチックなデヌタ構造がどのように機胜するかを知るこずは、ハむテク䌁業で働くために必芁な皮類の知識ではないず思いたす。アルゎリズムが䜕であるかを知る必芁がありたす。たずえば、「貪欲」の原則に取り組むなど、単玔なアルゎリズムを独自に考え出すこずができる必芁がありたす。たた、ハッシュテヌブル、キュヌ、スタックなどの最も䞀般的なデヌタ構造に぀いおの知識も必芁です。しかし、DijkstraのアルゎリズムやA *のような非垞に具䜓的なもの、たたはさらに耇雑なものは、暗蚘する必芁のあるものではありたせん。これらのアルゎリズムが本圓に必芁な堎合は、それらの参考資料を簡単に芋぀けるこずができたす。たずえば、゜ヌトアルゎリズムずは関係のないアルゎリズムに぀いお話す堎合、私は通垞、それらを䞀般的な甚語で理解し、その本質を理解しようずしたした。同じこずが、赀黒の朚やAVLの朚のような゚キゟチックなデヌタ構造にも圓おはたりたす。私はそれらを䜿甚する必芁はありたせんでした。そしお、必芁に応じお、適切な出版物に頌るこずで、い぀でもそれらに぀いおの知識を曎新するこずができたした。私が蚀ったように、むンタビュヌするずき、私はそのような質問をするこずは決しおなく、圌らに尋ねる぀もりもありたせん。



私はプログラミングに関連する実際的な問題に賛成です。解決には、アルゎリズムの「ブルヌトフォヌス」や「貪欲」なバリ゚ヌションの方法から、より高床なアルゎリズムのアむデアたで、さたざたなアプロヌチを適甚できたす。たずえば、このようなテキストの配眮タスクを実行しおもたったく問題ないず思いたす。たずえば、Windows Phoneでテキストをレンダリングするためのコンポヌネントを䜜成するずきに、この問題を解決する必芁がありたした。この問題は、トリッキヌなデヌタ構造に頌るこずなく、配列ずいく぀かのif-elseステヌトメントを䜿甚するだけで解決できたす。



実際、倚くのチヌムや䌁業は、アルゎリズムの問​​題の重芁性を誇匵しおいたす。アルゎリズムの質問の魅力を理解しおいたす。短時間で応募者を評䟡でき、やり盎しも簡単です。぀たり、誰かに聞いた質問が公開されおも、特別な問題は発生したせん。アルゎリズムの質問は、倚数の申請者の詊隓を敎理するのに適しおいたす。たずえば、100を超える質問のプヌルを䜜成し、それらを応募者にランダムに配垃できたす。動的プログラミングず゚キゟチックなデヌタ構造に関する質問はたすたす䞀般的になっおいたす。特にシリコンバレヌで。これらの質問は、䌁業が匷力なプログラマヌを雇うのに圹立ちたす。しかし、これらの同じ質問は、ビゞネスで成功した人々ぞの䌚瀟の道を閉じるこずができたす、アルゎリズムの深い知識が必芁ない堎合。



生たれおから耇雑なアルゎリズムに粟通しおいる人だけを雇っおいる䌚瀟の堎合は、これらが必芁な人かどうかを慎重に怜蚎するこずをお勧めしたす。たずえば、SkyscannerロンドンずUberアムステルダムで、トリッキヌなアルゎリズムの質問をせずに玠晎らしいチヌムを雇いたした。私は自分自身を最も䞀般的なデヌタ構造に限定し、問題解決に関連するむンタビュヌ察象者の胜力をテストしたした。぀たり、圌らは䞀般的なデヌタ構造に぀いお知り、盎面しおいる問題を解決するための簡単なアルゎリズムを考え出すこずができる必芁がありたした。デヌタ構造ずアルゎリズムは単なるツヌルです。



結論デヌタ構造ずアルゎリズムはツヌルです



ダむナミックで革新的なテクノロゞヌ䌁業で働いおいる堎合、おそらくこの䌁業の補品のコヌドにさたざたなデヌタ構造ずアルゎリズムの実装に遭遇するでしょう。たったく新しいものを開発しおいる堎合は、盎面しおいる問題の解決を容易にするデヌタ構造を探す必芁がありたす。このような状況では、正しい遞択を行うために、アルゎリズムずデヌタ構造、およびそれらの長所ず短所に関する䞀般的な知識が必芁です。



デヌタ構造ずアルゎリズムは、プログラムを䜜成するずきに自信を持っお䜿甚する必芁があるツヌルです。これらのツヌルを知っおいるず、それらを䜿甚するコヌドベヌスですでに知っおいるこずがたくさんわかりたす。さらに、そのような知識により、耇雑な問題をより自信を持っお解決するこずができたす。アルゎリズムの理論䞊の制限ず、それらを最適化する方法を理解できたす。これは、必芁なすべおのトレヌドオフを䜿甚しお、可胜な限り優れおいるこずが刀明する゜リュヌションに最終的に到達するのに圹立ちたす。



デヌタ構造ずアルゎリズムをよりよく理解したい堎合は、次のヒントずリ゜ヌスをご芧ください。



  • -, , , , , , . , , . , . — , .
  • « ». , , , . — , , . , , , .
  • さらにいく぀かの本がありたす「アルゎリズム。開発ガむド「および「Javaのアルゎリズム、第4版」。それらを䜿甚しお、倧孊のアルゎリズムに関する知識を曎新したした。確かに、私はそれらを最埌たで読んでいたせん。それらは私にはかなり也燥しおいお、私の日垞の仕事には適甚できないように芋えたした。


実際にどのようなデヌタ構造ずアルゎリズムに遭遇したしたか






All Articles