東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

手荷物一時預かり

ネタ元はこちら→SQLで最小の空き番号を取得する方法

つまりはクロークのおねえさん。
荷物を預かるたびに番号札の若いものから渡し、
荷物と引き換えに番号札を回収する、と。
# 番号札は1からの連番で無限に持ってる、と。

こしらえてみました。

#include <set>

class cloak {
private:
  typedef std::set<int> tags_type;
  tags_type tags_;
public:
  cloak();
 ~cloak();
  // 次に配るはずの札
  int peek() const;
  // 札を配る
  int acquire();
  // 札を返却する(配った覚えのない札ならfalse)
  bool release(int n);
  // すべての札を返却する
  void clear(); 
  // 配った札一覧
  template<typename Iterator>
  Iterator acquired(Iterator out) const;
  // 返却された札一覧
  template<typename Iterator>
  Iterator released(Iterator out) const;
};

/*
 * ここにcloakの実装。な・い・しょ♪
 */

#include <iostream>
#include <iterator>
#include <cassert>

int main() {
  cloak c;
  assert( 1 == c.peek() );    // 次は1をくれるハズ
  assert( 1 == c.acquire() ); // 1をもらう
  assert( 2 == c.acquire() ); // 2をもらう
  assert( 3 == c.acquire() ); // 3をもらう
  assert( 4 == c.peek() );    // 4をくれる
  assert( c.release(2) );     // 2を返す
  assert( 2 == c.peek() );    // 次は2をくれるハズ
  assert( !c.release(2) );    // 2は返せない
  assert( !c.release(5) );    // 5も返せない
  assert(  c.release(1) );    // 1を返す
  assert( 1 == c.acquire() ); // 1をもらう
  std::ostream_iterator<int> out(std::cout," ");
  c.acquired(out);
  std::cout << std::endl;
  c.released(out);
  std::cout << std::endl;
}

# 誰かさんが腕試しネタを欲しがってるらしいのだな ^^;

投稿日時 : 2007年3月1日 0:38

コメントを追加

# 最小番号取得 2007/03/01 2:52 melt日記

最小番号取得

# re: 手荷物一時預かり 2007/03/01 11:01 2リットル

返却された札を覚えとく!
メモリの無駄?ですよねー。

# re: 手荷物一時預かり 2007/03/01 11:35 επιστημη

メモリ的には無駄です。

「無限にある手持ちの番号札から最小のもの」
あるいは
「渡した札(これは有限)に含まれない最小の札」
を可及的速やかに取り出すのに
「返却された札の集合」を使ってみますた。

"可及的速やかに"←ココ重要!
時間計算量が発行札数Nに比例するんじゃつまんねぇ。
O(logN)くらいには抑えたいなってゆー。

# re: 手荷物一時預かり 2007/03/01 13:07 とっちゃん

実質的な肝は、peek() の作り方かと。
#あとは全部そこを参考にできるw

おもしれー。

ちなみに、最後のリストアップですが、
1 3
2
が正解ですよね?

# re: 手荷物一時預かり 2007/03/01 13:07 2リットル

理由が「計算とかややこしいことは人様が作ったものに限る。」
から「返却された札の集合」を使うのとは雲泥の差ですね。

でもεπιστημη さんの方法に近かったなんて光栄です。

# re: 手荷物一時預かり 2007/03/01 13:19 επιστημη

> 実質的な肝は、peek() の作り方かと。

ちゅーことになりますか。

ちなみに {1, 3} と {2} でせーかいです。
要素の順番はどーでもいーでしょぉ。

>「返却された札の集合」を使うのとは雲泥の差ですね。

「返却された札の集合」がソートorヒープ状態に
なってれば最小のがさっくし拾えますんでねー。

# re: 手荷物一時預かり 2007/03/01 13:47 とっちゃん

>要素の順番はどーでもいーでしょぉ。

順序はどうでもよいかとw
単においらが小さい順に出しただけだしww

>可及的速やかに取り出すのに
>「返却された札の集合」を使ってみますた。

隙間がなければ、計算だけで割り出せるけど...
隙間ヒープ持ってないと速度上がらん...orz

# re: 手荷物一時預かり 2007/03/01 16:49 nagise

配った札は記憶してある前提ですよね?
配布済み札を2分木にして管理するのが素直なのかな。

# re: 手荷物一時預かり 2007/03/01 16:57 επιστημη

でしょうかねー。
配布済(返却待)札はrelease時に照合すんのと、
配る札がこの中にないことがわかればいい(やっぱり照合)ので、
とにかく検索が速けりゃなんだろが。
# 設計/実装次第でしょうけど。

# re: 手荷物一時預かり 2007/03/01 22:34 επιστημη

んでは僕の答案。
http://episteme.wankuma.com/archive/cloak.html

# クエスチョンにトライ(2) 2007/03/01 23:08 melt日記

クエスチョンにトライ(2)

# re: 手荷物一時預かり 2007/03/02 14:42 とっちゃん

オチ

どれくらいの時間で動くのかと、計測用にデータを10000程突っ込むようにmainを変更。
#この時点で assert( c.aquire() == n ); とループで追加w
10ステップずつrelease() して、10個ほどデータを再追加。

それまでずっとデバッグ版だったので、リリース版にして比較!
と思って動かしたら、見事データがからでしたとさw

ちょうどどこかで最適化でおかしくなるってのを見たばっかりだったので、チョーあせりましたよwww

タイトル
名前
URL
コメント