問題:文字列の配列を指定して、アナグラムをグループ化します。次の配列があるとします。['now']]一見すると、これは単純な比較の問題のように見えます。素朴なアルゴリズムは、すべての文字列を他のすべての文字列と比較し、それらが互いにアナグラムである場合は同じバケットに入れます。素朴なアルゴリズムの複雑さは何ですか?Cが文字列の平均の長さであり、Nが文字列の総数である場合、このアルゴリズムの複雑さはO(CN2)です。これは、すべての文字列間の比較がO(C)時間で実行でき、O(N2)文字列ペアがあるためです。洞察を深めると、より効率的なハッシュベースのアルゴリズムが得られます。すべての文字列のハッシュ関数を計算します。お互いのアナグラムである文字列が同じハッシュ関数を持ち、お互いのアナグラムではない文字列が異なるハッシュ関数を持つように、ハッシュ関数を慎重に選択する必要があります。ハッシュ関数も効率的に計算できる必要があります。ハッシュ関数を計算した後、ハッシュ関数をunordered_mapキーとして文字列を挿入します。ハッシュ関数が十分に優れている場合、構築されたunordered_mapには、アナグラムを含むすべての適切なバケットが含まれます。ハッシュ関数と素因数分解からaまでのすべての文字に一意の素数を割り当てzます。構築プライム分解与えられた文字列のを:すべての文字C1について、文字列に出現する回数X1を見つけます。P(C1)をC1に関連付けられた素数とします。P(C1)^X1を計算します必要なハッシュ関数は、すべての文字に対して計算されたこれらすべてのP(C1)^X1量の積になります。これは、ハッシュ関数を使用して文字列をバケット化する簡単なアルゴリズムです。長所:ハッシュ関数は計算が簡単で効率的です。O(C)時間がかかり、一定のスペースが必要です(ここCで、は文字列の文字数です)。ハッシュ関数は優れています。数学の基本定理は、素因数分解が文字列内のすべての文字の頻度のみに依存し、それらの位置には依存しないことを保証します。その結果、アナグラムのハッシュ関数値は同じになります。非アナグラムは、異なるハッシュ値を持つことが保証されています。アルゴリズム全体がO(NC)時間内に実行され、O(NC)スペースを取ります。ここNで、は文字列の総数、は文字列Cの平均サイズです。このハッシュ関数の最大の欠点は整数オーバーフローです。longは、64ビットを占有します。(一部の最新のアーキテクチャには、より多くのビットがあります)。マップの最大の素数は101(文字に対応z)です。上で定義されたハッシュ関数は透過的であり、コードを読む人は誰でも簡単に理解できるはずです。++言語のサポートを使用し、ハッシュ関数の計算を標準ライブラリに委任します。使用しますboost::hash_combine。一般的な考え方は次のとおりです。整数または長整数の代わりに、std::arrayのキーとして26要素を使用しunordered_mapます。上記の定義は機能しますか?残念ながら、配列型にはデフォルトのハッシュ関数が定義されていないため、外部から補足する必要があります。見ると、にstd::unordered_mapは3番目のテンプレート引数があり、ハッシュ関数として任意の値をstd::function返すことができsize_tます。正しいハッシュ関数とマップタイプを定義すると、マップの挿入と反復は上記の関数と同じになります。長所:以前のアルゴリズムとは異なり、独自のハッシュ関数を発明する必要はありません。これは、問題のドメイン知識がない場合、または基本定理のような数学的特性を認識していない場合に特に役立ちます。このアルゴリズムは、前のアルゴリズムと同様に、O(NC)時間内に実行され、O(NC)スペースを取ります。ここNで、は文字列の総数、は文字列Cの平均サイズです。ここでのハッシュ関数は不透明であり、それがboost::combineどのように機能するかを理解するために定義を深く掘り下げる必要があります。ハッシュの衝突も特徴づけるのが難しいです。私たちは、使用する機会持っているUnorderedElementsAreとAnyOfのマッチャーGUnitを。アドレスに変換し、コンピュータが接続できるようにします。私がどのようにして口笛の世界チャンピオンになったのか何かを読む前にこれを見てください。それは、ホテル・カリフォルニアに向けてギター・ソロをまったくのワルのように口笛で吹いている私です(マンバンは無視してください。コロナ禍の最中でしたので、彼らが何をしているのか誰も知りませんでした、特に私です!)。関連記事JARMとPythonを使用したSSLサーバーのフィンガープリントPythonでJARMを使用する簡単な方法であるpyJARMの紹介2020年11月初旬、SalesForceは、説明のつかないJARMという名前の新しいアクティブなTLSフィンガープリントツールを発表しました。JARMの前提は、ターゲットサーバーがさまざまなカスタムクラフトのTCP「Clienthello」パケットを使用してスキャンされた場合、結果の応答を組み合わせてハッシュし、共有または類似のアプリケーションまたはサーバーを示すフィンガープリントを提供できることです。優れた開発者を作る非技術的なこと私はこの記事を書くのをしばらく延期してきました—私はそれを書く資格があるとはまったく感じませんでした。今日はそれを書く時だと思いました。技術面接の社会的要素に取り組むコーディングの課題はストレスがたまりますが、ストレスに対するあなたの反応は、これまでの技術スキルよりも雄弁です。テクノロジー業界でのポジションについて面接する場合、通常、オファーが検討される前に、少なくとも3回の面接を行います。ラウンドは通常次のようになります:あなたがそれを考えるなら、あなたは間違っています。Programmerは1999年に最初に出版されて以来、史上最高のプログラミング本に選ばれています。Manifestoの最初の著者の一人であり、いくつかの真剣な資格を持っています。