ARTSチェックイン4週目、安心してください

導入

月日が経つのは早いもので、すでに学習とチェックインの 4 週目であり、このイベントの最終週でもあります。Shopkeeper 3 を知っている人なら誰でも、私が 6 年間技術ブログを作成しており、毎月少なくとも 6 つのブログ投稿を定期的に公開していることを知っているはずです。同時に、共有が大好きな開発者として、ARTS のような活動は当然必要不可欠です。一緒に共有する予定なので、ローカルドキュメントの記録は以前に行ったことがありますので、内容を統合するだけで、4週目のチェックインが始まります。

アルゴリズム

今週は、より古典的なアルゴリズムの質問を共有したいと思います。これは Leetcode-449 ( LeetCode 公式 Web サイト - 世界中のオタクに愛されている技術成長プラットフォーム) の古典的なアルゴリズムの質問でもあります: シリアル化と逆シリアル化 2 フォーク検索ツリー問題。

シリアル化とは、データ構造またはオブジェクトをビットのシーケンスに変換して、ファイルまたはメモリ バッファに保存したり、同じまたは別のコンピュータ環境で後で再構築するためにネットワーク接続リンクを介して送信したりできるようにするプロセスです。

二分探索ツリーをシリアル化および逆シリアル化するアルゴリズムを設計します。シリアル化/逆シリアル化アルゴリズムの動作方法に制限はありません。バイナリ検索ツリーを文字列にシリアル化できること、およびその文字列を元のバイナリ検索ツリーに逆シリアル化できることを確認する必要があるだけです。

エンコードされた文字列はできるだけコンパクトにする必要があります。

アイデア: バイナリ ツリーが与えられた場合、「事前順序トラバーサル」と「順序トラバーサル」によってバイナリ ツリーを復元できます。バイナリ ツリーが与えられた場合、「ポストオーダー トラバーサル」および「インオーダー トラバーサル」によってもバイナリ ツリーを復元できます。二分探索ツリーの場合、「前順走査」または「後順走査」が与えられた場合、それらをソートすることで「順序内走査」を取得できます。したがって、シリアル化および逆シリアル化の要件は、二分探索ツリー上で「前順序トラバーサル」または「後順序トラバーサル」を実行するだけで実現できます。この問題は、「ポストオーダー トラバーサル」方法を使用して解決されます。

シリアル化するときは、二分探索ツリーの事後走査を実行し、配列を文字列にエンコードするだけで済みます。

逆シリアル化するときは、ポストオーダートラバーサルのために文字列を配列にデコードする必要があります。ポストオーダーで走査された配列をバイナリ検索ツリーに復元する場合、インオーダーで走査された配列をソートし、インオーダーとポストオーダーで走査された配列に基づいてバイナリ ツリーを復元する必要はありません。配列は、順序に従って事後順序で直接走査することができます。復元された二分探索ツリーの配列。事後走査によって得られた配列では、ルート ノードの値は配列の最後にあり、左側のサブツリーのノードはすべてルート ノードの値より小さく、右側のサブツリーのノードはすべてルート ノードの値よりも大きいこれらのプロパティに基づいて再帰関数を設計し、2 番目のフォーク検索ツリーを復元できます。

具体的な JS 実装コードは次のとおりです。

var serialize = function(root) {
    const list = [];

    const postOrder = (root, list) => {
        if (!root) {
            return;
        }
        postOrder(root.left, list);
        postOrder(root.right, list);
        list.push(root.val);
    }

    postOrder(root, list);
    const str = list.join(',');
    return str;
};

var deserialize = function(data) {
    if (data.length === 0) {
        return null;
    }
    let arr = data.split(',');
    const length = arr.length;
    const stack = [];
    for (let i = 0; i < length; i++) {
        stack.push(parseInt(arr[i]));
    }

    const construct = (lower, upper, stack) => {
        if (stack.length === 0 || stack[stack.length - 1] < lower || stack[stack.length - 1] > upper) {
            return null;
        }
        const val = stack.pop();
        const root = new TreeNode(val);
        root.right = construct(val, upper, stack);
        root.left = construct(lower, val, stack);
        return root;
    }

    return construct(-Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, stack);
};

複雑さの分析:

時間計算量: O(n)O(n)O(n)、nnn はツリー内のノードの数です。Serialize\textit{serialize}serialize は、各ポイントを走査するのに O(n)O(n)O(n) 時間を必要とします。deserialize\textit{deserialize}deserialize では、各ポイントを復元するのに O(n)O(n)O(n) 時間がかかります。

空間複雑度: O(n)O(n)O(n)、ここで nnn はツリー内のノードの数です。Serialize\textit{serialize}serialize は、配列内の各点の値を保存するために O(n)O(n)O(n) のスペースを必要とし、最も深い再帰の深さは O(n)O(n)O(n) です。 。deserialize\textit{deserialize}deserialize は、配列内の各点の値を保存するために O(n)O(n)O(n) のスペースを必要とし、最も深い再帰の深さは O(n)O(n)O(n) です。 。

レビュー

今週は、ブロックチェーンについて学んでいる英語の記事を共有します。この記事は、ビットコインが実際にどのように機能するかについてです。記事のリンクは、ビットコインプロトコルの実際の動作 – DDIです。ここから、この記事は、いくつかの内容を理解するために、より技術的な観点に入ります。ビットコインの技術的な詳細は理解できますが、ビットコイン プロトコル フレームワーク全体を理解し、ビットコインに代表されるブロックチェーン プロジェクトの技術パラダイムに精通している必要があります。

共有するためのいくつかの抜粋を次に示します。

Infocoin の最初のバージョンの問題は、アリスがボブに同じ署名付きメッセージを何度も送信し続ける可能性があることです。ボブが「私、アリスはボブにインフォコインを 1 つ与えます」という署名付きメッセージのコピーを 10 部受け取ったとします。それは、アリスがボブに 10 個の異なる infocoin を送ったということですか? 彼女のメッセージが誤って複製されたのでしょうか? おそらく、彼女はボブをだまして、10 個の異なるインフォコインを渡したように信じ込ませようとしたのでしょう。そのメッセージは、彼女が 1 つのインフォコインを転送するつもりであることを世界に証明しているだけです。

私たちが望んでいるのは、infocoin をユニークなものにする方法です。ラベルまたはシリアル番号が必要です。アリスは、「私、アリスは、シリアル番号 8740348 のインフォコインをボブに 1 つ与えます」というメッセージに署名します。その後、アリスは「私、アリスはボブにシリアル番号 8770431 のインフォコインを 1 つ与えます」というメッセージに署名することができ、ボブ (および他の全員) は別のインフォコインが転送されていることを知ることになります。

Infocoin の最初のバージョンの問題の 1 つは、アリスが同じ署名付きメッセージをボブに送信し続ける可能性があることでした。ボブが「私、アリス、ボブに情報コインをあげます」という 10 個の署名付き情報を受け取ったとします。これは、アリスがボブに 10 個の異なる情報コインを送信したことを意味しますか? 彼女の情報は誤ってコピーされたのでしょうか? おそらく、彼女はボブをだまして、10 個の異なるインフォコインを渡したように信じ込ませようとしていたのでしょう。そして、このメッセージは、彼女が 1 つのインフォコインを転送するつもりだったということを世界に証明しただけでした。

私たちが望んでいるのは、Infocoin をユニークなものにする方法です。タグまたはシリアル番号が必要です。アリスはメッセージに署名します。「私、アリスは、シリアル番号 8740348 の情報コインをボブに渡します。」次に、アリスは「私、アリス、ボブにシリアル番号 8770431 のインフォコインを与えます」というメッセージに署名すると、ボブ (および他の人) は別のインフォコインが転送されていることを知ることになります。

テクニック・ヒント

今回はフロントエンド開発に関する重要な知識ポイントを共有します. フロントエンド開発プロセスでは、アルゴリズム関連の知識と貪欲なアルゴリズム関連の知識ポイントの使用が必要になります。ここでは、株式の売買に最適な時期についてのフロントエンド開発における実践的なシナリオを共有します。これはアルゴリズムに関する質問ではありません。これは実際、フロントエンド開発で使用できる知識ポイントです。具体的な実装コードは次のとおりです。以下に続きます:

/**
 
* @param {number[]} p 价格
 
* @return {number} r 最优解
 
*/
 
var maxOptimal = function(p) {
 
    var r = 0;
 
    for(var i=1;i<=p.length;i++){
 
        if(p[i]>p[i-1]){
 
            r = p[i] - p[i-1] + r;
 
        }
 
    }
 
    return r;
 
};

共有

今回はプログラマーに資格は必要かどうかについてお話します。この点については人によって意見が異なり、プログラマーの資格を得るには、しっかりしたプログラミングの基礎、豊富なプロジェクト経験、継続的な学習態度があれば十分だと考える人もいれば、プログラマーは専門資格を取得する必要があると考える人もいます。 . この方法によってのみ、自分が特定の専門的スキルと能力を持っていることを証明でき、より良い仕事の機会や給与を得ることができ、競争上の優位性を高めることもできます。

実際には、ほとんどの企業でプログラマーのキャリア開発には、専門知識、スキルレベル、プロジェクト経験など、多くの要素を考慮する必要があります。認定資格がプログラマのプロフェッショナリズムを測る方法の 1 つであることは間違いありませんが、それが唯一の方法ではありません。プログラマーが豊富なプロジェクト経験、優れたプログラミングスキル、新しい技術の継続的な学習を持っていれば、企業から認められ、キャリアアップの機会も得られます。

したがって、プログラマは検証に行ってもよいと個人的には考えていますが、それは必須の選択ではなく、すべてはプログラマ自身の実際の状況によって決まります。

結論

この記事を書いている時点では、私は 4 週目に快適に感じており、ARTS チェックイン学習モードに完全に適応しています。一般的に、私はこれら 4 つのことをそれぞれ勉強するために 1 週​​間の空き時間を使っています。この 4 つを 1 日ずつ勉強して、週の終わりにまとめをするというやり方もなかなか良いですね。4週目で、私が参加したARTS学習月間は終了となりますが、活動が終わって終わりではなく、このように毎週少しずつ自分を磨き、状態を維持していきたいと思います継続的な学習の継続、そして私自身も学び続けましょう。微妙な方法で継続的な進歩と成長!

おすすめ

転載: blog.csdn.net/CC1991_/article/details/133134430