1次元配列を使用するだけで、スペースを節約し、アクセス時間に若干の変更があるかもしれませんが、高速であるかどうかにかかわらず、おそらくコンパイラと言語に依存します。
私はQtの中ですぐにこのソリューションを書きましたが、STLのC++または他の言語に変換するのは簡単でなければなりません:
#include <QVector>
#include <QDebug>
#include <QString>
class MirroredArray
{
public:
MirroredArray(int sideLength)
{
values.fill(0, sideLength*(sideLength+1)/2);
this->s = sideLength;
}
int get(int r, int c)
{
if(c > r)
{
return values.at(s*r-(r-1)*r/2 + c-r);
}
else
{
return values.at(s*c-(c-1)*c/2 + r-c);
}
}
void set(int r, int c, int value)
{
if(c > r)
{
values[s*r-(r-1)*r/2 + c-r] = value;
}
else
{
values[s*c-(c-1)*c/2 + r-c] = value;
}
}
int getSide()
{
return s;
}
QString contentsToString()
{
QString temp = "(" + QString::number(values.size()) + ") - ";
for(int i = 0; i<values.size(); i++)
temp += QString::number(i) + ", ";
return temp;
}
private:
QVector <int> values;
int s;
};
注:このコードは、あなたが渡していることを確認するすべてのエラーを行いません。有効な行と列の値。
ありがとう! 1次元配列の問題は、十分な大きさのデータセットで作業しており、割り当ての単一のチャンクが失敗する可能性が高いことです。しかし、私はこれを多次元配列に適応させることができます。 – sooniln
これを導出するときは、この式を使用して再利用します.1からnの合計はn *(n + 1)/ 2です。コールを見ると、n = m-1を設定し、(m-1)* m/2を1からm-1の合計として取得するようなバリエーションがあります。 [1からNまでの整数をまとめる方法](http://www.wikihow.com/Sum-the-Integers-from-1-to-N)も参照してください。 – phyatt