• ベストアンサー

関数の実行速度の改善

S117の回答

  • ベストアンサー
  • S117
  • ベストアンサー率40% (18/45)
回答No.1

リスト構造なのでとりあえず挿入そのものはO(1)ですが、挿入位置を探すのに頭からたどっているのでO(N)になりますね。 すぐに思いつくものとしては2分探索木でしょう。 http://ja.wikipedia.org/wiki/2%E5%88%86%E6%8E%A2%E7%B4%A2%E6%9C%A8 この場合、O(log N)が期待できます。

coronalith
質問者

お礼

なるほど、有り難うございました

関連するQ&A

  • 分布関数の表記

    http://www.i.u-tokyo.ac.jp/edu/entra/pdf/archive/02math-j.pdf の第3問(3)について質問なのですが、P{Z_i=1}=μ/nという表現の{}の部分は、いったいどの様な意味を表しているのでしょうか? また、P{M=k}は、Mの分布関数P{M=k}という表現で使用されている部分があるので、変数Mを持つ分布関数PのMの値がkのとき、という解釈でいいのでしょうか?

  • fread関数の使い方がわかりません。

    以下のプログラムで試しているのですが、コンパイルはできても各配列の要素が表示されません。なぜなんでしょうか? #include<stdio.h> main() { FILE *fp; int i,b[10]; char a[10]; gets[a]; //ファイル名を指定 fp = fopen(a,"rb"); //バイナリモードでオープン fread(b,3,10,fp);   //配列に3byteづつ書き込んだつもり for(i=0;i>=9;i++){ printf("%02x\n",b[i]); //この部分の表示がされない。 } fclose(fp); } レベルの低い質問ですいませんがよろしくお願いします。

  • 降順・昇順のやり方(初心者)

    現在VB2005を学んでいます。 2次元配列(要素数:10,10)で、それぞれに数字の値を入れておき、特定の列に対して降順・昇順処理をしたいと思っています。そしてそれに合わせて全体の行も入れ替えるようにします。 本当は、構造体配列等でDataGridを使って処理すれば簡単にいくのでしょうが、敢えてそれを2次元配列を使って、並び替えたものをTextBoxに表示したいのですが、中々上手くいきません。 取りあえず、配列の特定の列の値を降順・昇順に並び替えて表示させるという処理だけでも分かるといいのですが、何か良い方法はないでしょうか?

  • 配列要素の並べ替え

    $Res[$i]という配列に、数字の要素が入っているんですが、それを昇順で並べ替えして要素の間に/を入れたいのですが、 foreach (sort {$a cmp $b} keys %Res) { $Res2 = $Res[$i] + "/" } どうもこの記述では上手くいかないので、どなたか教えて下さい!!

    • ベストアンサー
    • Perl
  • 配列 隣の要素を参照するのですが

    最初に 8つの要素を持つint型の配列(配列名dat)があるとして、最初全要素に「0」が代入されています。scanf関数でn番の要素に「1」が代入されたとします。n番なのでどこに「1」が代入されたかはわからないです。 問題 for文を使用して何番目に「1」が入力されたかを調べますが、以下のルールに従がわなくてなならいです。 ルール ・現在の要素から隣の要素を参照しなくてはいけない。 ・参照する範囲は要素の数「0~7」番 #include<stdio.h> void main() { int i, dat[8]; for(i=0;i<8;i++){ dat[i]=0; } i=0; scanf("%d",&i); dat[i] = 1; for(i=0;i<8;i++){ if(dat[i+1] == 1){print("%d列目に「1」がありました", i+1); } } でも…こうすると0番目の要素が参照されないですそれを回避するには?そして… 最大の要素(dat[7])にきたときは隣を参照しないようにするにはどうすればよいのでしょう?

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

  • 非常にはずかしい質問ですが 配列の質問です。

    C言語の勉強で時間が経つごとに、肝心の基礎が忘れがちになるのですよね。 それに、配列に対しての説明ってほとんど文字列ばかりで整数はみつからないです。 今回の質問は ・int型配列の要素ひとつずつ代入するにはどうするか? ・同じ数字を代入させないにはどうするか? ・配列中n個の要素を表示させるにはどうするのか? 条件 1、配列の要素はn個 2、同じ数は× 一応かいてみました。 { int buffer[6], i, j, signal ; srand((unsigned int)time(NULL)); for( i = 0 ; i < 6 ; i++){ buffer[i] = rand()%42+1; for( signal = 0 , j = 0 ; j < i ; j++ ){ if(buffer[i] == buffer[j]){signal = 1; break;} } if(signal == 0){break;} } printf("%d\n",buffer);

  • 構造体配列のクイックソート

    こんにちわ。 構造体配列のリストを ポインタのつなぎ変えによるクイックソートで 以下のようなソートをしたいのですが、悩んでおります。 struct info { int count; struct info *prev; struct info *next; }; int main () { struct info info[5]; /* 初期値設定 */ quick_sort(info, 0, 5); return 0; } 上記のようにして、クイックソートをしたいのですが、 よくあるクイックソートだと 例えば初期値を <配列のindex>要素の値を <0> <1> <2> <3> <4> 5 1 4 3 2 などと定義した場合 普通のクイックソートだと <0> <1> <2> <3> <4> 1 2 3 4 5 というように並び変えられてしまい <配列のindex>と 要素の値の組み合わせが変わってしまいますが、 この組み合わせを変えず、 struct info *if; if = info; for (i=0; i<MAX; i++){ printf("%d", if->count); if = if->next; } printf("\n"); とすることで、indexとしては昇順になっていないが *nextをたどっていくことでちゃんと目的の値の昇順になっている というのを実現したいのですが、ポインタのつなぎ変えか何かが 間違っているようで うまいことできていません。 どなたかご教授いただけますでしょうか。 申し訳ありませんが、よろしウお願いいたします。

  • MYSQLについて教えてください!

    お世話になります。 VB.net+MYSQLで開発してます。 MYSQLで聞きたいことがあるのですが、 今やろうとしている処理が 配列の要素数分ループ処理でインサートしようとしています。 しかし書き方が悪いのか配列名(カウンタ)という記述だと Functionに見られてしまいます。 それならと配列の要素を変数に代入して INSERTには変数をあてているのですが 変数が展開されません。。。 PHPとかだと変数の前に「.$」をつけると出来ると書いてあったのですが VBにも特殊なルールがあるのでしょうか? 以上よろしくお願いします。 以下サンプルソースです。(接続等はぶいてますが接続はできてます) Dim a As String Dim sqlstr As String Dim sqlcommand As Odbc.OdbcCommand for i as Integer = 0 to uBound(data_array) '初期化 a = "" '変数に値を設定 a = data_array(i) 'SQL文字列の設定 sqlstr = "insert into test( col_1 )" + _ "values(a);" sqlcommand.CommandText = sqlstr sqlcommand.ExecuteNonQuery() next

  • ポインタと {   } の関係とは

    戻り値が配列(ポインタ)で返す関数を二つ作りif文で選択できるようにしたら 各要素の値がうまく表示されません。 最初に配列の各要素に自分で値を代入するか、ランダムに値を代入させるか決めて、代入させた配列を最後に表示させたいわけです。 #include <stdio.h> int RegistData(int *); int RandomData(int *, int); void main(){ int mous[6]; int select; printf("自分で表示入力するときは1を、コンピュータに任せるときは0を入力してください。"); scanf(" %d", &select); if(select == 0){  *mous = RandomData(mous); }else if(select == 1){ *mous = RegistData(mous); } for( i = 0 ; i < 6 ; i++) printf("%d ", mous[i]); } printf("\n"); } RandomData(int *mous) { //rand()関数でランダムに各要素に値を代入する処理をします。 return *mous; } RegistData(int *mous) { //自分で要素に値を代入する処理をします。 return *mous; } ちなみに、あらかじめ要素に値を入れておくと正常にうごきます。 int mous[6] = { 10, 15, 12, 23, 33, 42};//動作確認用表示