- ベストアンサー
経路探索の問題
http://www.i.u-tokyo.ac.jp/edu/course/m-i/pdf/2002imim.pdf の、問題3について質問なのですが、 問1は、 (1) 線形リストとして、n回で到達できるセルの情報を与えると、n+1回で到達できる線形リストを返す関数を考える。返すリストの作成方法は、n回で到達できるセルの前後左右を調べて、すでに調べたセルや障害物のセルでなければ、そのセルをn+1回で到達できるセルとしてメモし、返す線形リストに追加する。 (2) int l[M][N];//特定のセルまでの距離をメモする配列。最初にすべて-1をいれておく。障害物には-2を入れておく。 class list{ int i,j; list *next; list(){ next=0; } } //n回で到達できるセルのリストをpl、n+1階で到達できるセルのリストを返すポインタをnlとする。 void getNextCellsList(list *pl,list *nl){ list *tt=pl; list *t; int i,j; nl=0; while(tt){ i=tt->i; j=tt->j; if(i>0&&l[i-1][j]==-1){ l[i-1][j]=l[i][j]+1; t=nl; nl=new list; nl->i=i-1; nl->j=j; nl->next=t; } if(j>0&&l[i][j-1]==-1){ l[i][j-1]=l[i][j]+1; t=nl; nl=new list; nl->i=i; nl->j=j-1; nl->next=t; } if(i<M-1&&l[i+1][j]==-1){ l[i+1][j]=l[i][j]+1; t=nl; nl=new list; nl->i=i+1; nl->j=j; nl->next=t; } if(j<N-1&&l[i][j+1]==-1){ l[i][j+1]=l[i][j]+1; t=nl; nl=new list; nl->i=i; nl->j=j+1; nl->next=t; } tt=tt->next; } } と、したのですが、このgetNextCellsList関数を一回使う時間計算量は、O(n)としていいのでしょうか? また、もしそうなら問2の時間計算量は、 (getNextCellsList関数を一回使う時間計算量)*M*N=O(n)*O(n^2)=O(n^3) 空間計算量は、 (セルまでの距離をメモする配列の数)+(n回で到達できるセルの情報)=O(n^2)+O(n)=O(n^2) となるのでしょうか? あと、この問題の(M,N,D)のオーダーで評価せよというのはどういう意味として捉えればいいのでしょうか?O(n^3)などと書いておくだけで良いのでしょうか? 問3の時間的及び空間的に効率化する方策としてはどのようなものが考えられるのでしょうか?これは、自力では全然ろくな方法が思い付きませんでした。。。 宜しくお願いします。
お礼
なるほど、確かにそうすれば解が出ますね。 どうも有り難うございました。