計算量について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
piro

計算量について

#1

投稿記事 by piro » 15年前

計算量の導出方法についての質問です。

添付しました”関数insertの最悪時間計算量を2分木の節点数nを用いたオーダ表記で示しなさい、
ただし、関数insertの引数nは35、36行目のように0から始まり、関数insertの実行の度に1ずつインクリメント
される”
、という問題で解法手順がわからずに困っています。

どなたかアドバイス、ご教授をしていただけるとありがたいです。
よろしくお願いします。

Poco

Re:計算量について

#2

投稿記事 by Poco » 15年前

insert関数が何をする関数か、理解されてますか?

piro

Re:計算量について

#3

投稿記事 by piro » 15年前

ぽこさん>

はい、insert関数は、引数である*Aのn番目にxの値を代入するという動作ですよね。
返り値は、nをインクリメントした値です。
それで、exhange関数は、大まかに言うと配列内の並びを適せつに並び替えるという処理をしていると
考えています。

Poco

Re:計算量について

#4

投稿記事 by Poco » 15年前

適切な並びとは、どういった状態ですか?

dic

Re:計算量について

#5

投稿記事 by dic » 15年前

木構増で詳しい内容を書いてください
http://ja.wikipedia.org/wiki/%E6%9C%A8% ... %E9%80%A0_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)

木構造にも種類があって、色々と回答が異なってきます

piro

Re:計算量について

#6

投稿記事 by piro » 15年前

ぽこさん>>
返信遅くなりすみません。
関数exchangeでは、左の節、右の節、左右共通の上位節を比較し、その後この3つの節で一番小さい値を所持している
節を左右共通の上位節の値と交換する、という処理を行います。

すなわち、左右共通の節<左の節、右の節というならびになるように並び替えていると考えています。

piro

Re:計算量について

#7

投稿記事 by piro » 15年前

dicさん>>

返信遅くなりましてすみません。
このプログラムは、2分木を実装しています。

よろしくお願いします。

Poco

Re:計算量について

#8

投稿記事 by Poco » 15年前

> 左右共通の節<左の節、右の節というならびになるように並び替えていると考えています。

そうですね。
加えて重要なのは、「全ての節で」その条件を満たさなければならないことです。
そのために、exchange()の中でexchnage()を呼んでいます。

それを踏まえた上で、新しい要素を木の末端に追加したたとき、この新しい要素は
最大でどこまで移動することが考えられますか?

#ちなみに、こういう性質をもった木をヒープ(二分)木といいます。

piro

Re:計算量について

#9

投稿記事 by piro » 15年前

ぽこさん>>

例1:
   2
  4  6
 5 7 8 9
 
このヒープ木の一番左のルートに1を追加するとき、3回ノード交換が行われます。

例2:
   2
  4  6
このヒープ木の一番左のルートに1を追加するとき、2回ノード交換が行われます。

これらの例から最大でn回ノード交換が行われると推測できます。
nは、新規ノードを追加する階層の場所を表わします。


このような考えでよろしいでしょうか?
よろしくお願いします。

Poco

Re:計算量について

#10

投稿記事 by Poco » 15年前

合っています。
では最後。
木の要素数nに対する木の階層dをnの式で表わしてください。
それが最大計算量のオーダとなります。

piro

Re:計算量について

#11

投稿記事 by piro » 15年前

ぽこさん>>

迅速な返信ありがとうございます。
完全2分木のノード数と階層の関係ならば、

n=2^(d+1) -1
ということを判断できるのですが・・・・

ヒープ木の場合は、完全2分木とは構造が異なるので、上記の式はヒープ木には当てはまりませんですよね?

Poco

Re:計算量について

#12

投稿記事 by Poco » 15年前

計算量のオーダの話なんで、細かい係数を考えなければヒープ木に当てはまりますよ。
なので、
n=2^dで良いと思います。
これをd=の式に変換すれば、求める計算量オーダが出ます。

piro

Re:計算量について

#13

投稿記事 by piro » 15年前

ぽこさん>>

返信遅くなりすみません。
ヒープ木にもあてはまるのですか。

では、d=log2(n)が今回の問題の最悪計算量となるのですね。

Poco

Re:計算量について

#14

投稿記事 by Poco » 15年前

> では、d=log2(n)が今回の問題の最悪計算量となるのですね。

そうなります。
思考の流れは、私とpiroさんのやりとりを参考にしてください。

----おまけ
n=2^(d+1) -1をdについて解くと、
d=log2(n+1)-1

となりますんで、dの計算量オーダーはO(log(n))となります。
#なので、オーダに関しては細かい係数は気にする必要はありません。

piro

Re:計算量について

#15

投稿記事 by piro » 15年前

単純に答えだけを教えるのでなく、1から考え方を教えてくださり本当にありがとうございます。
とてもわかりやすく、理解することができました。

色々ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る