アルゴリズムで

[戻る]
てっちゃん 2003/09/23(火) 00:23:48
1次元配列dataとSTLのmultimap<int,int> mapがあり
data
0,2,3,4

map
key 
0   0,1,2,3,5,6
1   1,3,4,5,7
2   2,4,5,6
3   1,2
4   0,2,3,4,5

とあったとします
data 0,2,3,4がmapの中にあるかどうか判断したいのです
今自分で書いたプログラムは

int check(int *data ,multimap<int,int> &checkmap){
   multimap<int,int>::iterator itr;
   int size = checkmap_key;//上の例だと5が入ります
   for( int i=0; i < size; i++ ){
      itr = checkmap.lower_bound(i);
      for( int t=0; t < data_size ; t++ ){//上の例だと4が入ります
         if( data[t] == itr->second){
            if( (++itr)->first != i)
               return t;//みつかった
         }
      }
   }
   return -1;//みつからない
}

とkey0から4まで全部調べている状態です
あきらかに効率が悪いと思うのでもっと良い方法があるのではないかと思うのですがいいアルゴ
リズムはありますか?

επιστημη 2003/09/23(火) 12:13:56
keyに関係なく、multimapの中から特定のvalueを探し出すのでしょうか?
そういうことなら、

  int data[] = { 0, 2, 3, 4 }
  std::multimap<int,int> m;
  std::multimap<int,int>::iterator iter = m.begin();
  while ( iter != m.end() ) {
    if ( std::find(data, data+4, iter->second) ) {
      break; // 見つかった
    }
    ++iter;
  }

これでよくはないかしら。

サイファ 2003/09/23(火) 13:05:44
>if ( std::find(data, data+4, iter->second) ) {
+4なんて直に書いちゃよくないでしょ。

επιστημη 2003/09/23(火) 14:05:53
それがなにか? 
それはアルゴリズムの説明に不可欠でしょうか?

サイファ 2003/09/23(火) 14:53:27
不可欠とかの問題じゃないでしょ。
見本となる人がこの程度の事で手を抜いてどうするの?

επιστημη 2003/09/23(火) 16:59:40
この程度の事だから手を抜いたのですが。

僕には常に完璧な答が要求されているのですか?
そんなのまっぴらごめんです。

とおりすがり 2003/09/24(水) 00:11:44
επιστημηさんは、大げさな言い方をすれば、
日本の多くのプログラマの目標とされているわけです。
できれば、丁寧な対応をお願いしたいと思っております。
とくに、言葉遣いの面でも。
あおりのつもりはありません。私は、επιστημηさんを尊敬しております。
ただ、貴方が受け取っている印税は、ここに質問に来ている方々が払っているというの
も、また事実です。
よろしくお願いします。

NEG(ねぐ) [E-Mail] [HomePage] 2003/09/24(水) 01:10:50
>ただ、貴方が受け取っている印税は、ここに質問に来ている方々が払っているという>も、また事実です。

 印税は、ここでの回答で発生するわけではないので、、、
 その理由で「完璧な答」を求めるというのは無理があるかと思います。
<回答までの期間も短いだろうしねぇ。

επιστημη 2003/09/24(水) 01:40:40
> ただ、貴方が受け取っている印税は、ここに質問に来ている方々が
> 払っているというのも、また事実です。

なにが仰りたいのかサッパリわかりません。
僕の投稿が、僕もしくは僕の本を買っていただいた
方々に害をなすのでしょうか?

てっちゃん 2003/09/24(水) 02:33:05
[[解決]]
なんかすごいことになってますが・・・
ようは+4をsizeof(int)とでもすればいいことですよね
直に+4でも十分わかりますし考え方の問題なので、考え方が相手に伝わればいいと思います
僕も完璧な答え求めてませんし
επιστημηさんありがとうございました

てっちゃん 2003/09/24(水) 02:40:30
sizeof(int)じゃなくて要素数ですね
勘違いしてました

とおりすがり 2003/09/24(水) 03:11:15
誤解を招いたようなので、付け加えておきます。

まず、丁寧な対応をお願いしたいと思っているのは、
「とくに、言葉遣いについて」です。
回答そのものについては、επιστημηさんの回答が不備があるとは思っておりません。
サイファさんの発言後、
「そうですね。sizeof(data)/sizeof(data[0]) とでもしてください。」
と普通に対応していただければ、と思っております。

何度もすいません。個人攻撃の意図はまったくないです。
最近、技術系の掲示板が、初心者にやさしくなくなっていると感じておりまして。
影響力のある方が率先して改革していただけないかという期待をこめております。

> ただ、貴方が受け取っている印税は、ここに質問に来ている方々が
> 払っているというのも、また事実です。
これについては、申し訳ありません。ちょっと強すぎました。
ここに来ておられる方々は、みなεπιστημηさんの潜在的なお客様なので、、、
といった意味でしたが、余計なお世話ですね。すいません。

とおりすがり 2003/09/24(水) 03:22:45
さらに、誤解を招きそうなので、もう一度補足です。

>これについては、申し訳ありません。ちょっと強すぎました。
>ここに来ておられる方々は、みなεπιστημηさんの潜在的なお客様なので、、、
丁寧な対応をされたほうがお互い気持ちいいですし、
これからの本の売り上げも伸びて、みんなハッピーになれそうです。
ということです。

ただ、この部分は、本当に余計なお世話だと自分でも感じるので、無視してください。
申し訳ありません。

επιστημη [HomePage] 2003/09/24(水) 09:23:42
> サイファさんの発言後、
> 「そうですね。sizeof(data)/sizeof(data[0]) とでもしてください。」
> と普通に対応していただければ、と思っております。

なんでそれを僕'だけ'に振るかなぁ。

サイファ氏が単に
> +4なんて直に書いちゃよくないでしょ。

で済ませたことに対しては文句ナシ、と。 それが普通の対応だ、と。

僕が質問の主旨とは何の関係もない(だからこそ手を抜いた)
部分についても懇切丁寧にフォローしろ、と。

PAI 2003/09/24(水) 15:58:07
サイファさんがたとえば
『+4 とするより、sizeof 等を使用すべきですよね。』
といったように、ちゃんと『補足』してれば何の問題も無かった。


・・・皮肉って言うなら
『+4なんて直に書いちゃよくないでしょ。』なんて直に書いちゃよくないでしょ。


『見本となる人が』っていうフレーズがあるけど、
つまりは『自分は見本になるつもりは無い、オマエは見本なんだからしっかりやれ』と

考え方がそこらへんにたくさんいらっしゃる『初心者さん』たちと一緒では?

επιστημη [HomePage] 2003/09/24(水) 16:18:28
今更ながらにバグ見っけ^^;

>  int data[] = { 0, 2, 3, 4 }
>  ...
>    if ( std::find(data, data+4, iter->second) ) {

ごめんなさい、マチガイです。

  const size_t N = 4;
  int data[N] = { 0, 2, 3, 4 }
  ...
    if ( std::find(data, data+N, iter->second) != data+N ) {

επιστημη [HomePage] 2003/09/24(水) 16:20:56
こんな重大なミスにはツッコミひとつ入れないのね...

古いスレッドには追加発言できません。