私は、MySQLデータベースとインターフェイスする電子メールアプリケーションを作成しています。私は自分のデータをソーシングしている2つのテーブルを持っていますが、そのうちの1つはサブスクリプションを含み、もう1つは標準ユーザーテーブルです。今のところ、私は電子メールオブジェクトへのポインタのベクトルを作成し、最初にその中に登録されていないすべての電子メールを格納しています。私は標準のSQLループを持っています。そこでは、電子メールが購読中止ベクトルにないかどうかを確認してから、それをグローバルな電子メール送信ベクトルに追加します。私の質問は、これを行うより効率的な方法がありますか?私はシステム内のすべての電子メールに対してunsubベクトルを検索しなければなりません。検索のためのより良い構造はありますか?そして、ユニークな値のコレクションを維持するためのより良い構造ですか?おそらくすでに値が入っていれば単にその値を破棄するのでしょうか?最速のC++コンテナ:ユニークな値
答えて
C++標準ライブラリの実装でサポートされている場合は、std::unordered_set
またはstd::hash_set
を使用することを検討してください。
オーバーヘッドは高くなる可能性がありますが(オブジェクトのハッシュを生成するコストとオブジェクトの2つを数回比較するコストによります)、std::set
を使用することもできます。
set
またはunordered_set
のようなノードベースのコンテナを使用する場合は、vector
からの削除と比較して要素の削除が比較的安価であるという利点もあります。
'std :: unordered_set'または' std :: tr1 :: unordered_set'を意味すると思います。 –
また、 'std :: hash_set'は標準の一部ではありません。もし' boost :: unordered_set' TR1またはC++ 0xを持たない。 –
@エヴァン:そうです。私は 'std :: unordered_set'を意味しました。私は今朝コーヒーを飲みませんでした。ほとんどの標準ライブラリの実装は、ある形式か別の形式で 'hash_set'を提供します。 –
std::set
にメールアドレスを保存するか、std::set_difference()
を使用してください。
+1の 'set_difference'(ベーキングされているため)ですが、トラバースする方が速いはずです(より良いメモリのローカリティ)ので、セットではなく3つの(ソートされた)ベクタを使うことをお勧めします。また、サイズが大きく、Dirkumware(およびその小さなバケツ)を使用していない場合、 'deque'も考慮に入れることができます。 –
@Matthieu: 'set_difference'を使うときはもちろん、ソートされたベクトルを使います。ほかに何か? –
ノードベースのコンテナは痛いほど遅くなることがあります。 –
このようなタスク(操作の設定)は、それらを実行するためには何が重要なのでしょうか?
など。線に沿って何か:
SELECT email FROM all_emails_table e WHERE NOT EXISTS ( SELECT 1 FROM unsubscribed u where e.email=u.email )
あなたがアルゴリズムをしたい場合は、電子メールのリストとORDEREDリストなどunsubscriptionsのリストの両方を取得することにより、高速、これを行うことができます。それから、あなたは電子メールリスト(注文されています)を通過することができます。そうすれば、登録解除リストを滑らせることができます。あなたの現在の要素のようなO(M * N)の代わりにO(M + N)である
あなたはサブスクライブされていない電子メールアドレスから1にマップするハッシュマップを実行します。次に、
find()
をコールして、適切なハッシュ実装が正しいかどうかを調べます。 残念ながら、C++ではハッシュマップ標準はありません。 this SO question for existing implementations(アイデアのカップルSGIのSTL hash_mapとブーストおよび/またはTR1std::tr1::unordered_map
がある)その記事のコメントの一つは、それが標準に追加されますを示しています。C++標準ライブラリテクニカルレポート、「これを念頭に置いて導入されたハッシュテーブルを使用して実装されている、と彼らは今、C++標準の草案に追加された順不同連想コンテナ、。」
残念ながら、テーブルの1つが以前にレイアウトされていたため、私のアプリケーションの一部ではできません。 – Josh
@ Josh:あなたのスキーマの関連部分を投稿しますか?登録されていない電子メールのために別のテーブルがありますか? –
LEFT OUTER JOINを使用してみませんか? '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ –
これを行うための最善の方法は、MySQL内にある、私は思います。ユーザーテーブルのスキーマは、別の列、BIT
の列を使用して変更することができます。さらに良い方法:デフォルトの値がNULL
の "date deleted"の列にDATETIME
を追加する。
BIT
列を使用して、クエリのようなものになった場合:DATETIME
列を使用している場合
SELECT * FROM `users` WHERE `unsubscribed` <> 0b1;
、クエリが何かのようになり:
SELECT * FROM `users` WHERE `date_unsubscribed` IS NULL;
また、ユーザーを退会させています。現在のスキーマはメールアドレスの登録を解除しますが、これはまったく同じことではありません。ユーザーが自分のメールアドレスを登録解除されているメールアドレスに変更した場合、メッセージの受信を停止する必要がありますか? OPのアプローチは「はい」と言いますが、これは「いいえ」と言いますが、これは正しい回答である可能性が高いと思います。 –
- 1. デキューのユニークな値の最大数を計算する最速の方法
- 2. 高速でユニークな値に関数を適用するR
- 3. ユニークな値
- 4. ユニークな値のルーピング
- 5. SQLのユニークな値
- 6. ユニークな値のpython
- 7. mysqlのユニークな最新エントリ
- 8. 最高のユニークなヒット
- 9. ユニークなJMSMessageIDの最大サイズ
- 10. JavaのListからユニークなデータを集める最速の方法
- 11. C#HashSet <T>とDictionary <K,V>のような高速C++コンテナ?
- 12. ベクトル上のユニークなアルゴリズムC++
- 13. 最速C/C++、画像リサイズのライブラリ
- 14. Dataframe Python Pandasのユニークな値
- 15. javascriptハッシュのユニークな値
- 16. MySQLデータベースのユニークな値
- 17. ユニークな値INSERT INTO mysqlの
- 18. Sencha Touchストアのユニークな値
- 19. ユニークな要素の値
- 20. C++の戻り値とオブジェクトへのユニークなポインタの返り方
- 21. C++ 11/14ユニークなポインタではないユニークなポインタですか?
- 22. 明示ユニークなハンドルモダンC++
- 23. 最速(最速)のMacテキストエディタ
- 24. elasticsearch 5.0返り、ユニークな値
- 25. 挿入し、ユニークな値
- 26. C++ STLコンテナのパフォーマンス。構造体の高速化または構造体なしの高速化
- 27. ユニークなクラスをマッピングし、値からサブクラスを抽出するC++
- 28. C#DataTableフィルター最速の方法
- 29. リストのユニーク化(C#)
- 30. Android加速度計の最大値
DVKとダニエルTrebbienが正しい:それはほとんどです確かにDBでこれを行うより良い。これが不可能だと私はあなたを信じていません - スキーマの関連部分を投稿してください。 –
ユーザがメールを受信したいかどうかをチェックする前に電子メールを生成するのはなぜですか?あなたはここで特別な仕事をしています... –
@Matthieu:私は電子メールのコンテンツを生成していない、私は相互参照の電子メールアドレスを収集しています。 – Josh