自分で実装してみたアルゴリズムがあるのですが,もっと良い方法があれば教えてほしいです.以下はC++で実装してますが,PythonやFortranでの回答でも構いません.
N×N の対称行列のインデックスを(i,j)と書きます.i<N, j<N です.
ここで,適当な整数の入力ele ( <= (N-1)(N+2)/2 ) に対して,対称行列のi <= j を満たすインデックス(i,j)を対応させます.
たとえば N = 4 で入力が ele=3 の場合は,
[0,,,*]
[1,2,,]
[3,4,5,*]
[6,7,8,9]
なので,出力は(2,0),同じく,N = 4 で ele = 8 ならば,出力は(3,2) といった具体です.
自分が実装したコードは以下です.高校数学の群数列のアイディアを思い出して,n行目の最小がn*(n+3)/2 - n で最大が n*(n+3)/2 であることを使ってみました.皆さんだったらどう実装しますか?
C++
1 2tuple<int, int> get_mtx_idx(int ele, int N){ 3 4 /* 5 * ele map to index (i, j) of symmetric matrix 6 * [[ 0, *, *, *, *, *, *] 7 * [ 1, 2, *, *, *, *, *] 8 * [ 3, 4, 5, *, *, *, *] 9 * [ 6, 7, 8, 9, *, *, *] 10 * [10,11,12,13,14, *, *] 11 * [15,16,17,18,19,20, *] 12 * [21,22,23,24,25,26,27] 13 * 14 * min in n-th row is n*(n+3)/2 - n 15 * max in n-th row is n*(n+3)/2 16 * 17 * */ 18 19 for (int n = 0 ; n <= N; n++){ 20 if ( n * ( n+3 ) /2 - n <= ele and ele <= n * ( n+3 ) /2 ){ 21 int i = n; 22 int j = ele - n * ( n+3 )/2 + n; 23 24 return{i, j}; 25 26 } 27 } 28 29}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/25 07:57
2020/09/25 08:23
2020/09/25 11:12
2020/09/25 11:17