内線番号の桁数が会社ごとに異なる可能性があり、数字の桁数が国や市外局番ごとに異なる可能性があることを考えると、これを効率的に行うのは難しい問題です。
データ テーブルを基数と内線番号に分割したとしても、受信番号を基数と内線番号に分割する必要があり、実際には複雑になっていると思います。
私が試してみたいことは次のとおりです。
元のフォーマット
- 着信番号をデータベースと照合してみてください。
- 1 つのレコードに一致する場合は、特定の人物という答えが得られます。
- 複数のレコードに一致する場合は、何か問題が発生しているため、失敗します。
- それ以外の場合は、会社を見つける必要があります。
- 着信番号から末尾の数字を取り除き、これをデータベースと再度照合してください。
- 桁数がしきい値 (おそらく 6 桁) を下回った場合、検索はおそらく失敗するはずです。これは、番号が見つからない場合に実行されるデータベース検索の数を制限するためです。
- 一致するレコードがない場合は、この手順を再試行する必要があります。
- 複数のレコードに一致する場合は、何か問題が発生しているため、失敗します。
- 一致するレコードが 1 つだけの場合は、次善の回答である会社が得られます。
たとえば、「+43123456777」を検索する場合:
- +43123456777 は 0 エントリに一致します。
- +4312345677 は 0 エントリに一致します。
- +431234567 は 1 つのエントリに一致します: 「会社 A」
このアプローチの主な失敗モードは、会社が可変長の内線番号を持っている場合です。たとえば、431234567890 と 43123456789 の両方が有効な数値であるが、2 番目の数値のみがデータベースにある場合に何が起こるかを考えてみましょう。着信番号が 431234567890 の場合、43123456789 が誤って一致します。
分割形式
これはもう少し複雑ですが、より堅牢です。
- 着信番号をデータベースと照合してみてください。
- 1 つのレコードに一致する場合、答えは会社です。
- 複数のレコードに一致する場合は、拡張子のないエントリと一致し、会社が見つかりました。
- それ以外の場合は、基本の会社番号と内線番号を見つける必要があります。
- 着信番号から末尾の数字を取り除き、これをデータベースと再度照合してください。
- 桁数がしきい値 (おそらく 6 桁) を下回った場合、検索はおそらく失敗するはずです。これは、番号が見つからない場合に実行されるデータベース検索の数を制限するためです。
- 一致するレコードがない場合は、この手順を再試行する必要があります。
- それが 1 つのレコードと一致する場合、答えは会社です。
- 複数のレコードに一致する場合は、会社の基本番号が見つかったので、内線番号がわかったので、特定の人を検索してみることができます。
- 元の着信番号の先頭から基数を取り除き、これを使用してその基数を持つレコードの拡張を検索します。
- 正確に 1 つのレコードに一致する場合は、特定の人が見つかりました。
- 特定の人物と一致しない場合は、拡張子のないエントリと一致すると、その会社が見つかりました。
たとえば、「+43123456777」を検索する場合:
- +43123456777 は 0 エントリに一致します。
- +4312345677 は 0 エントリに一致します。
- +431234567 は、「empty:Company A」と「890:employee in company A」の 2 つのエントリに一致します。
- これら 2 つの一致の中で、"77" は何も一致しないため、空の拡張子 "Company A" を返します。
実装に関する注意事項
前述のように、このアルゴリズムにはいくつかの効率上の問題があります。データベース ルックアップが高価な場合、特にデータベースに同様の番号が存在しない場合 (たとえば、着信番号がカザフスタンからのものであるが、カザフスタンがない場合)、電話番号の長さに関連する線形コストが発生します。データベース内の数字 *8')。
ただし、いくつかの最適化を比較的簡単に追加できます。扱う企業のほとんどが 3 桁または 4 桁の内線番号を使用している場合は、最初に末尾の 4 桁を削除してから、答えが出るまでバイナリ チョップを行うことができます。これにより、多くの場合、15 桁の数字が 4 または 5 に減少し、最大で 6 回のルックアップになります。
また、選択を絞り込むたびに、データベース全体から選択するのではなく、前の選択からのみ選択することができます。
追加の実装メモ
Unreasonの答えがどのように機能するかを最終的に理解したので、それがはるかにシンプルでエレガントなソリューションであることがわかります. 着信番号でデータベース番号を探すのではなく、単純にデータベース番号を探すという単純さについて考えてみたいと思います。
私の唯一の懸念はtelephonenumber
、データベース内のすべてでこれを実行すると、サーバーに過度の要求が課される可能性があることです。そのソリューションを最大のストレス下でベンチマークし、問題が発生するかどうかを確認することをお勧めします。そうでない場合は、それを使用してください。その場合は、単純な形式のアルゴリズムを実装して、ストレス テストを再度実行することを検討してください。それでもパフォーマンスが低すぎる場合は、二分探索の提案を試してください。