プロが教えるわが家の防犯対策術!

struct S_Data
{
----char ID[16];
----char PW[16];
};
とし、
S_Data Data[100];
とします。

IDとPWを入力すると、100個のID・PW群からその組み合わせがあるかを検索し、その結果を返したいのですが、いい方法が思いつきません。

単純にやるとすれば、入力されたID、PWをそれぞれid、pwとすると
for( int i=0 ; i<100 ; i++ )
{
----if( strcmp(Data[i].ID,id) == 0 )
----{
--------if( strcmp(Data[i].PW,pw) == 0 )
--------{
------------return 1;
--------} else {
------------return -1;
--------}
----}
}
return 0;
とすればいいのですが、もっと簡単にやる(実行速度が速い)方法はないでしょうか?

A 回答 (4件)

検索が一回きりなら、提示の方法が一番早いでしょう。


相当回数検索するなら、ソートしてバイナリサーチとか。
使用される文字に制限があるなら、先頭文字の種類ごとに配列を分けるとか。
たとえば、IDがすべて数値なら、配列を10に分割できますよね。
ハッシュを使うという方法もありますが、100件くらいだと、効果はあまりないかもしれません。
    • good
    • 2
この回答へのお礼

ここにまとめてお礼を書かせていただきます。
皆さん、ありがとうございました。

ベストアンサーはmaru_yoshi_さんかtitokaniさんか迷ったのですが、
titokaniさんにさせていただきます。

構造体内にいろんな変数が合って配列の添え字で人を識別しようとしているので(こんな感じです)
struct S_Data
{
----int Num;
----char ID[16];
----char PW[16];
----int Month;
----int Day;
----int Type;
----float Time;
};
として、
IDとPWが合っていたらNumを返して(Numの値は配列の添え字と同じ)
以下例えば
printf( "100m走のタイムは%f\n",Data[10].Time);
のようにしたいのですが、データはランダムかつ不定期に増えるので、並び替えていると参照部が変わってきてしまうので並び替えは難しいです。
これ質問部に予め書くべきでしたね・・・・・・・

お礼日時:2012/03/29 08:14

目的に応じて


ハッシュを使うなり
~木を使うなり
書かれてるように単純に検索するなり
すればよいかと。
    • good
    • 0

データがソートされている等の保証がない限り、


これ以上実行速度をあげるためには、コードの可読性を犠牲にしなければ無理ですね。
    • good
    • 0

ランダムなデータから一致するものを探すなら総当たりしかないように思えます。


一定のルールに並んだデータから一致するものを探すならバイナリサーチでもいいでしょう。

構造体配列に入れられたデータから検索するのであっても、その構造体配列にデータを
いれる処理がどこかにあるはずなので、そのルールはわかっているはず。
それが分かっていれば、探索手順を短くすることも可能でしょう。
もしかすると、構造体配列に入れる際にいろいろな工夫をすることもできるかも。

いずれにせよ、検索そのものの時間コスト、検索の準備(ソートなど)の為のコストを見積もり、
トータルで性能を考える必要があります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています